- cube.vs******************
-
- #version 330 core
- layout (location = 0) in vec3 aPos;
- layout (location =1 ) in vec3 aNormal;
- layout (location=2) in vec2 aTexCoords;
-
- out vec3 FragPos;
- out vec3 Normal;
- out vec2 TexCoords;
-
- uniform mat4 model;
- uniform mat4 view;
- uniform mat4 projection;
-
- void main()
- {
- FragPos=vec3(model*vec4(aPos,1.0));
- Normal=mat3(transpose(inverse(model)))*aNormal;
- TexCoords=aTexCoords;
- gl_Position = projection * view * vec4(FragPos, 1.0);
- }
-
-
- cube.fs******************
- #version 330 core
- out vec4 FragColor;
-
- in vec3 Normal;
- in vec3 FragPos;
-
- struct Material {
- sampler2D diffuse;
- sampler2D specular;
- float shininess;
- };
- in vec2 TexCoords;
- struct Light {
- vec3 direction;
- vec3 ambient;
- vec3 diffuse;
- vec3 specular;
- };
- uniform Material material;
- uniform Light light;
- uniform vec3 objectColor;
- uniform vec3 lightColor;
- uniform vec3 lightPos;
- uniform vec3 viewPos;
-
- void main()
- {
- //ambient
- vec3 ambient=vec3(0.1)*light.ambient*vec3(texture(material.diffuse,TexCoords));
-
- //diffuse
- vec3 norm=normalize(Normal);
- vec3 lightDir=normalize(-light.direction);//光的方向向量是光源位置向量与片段位置向量之间的向量差。
- //对norm和lightDir向量进行点乘,计算光源对当前片段实际的漫反射影响
- //两个向量之间的角度越大,漫反射分量就会越小,点乘的几何意义也如此
- float diff=max(dot(norm,lightDir),0.0);
- vec3 diffuse=light.diffuse*diff*vec3(texture(material.diffuse,TexCoords));
-
-
- //specular
- //漫反射是光源指向片段位置。现在这个是摄像机指向片段位置
- vec3 viewDir=normalize(viewPos-FragPos);
- vec3 reflectDir=reflect(-lightDir,norm);//reflect第一个参数就是要片段指向摄像机位置
- float spec=pow(max(dot(viewDir,reflectDir),0.0),material.shininess);
- vec3 specular=light.specular*spec*vec3(texture(material.specular,TexCoords));
-
-
- vec3 result=ambient+diffuse+specular;
- FragColor = vec4(result, 1.0);
- }
-
-
- light_cube.vs******************
- #version 330 core
- layout (location = 0) in vec3 aPos;
-
- uniform mat4 model;
- uniform mat4 view;
- uniform mat4 projection;
-
- void main()
- {
- gl_Position = projection * view * model * vec4(aPos, 1.0);
- }
-
- light_cube.fs******************
-
- #version 330 core
- out vec4 FragColor;
- uniform vec4 CubeFragColor;
- void main()
- {
- FragColor =vec4(1.0);
- }
main.cpp
- #include
- #include
-
- #include
- #include "stb_image.h"
- #include
- #include "shader.h"
- #include "camera.h"
-
- #include
- #include
- #include
-
- void framebuffer_size_callback(GLFWwindow* window, int width, int height);
- void processInput(GLFWwindow* window);
- void mouse_callback(GLFWwindow* window, double xpos, double ypos);
- void scroll_callback(GLFWwindow* window, double xoffset, double yoffset);
-
- // settings
- const unsigned int SCR_WIDTH = 900;
- const unsigned int SCR_HEIGHT = 600;
-
-
- //camera
- Camera camera(glm::vec3(0.0f, 0.0f, 3.0f));
- float lastX = SCR_WIDTH / 2.0f;
- float lastY = SCR_HEIGHT / 2.0f;
- bool firstMouse = true;
-
- //timing
- float deltaTime = 0.0f;//不同配置绘制速度不同,所以需要这个属性
- float lastFrame = 0.0f;
-
- // utility function for loading a 2D texture from file
- // ---------------------------------------------------
- unsigned int loadTexture(char const* path)
- {
- unsigned int textureID;
- glGenTextures(1, &textureID);
-
- int width, height, nrComponents;
- unsigned char* data = stbi_load(path, &width, &height, &nrComponents, 0);
- if (data)
- {
- GLenum format;
- if (nrComponents == 1)
- format = GL_RED;
- else if (nrComponents == 3)
- format = GL_RGB;
- else if (nrComponents == 4)
- format = GL_RGBA;
-
- glBindTexture(GL_TEXTURE_2D, textureID);
- glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
- glGenerateMipmap(GL_TEXTURE_2D);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
- stbi_image_free(data);
- }
- else
- {
- std::cout << "Texture failed to load at path: " << path << std::endl;
- stbi_image_free(data);
- }
-
- return textureID;
- }
-
- int main() {
- //glfw:initialize and configure
- //=============================
- glfwInit();
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
- glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
-
- #ifdef __APPLE__
- glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
- #endif
-
- //glfw window creation
- //=============================
- GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Learn", NULL, NULL);
- if (window == NULL) {
- std::cout << "Failed to create GLFW window" << std::endl;
- glfwTerminate();
- return -1;
- }
-
- glfwMakeContextCurrent(window);
- glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
- glfwSetCursorPosCallback(window, mouse_callback);
- glfwSetScrollCallback(window, scroll_callback);
-
- //tell GLFW to capture our mouse
- glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
-
- //glad::load all OPenGL function pointers
- //=============================
- if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
- std::cout << "Failed to initialize GLAD" << std::endl;
- return -1;
- }
-
- //configure gloabl opengl state
- //=============================
- glEnable(GL_DEPTH_TEST);
-
- //build and compile our shader zprogram
- //=============================
- Shader lightingShader("./cube.vs", "./cube.fs");
- Shader lightingCubeShader("./light_cube.vs", "./light_cube.fs");
- //set up vertex data
-
- float vertices[] = {
- // positions // normals // texture coords
- -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
- 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
- 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
- -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
-
- -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
- 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
- -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
-
- -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
- -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
- -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
-
- 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
- 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
-
- -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f,
- 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
- 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
- -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
- -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
-
- -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
- -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
- -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f
- };
- glm::vec3 cubePositions[] = {
- glm::vec3(0.0f, 0.0f, 0.0f),
- glm::vec3(2.0f, 5.0f, -15.0f),
- glm::vec3(-1.5f, -2.2f, -2.5f),
- glm::vec3(-3.8f, -2.0f, -12.3f),
- glm::vec3(2.4f, -0.4f, -3.5f),
- glm::vec3(-1.7f, 3.0f, -7.5f),
- glm::vec3(1.3f, -2.0f, -2.5f),
- glm::vec3(1.5f, 2.0f, -2.5f),
- glm::vec3(1.5f, 0.2f, -1.5f),
- glm::vec3(-1.3f, 1.0f, -1.5f)
- };
- //第一个
- unsigned int VBO, cubeVAO;
- glGenVertexArrays(1, &cubeVAO);
- glGenBuffers(1, &VBO);
-
- glBindBuffer(GL_ARRAY_BUFFER, VBO);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
- glBindVertexArray(cubeVAO);
- //position attribute
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
- glEnableVertexAttribArray(0);
- //normal attribute
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
- glEnableVertexAttribArray(2);
-
- //第二个
- unsigned int lightCubeVAO;
- glGenVertexArrays(1, &lightCubeVAO);
- glBindVertexArray(lightCubeVAO);
-
- glBindBuffer(GL_ARRAY_BUFFER, VBO);
-
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
- glEnableVertexAttribArray(0);
- //----------
- std::string texturePath = "../../Data/container2.png";
- unsigned int diffuseMap = loadTexture(texturePath.c_str());
-
- std::string specularPath = "../../Data/container2_specular.png";
- unsigned int specularMap = loadTexture(specularPath.c_str());
-
- lightingShader.use();
- lightingShader.setInt("material.diffuse", 0);
- lightingShader.setInt("material.specular", 1);
- // render loop
- // -----------
- while (!glfwWindowShouldClose(window))
- {
- // per-frame time logic
- // --------------------
- float currentFrame = static_cast<float>(glfwGetTime());
- deltaTime = currentFrame - lastFrame;
- lastFrame = currentFrame;
-
- // input
- // -----
- processInput(window);
-
- // render
- // ------
- glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- // be sure to activate shader when setting uniforms/drawing objects
- lightingShader.use();
- lightingShader.setVec3("light.direction", -0.2f, -1.0f, -0.3f);
- lightingShader.setVec3("viewPos", camera.Position);
-
- //光照属性
- lightingShader.setVec3("light.ambient", 0.2f, 0.2f, 0.2f);
- lightingShader.setVec3("light.diffuse", 0.5f, 0.5f, 0.5f);
- lightingShader.setVec3("light.specular", 1.0f, 1.0f, 1.0f);
- //材质属性
- lightingShader.setVec3("material.specular", 0.5f,0.5f, 0.5f);
- lightingShader.setFloat("material.shininess",32.0f);
-
- // view/projection transformations
- glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);
- glm::mat4 view = camera.GetViewMatrix();
- lightingShader.setMat4("projection", projection);
- lightingShader.setMat4("view", view);
-
- // world transformation
- glm::mat4 model = glm::mat4(1.0f);
- lightingShader.setMat4("model", model);
-
- //bind diffuse map
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, diffuseMap);
- glActiveTexture(GL_TEXTURE1);
- glBindTexture(GL_TEXTURE_2D, specularMap);
- // render the cube
- glBindVertexArray(cubeVAO);
- for (unsigned int i = 0; i < 10; i++) {
- glm::mat4 model=glm::mat4(1.0f);
- model = glm::translate(model, cubePositions[i]);
- float angle = 20.0f * i;
- model = glm::rotate(model, glm::radians(angle), glm::vec3(1.0f, 0.3f, 0.5f));
- lightingShader.setMat4("model", model);
- glDrawArrays(GL_TRIANGLES, 0, 36);
- }
-
- // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
- // -------------------------------------------------------------------------------
- glfwSwapBuffers(window);
- glfwPollEvents();
- }
-
- glDeleteVertexArrays(1, &cubeVAO);
- glDeleteVertexArrays(1, &lightCubeVAO);
- glDeleteBuffers(1, &VBO);
-
- glfwTerminate();
- return 0;
-
- }
- void processInput(GLFWwindow* window)
- {
- if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
- glfwSetWindowShouldClose(window, true);
-
- if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)
- camera.ProcessKeyboard(FORWARD, deltaTime);
- if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS)
- camera.ProcessKeyboard(BACKWARD, deltaTime);
- if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)
- camera.ProcessKeyboard(LEFT, deltaTime);
- if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)
- camera.ProcessKeyboard(RIGHT, deltaTime);
- }
-
- void framebuffer_size_callback(GLFWwindow* window, int width, int height)
- {
- // make sure the viewport matches the new window dimensions; note that width and
- // height will be significantly larger than specified on retina displays.
- glViewport(0, 0, width, height);
- }
- // glfw: whenever the mouse moves, this callback is called
- // -------------------------------------------------------
- void mouse_callback(GLFWwindow* window, double xposIn, double yposIn)
- {
- float xpos = static_cast<float>(xposIn);
- float ypos = static_cast<float>(yposIn);
-
- if (firstMouse)
- {
- lastX = xpos;
- lastY = ypos;
- firstMouse = false;
- }
-
- float xoffset = xpos - lastX;
- float yoffset = lastY - ypos; // reversed since y-coordinates go from bottom to top
-
- lastX = xpos;
- lastY = ypos;
-
- camera.ProcessMouseMovement(xoffset, yoffset);
- }
-
- // glfw: whenever the mouse scroll wheel scrolls, this callback is called
- // ----------------------------------------------------------------------
- void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
- {
- camera.ProcessMouseScroll(static_cast<float>(yoffset));
- }
-

![]()
-
- #version 330 core
- layout (location = 0) in vec3 aPos;
- layout (location =1 ) in vec3 aNormal;
- layout (location=2) in vec2 aTexCoords;
-
- out vec3 FragPos;
- out vec3 Normal;
- out vec2 TexCoords;
-
- uniform mat4 model;
- uniform mat4 view;
- uniform mat4 projection;
-
- void main()
- {
- FragPos=vec3(model*vec4(aPos,1.0));
- Normal=mat3(transpose(inverse(model)))*aNormal;
- TexCoords=aTexCoords;
- gl_Position = projection * view * vec4(FragPos, 1.0);
- }
-
-
- #version 330 core
- out vec4 FragColor;
-
- in vec3 Normal;
- in vec3 FragPos;
-
- struct Material {
- sampler2D diffuse;
- sampler2D specular;
- float shininess;
- };
- in vec2 TexCoords;
- struct Light {
- vec3 position;
- vec3 ambient;
- vec3 diffuse;
- vec3 specular;
-
- float constant;
- float linear;
- float quadratic;
- };
- uniform Material material;
- uniform Light light;
- uniform vec3 objectColor;
- uniform vec3 lightColor;
- uniform vec3 lightPos;
- uniform vec3 viewPos;
-
- void main()
- {
- float distance = length(light.position - FragPos);
- float attenuation = 1.0 / (light.constant + light.linear * distance +
- light.quadratic * (distance * distance));
-
- //ambient
- vec3 ambient=vec3(0.1)*light.ambient*vec3(texture(material.diffuse,TexCoords));
-
- //diffuse
- vec3 norm=normalize(Normal);
- vec3 lightDir=normalize(light.position-FragPos);//光的方向向量是光源位置向量与片段位置向量之间的向量差。
- //对norm和lightDir向量进行点乘,计算光源对当前片段实际的漫反射影响
- //两个向量之间的角度越大,漫反射分量就会越小,点乘的几何意义也如此
- float diff=max(dot(norm,lightDir),0.0);
- vec3 diffuse=light.diffuse*diff*vec3(texture(material.diffuse,TexCoords));
-
-
- //specular
- //漫反射是光源指向片段位置。现在这个是摄像机指向片段位置
- vec3 viewDir=normalize(viewPos-FragPos);
- vec3 reflectDir=reflect(-lightDir,norm);//reflect第一个参数就是要片段指向摄像机位置
- float spec=pow(max(dot(viewDir,reflectDir),0.0),material.shininess);
- vec3 specular=light.specular*spec*vec3(texture(material.specular,TexCoords));
-
- ambient*=attenuation;
- diffuse*=attenuation;
- specular*=attenuation;
- vec3 result=ambient+diffuse+specular;
- FragColor = vec4(result, 1.0);
- }
-
- #version 330 core
- layout (location = 0) in vec3 aPos;
-
- uniform mat4 model;
- uniform mat4 view;
- uniform mat4 projection;
-
- void main()
- {
- gl_Position = projection * view * model * vec4(aPos, 1.0);
- }
-
- #version 330 core
- out vec4 FragColor;
- void main()
- {
- FragColor =vec4(1.0);
- }
camera.h
- #ifndef CAMERA_H
- #define CAMERA_H
-
- #include
- #include
- #include
-
- #include
-
- // Defines several possible options for camera movement. Used as abstraction to stay away from window-system specific input methods
- enum Camera_Movement {
- FORWARD,
- BACKWARD,
- LEFT,
- RIGHT
- };
-
- // Default camera values
- const float YAW = -90.0f;
- const float PITCH = 0.0f;
- const float SPEED = 2.5f;
- const float SENSITIVITY = 0.1f;
- const float ZOOM = 45.0f;
-
-
- // An abstract camera class that processes input and calculates the corresponding Euler Angles, Vectors and Matrices for use in OpenGL
- class Camera
- {
- public:
- // camera Attributes
- glm::vec3 Position;
- glm::vec3 Front;
- glm::vec3 Up;
- glm::vec3 Right;
- glm::vec3 WorldUp;
- // euler Angles
- float Yaw;
- float Pitch;
- // camera options
- float MovementSpeed;
- float MouseSensitivity;
- float Zoom;
-
- // constructor with vectors
- Camera(glm::vec3 position = glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3 up = glm::vec3(0.0f, 1.0f, 0.0f), float yaw = YAW, float pitch = PITCH) : Front(glm::vec3(0.0f, 0.0f, -1.0f)), MovementSpeed(SPEED), MouseSensitivity(SENSITIVITY), Zoom(ZOOM)
- {
- Position = position;
- WorldUp = up;
- Yaw = yaw;
- Pitch = pitch;
- updateCameraVectors();
- }
- // constructor with scalar values
- Camera(float posX, float posY, float posZ, float upX, float upY, float upZ, float yaw, float pitch) : Front(glm::vec3(0.0f, 0.0f, -1.0f)), MovementSpeed(SPEED), MouseSensitivity(SENSITIVITY), Zoom(ZOOM)
- {
- Position = glm::vec3(posX, posY, posZ);
- WorldUp = glm::vec3(upX, upY, upZ);
- Yaw = yaw;
- Pitch = pitch;
- updateCameraVectors();
- }
-
- // returns the view matrix calculated using Euler Angles and the LookAt Matrix
- glm::mat4 GetViewMatrix()
- {
- return glm::lookAt(Position, Position + Front, Up);
- }
-
- // processes input received from any keyboard-like input system. Accepts input parameter in the form of camera defined ENUM (to abstract it from windowing systems)
- void ProcessKeyboard(Camera_Movement direction, float deltaTime)
- {
- float velocity = MovementSpeed * deltaTime;
- if (direction == FORWARD)
- Position += Front * velocity;
- if (direction == BACKWARD)
- Position -= Front * velocity;
- if (direction == LEFT)
- Position -= Right * velocity;
- if (direction == RIGHT)
- Position += Right * velocity;
- }
-
- // processes input received from a mouse input system. Expects the offset value in both the x and y direction.
- void ProcessMouseMovement(float xoffset, float yoffset, GLboolean constrainPitch = true)
- {
- xoffset *= MouseSensitivity;
- yoffset *= MouseSensitivity;
-
- Yaw += xoffset;
- Pitch += yoffset;
-
- // make sure that when pitch is out of bounds, screen doesn't get flipped
- if (constrainPitch)
- {
- if (Pitch > 89.0f)
- Pitch = 89.0f;
- if (Pitch < -89.0f)
- Pitch = -89.0f;
- }
-
- // update Front, Right and Up Vectors using the updated Euler angles
- updateCameraVectors();
- }
-
- // processes input received from a mouse scroll-wheel event. Only requires input on the vertical wheel-axis
- void ProcessMouseScroll(float yoffset)
- {
- Zoom -= (float)yoffset;
- if (Zoom < 1.0f)
- Zoom = 1.0f;
- if (Zoom > 45.0f)
- Zoom = 45.0f;
- }
-
- private:
- // calculates the front vector from the Camera's (updated) Euler Angles
- void updateCameraVectors()
- {
- // calculate the new Front vector
- glm::vec3 front;
- front.x = cos(glm::radians(Yaw)) * cos(glm::radians(Pitch));
- front.y = sin(glm::radians(Pitch));
- front.z = sin(glm::radians(Yaw)) * cos(glm::radians(Pitch));
- Front = glm::normalize(front);
- // also re-calculate the Right and Up vector
- Right = glm::normalize(glm::cross(Front, WorldUp)); // normalize the vectors, because their length gets closer to 0 the more you look up or down which results in slower movement.
- Up = glm::normalize(glm::cross(Right, Front));
- }
- };
- #endif
main.cpp
- #include
- #include
-
- #include
- #include "stb_image.h"
- #include
- #include "shader.h"
- #include "camera.h"
-
- #include
- #include
- #include
-
- void framebuffer_size_callback(GLFWwindow* window, int width, int height);
- void processInput(GLFWwindow* window);
- void mouse_callback(GLFWwindow* window, double xpos, double ypos);
- void scroll_callback(GLFWwindow* window, double xoffset, double yoffset);
- unsigned int loadTexture(char const* path);
- // settings
- const unsigned int SCR_WIDTH = 900;
- const unsigned int SCR_HEIGHT = 600;
-
-
- //camera
- Camera camera(glm::vec3(0.0f, 0.0f, 3.0f));
- float lastX = SCR_WIDTH / 2.0f;
- float lastY = SCR_HEIGHT / 2.0f;
- bool firstMouse = true;
-
- //timing
- float deltaTime = 0.0f;//不同配置绘制速度不同,所以需要这个属性
- float lastFrame = 0.0f;
- // lighting
- glm::vec3 lightPos(1.2f, 1.0f, 2.0f);
-
- int main() {
- //glfw:initialize and configure
- //=============================
- glfwInit();
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
- glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
-
- #ifdef __APPLE__
- glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
- #endif
-
- //glfw window creation
- //=============================
- GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Learn", NULL, NULL);
- if (window == NULL) {
- std::cout << "Failed to create GLFW window" << std::endl;
- glfwTerminate();
- return -1;
- }
-
- glfwMakeContextCurrent(window);
- glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
- glfwSetCursorPosCallback(window, mouse_callback);
- glfwSetScrollCallback(window, scroll_callback);
-
- //tell GLFW to capture our mouse
- glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
-
- //glad::load all OPenGL function pointers
- //=============================
- if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
- std::cout << "Failed to initialize GLAD" << std::endl;
- return -1;
- }
-
- //configure gloabl opengl state
- //=============================
- glEnable(GL_DEPTH_TEST);
-
- //build and compile our shader zprogram
- //=============================
- Shader lightingShader("./cube.vs", "./cube.fs");
- Shader lightingCubeShader("./light_cube.vs", "./light_cube.fs");
- //set up vertex data
-
- float vertices[] = {
- // positions // normals // texture coords
- -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
- 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
- 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
- -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
-
- -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
- 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
- -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
-
- -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
- -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
- -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
-
- 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
- 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
-
- -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f,
- 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
- 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
- -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
- -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
-
- -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
- -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
- -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f
- };
- glm::vec3 cubePositions[] = {
- glm::vec3(0.0f, 0.0f, 0.0f),
- glm::vec3(2.0f, 5.0f, -15.0f),
- glm::vec3(-1.5f, -2.2f, -2.5f),
- glm::vec3(-3.8f, -2.0f, -12.3f),
- glm::vec3(2.4f, -0.4f, -3.5f),
- glm::vec3(-1.7f, 3.0f, -7.5f),
- glm::vec3(1.3f, -2.0f, -2.5f),
- glm::vec3(1.5f, 2.0f, -2.5f),
- glm::vec3(1.5f, 0.2f, -1.5f),
- glm::vec3(-1.3f, 1.0f, -1.5f)
- };
- //第一个
- unsigned int VBO, cubeVAO;
- glGenVertexArrays(1, &cubeVAO);
- glGenBuffers(1, &VBO);
-
- glBindBuffer(GL_ARRAY_BUFFER, VBO);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
- glBindVertexArray(cubeVAO);
- //position attribute
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
- glEnableVertexAttribArray(0);
- //normal attribute
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
- glEnableVertexAttribArray(2);
-
- //第二个
- unsigned int lightCubeVAO;
- glGenVertexArrays(1, &lightCubeVAO);
- glBindVertexArray(lightCubeVAO);
-
- glBindBuffer(GL_ARRAY_BUFFER, VBO);
-
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
- glEnableVertexAttribArray(0);
- //----------
- std::string texturePath = "../../Data/container2.png";
- unsigned int diffuseMap = loadTexture(texturePath.c_str());
-
- std::string specularPath = "../../Data/container2_specular.png";
- unsigned int specularMap = loadTexture(specularPath.c_str());
-
- lightingShader.use();
- lightingShader.setInt("material.diffuse", 0);
- lightingShader.setInt("material.specular", 1);
- // render loop
- // -----------
- while (!glfwWindowShouldClose(window))
- {
- // per-frame time logic
- // --------------------
- float currentFrame = static_cast<float>(glfwGetTime());
- deltaTime = currentFrame - lastFrame;
- lastFrame = currentFrame;
-
- // input
- // -----
- processInput(window);
-
- // render
- // ------
- glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- // be sure to activate shader when setting uniforms/drawing objects
- lightingShader.use();
- lightingShader.setVec3("light.position",lightPos);
- lightingShader.setVec3("viewPos", camera.Position);
-
- //光照属性
- lightingShader.setVec3("light.ambient", 0.2f, 0.2f, 0.2f);
- lightingShader.setVec3("light.diffuse", 0.5f, 0.5f, 0.5f);
- lightingShader.setVec3("light.specular", 1.0f, 1.0f, 1.0f);
- lightingShader.setFloat("light.constant", 1.0f);
- lightingShader.setFloat("light.linear", 0.09f);
- lightingShader.setFloat("light.quadratic", 0.032f);
-
-
- //材质属性
- lightingShader.setVec3("material.specular", 0.5f,0.5f, 0.5f);
- lightingShader.setFloat("material.shininess",32.0f);
-
- // view/projection transformations
- glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);
- glm::mat4 view = camera.GetViewMatrix();
- lightingShader.setMat4("projection", projection);
- lightingShader.setMat4("view", view);
-
- // world transformation
- glm::mat4 model = glm::mat4(1.0f);
- lightingShader.setMat4("model", model);
-
- //bind diffuse map
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, diffuseMap);
- glActiveTexture(GL_TEXTURE1);
- glBindTexture(GL_TEXTURE_2D, specularMap);
- // render the cube
- glBindVertexArray(cubeVAO);
- for (unsigned int i = 0; i < 10; i++) {
- glm::mat4 model=glm::mat4(1.0f);
- model = glm::translate(model, cubePositions[i]);
- float angle = 20.0f * i;
- model = glm::rotate(model, glm::radians(angle), glm::vec3(1.0f, 0.3f, 0.5f));
- lightingShader.setMat4("model", model);
- glDrawArrays(GL_TRIANGLES, 0, 36);
- }
-
- // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
- // -------------------------------------------------------------------------------
- glfwSwapBuffers(window);
- glfwPollEvents();
- }
-
- glDeleteVertexArrays(1, &cubeVAO);
- glDeleteVertexArrays(1, &lightCubeVAO);
- glDeleteBuffers(1, &VBO);
-
- glfwTerminate();
- return 0;
-
- }
- void processInput(GLFWwindow* window)
- {
- if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
- glfwSetWindowShouldClose(window, true);
-
- if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)
- camera.ProcessKeyboard(FORWARD, deltaTime);
- if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS)
- camera.ProcessKeyboard(BACKWARD, deltaTime);
- if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)
- camera.ProcessKeyboard(LEFT, deltaTime);
- if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)
- camera.ProcessKeyboard(RIGHT, deltaTime);
- }
-
- void framebuffer_size_callback(GLFWwindow* window, int width, int height)
- {
- // make sure the viewport matches the new window dimensions; note that width and
- // height will be significantly larger than specified on retina displays.
- glViewport(0, 0, width, height);
- }
- // glfw: whenever the mouse moves, this callback is called
- // -------------------------------------------------------
- void mouse_callback(GLFWwindow* window, double xposIn, double yposIn)
- {
- float xpos = static_cast<float>(xposIn);
- float ypos = static_cast<float>(yposIn);
-
- if (firstMouse)
- {
- lastX = xpos;
- lastY = ypos;
- firstMouse = false;
- }
-
- float xoffset = xpos - lastX;
- float yoffset = lastY - ypos; // reversed since y-coordinates go from bottom to top
-
- lastX = xpos;
- lastY = ypos;
-
- camera.ProcessMouseMovement(xoffset, yoffset);
- }
-
- // glfw: whenever the mouse scroll wheel scrolls, this callback is called
- // ----------------------------------------------------------------------
- void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
- {
- camera.ProcessMouseScroll(static_cast<float>(yoffset));
- }
-
- // utility function for loading a 2D texture from file
- // ---------------------------------------------------
- unsigned int loadTexture(char const* path)
- {
- unsigned int textureID;
- glGenTextures(1, &textureID);
-
- int width, height, nrComponents;
- unsigned char* data = stbi_load(path, &width, &height, &nrComponents, 0);
- if (data)
- {
- GLenum format;
- if (nrComponents == 1)
- format = GL_RED;
- else if (nrComponents == 3)
- format = GL_RGB;
- else if (nrComponents == 4)
- format = GL_RGBA;
-
- glBindTexture(GL_TEXTURE_2D, textureID);
- glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
- glGenerateMipmap(GL_TEXTURE_2D);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
- stbi_image_free(data);
- }
- else
- {
- std::cout << "Texture failed to load at path: " << path << std::endl;
- stbi_image_free(data);
- }
-
- return textureID;
- }


- #version 330 core
- layout (location = 0) in vec3 aPos;
-
- uniform mat4 model;
- uniform mat4 view;
- uniform mat4 projection;
-
- void main()
- {
- gl_Position = projection * view * model * vec4(aPos, 1.0);
- }
-
-
- #version 330 core
- out vec4 FragColor;
- void main()
- {
- FragColor =vec4(1.0);
- }
-
-
-
- #version 330 core
- layout (location = 0) in vec3 aPos;
- layout (location =1 ) in vec3 aNormal;
- layout (location=2) in vec2 aTexCoords;
-
- out vec3 FragPos;
- out vec3 Normal;
- out vec2 TexCoords;
-
- uniform mat4 model;
- uniform mat4 view;
- uniform mat4 projection;
-
- void main()
- {
- FragPos=vec3(model*vec4(aPos,1.0));
- Normal=mat3(transpose(inverse(model)))*aNormal;
- TexCoords=aTexCoords;
- gl_Position = projection * view * vec4(FragPos, 1.0);
- }
-
-
-
-
- #version 330 core
- out vec4 FragColor;
-
- in vec3 Normal;
- in vec3 FragPos;
-
- struct Material {
- sampler2D diffuse;
- sampler2D specular;
- float shininess;
- };
- in vec2 TexCoords;
- struct Light {
- vec3 position;
- vec3 direction;
- float cutOff;
- float outerCutOff;
-
- vec3 ambient;
- vec3 diffuse;
- vec3 specular;
-
- float constant;
- float linear;
- float quadratic;
-
-
- };
- uniform Material material;
- uniform Light light;
- uniform vec3 objectColor;
- uniform vec3 lightColor;
- uniform vec3 lightPos;
- uniform vec3 viewPos;
-
- void main()
- {
- vec3 lightDir=normalize(light.position-FragPos);
-
- //判断
- float theta=dot(lightDir,normalize(-light.direction));
-
-
- if(theta > light.cutOff) // remember that we're working with angles as cosines instead of degrees so a '>' is used.
- {
- // ambient
- vec3 ambient = light.ambient * texture(material.diffuse, TexCoords).rgb;
-
- // diffuse
- vec3 norm = normalize(Normal);
- float diff = max(dot(norm, lightDir), 0.0);
- vec3 diffuse = light.diffuse * diff * texture(material.diffuse, TexCoords).rgb;
-
- // specular
- vec3 viewDir = normalize(viewPos - FragPos);
- vec3 reflectDir = reflect(-lightDir, norm);
- float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
- vec3 specular = light.specular * spec * texture(material.specular, TexCoords).rgb;
-
- // attenuation
- float distance = length(light.position - FragPos);
- float attenuation = 1.0 / (light.constant + light.linear * distance + light.quadratic * (distance * distance));
-
- // ambient *= attenuation; // remove attenuation from ambient, as otherwise at large distances the light would be darker inside than outside the spotlight due the ambient term in the else branch
- diffuse *= attenuation;
- specular *= attenuation;
-
- vec3 result = ambient + diffuse + specular;
- FragColor = vec4(result, 1.0);
- }
- else
- {
- // else, use ambient light so scene isn't completely dark outside the spotlight.
- FragColor = vec4(light.ambient * texture(material.diffuse, TexCoords).rgb, 1.0);
- }
-
-
-
- }
main.cpp
- #include
- #include
-
- #include
- #include "stb_image.h"
- #include
- #include "shader.h"
- #include "camera.h"
-
- #include
- #include
- #include
-
- void framebuffer_size_callback(GLFWwindow* window, int width, int height);
- void processInput(GLFWwindow* window);
- void mouse_callback(GLFWwindow* window, double xpos, double ypos);
- void scroll_callback(GLFWwindow* window, double xoffset, double yoffset);
- unsigned int loadTexture(char const* path);
- // settings
- const unsigned int SCR_WIDTH = 900;
- const unsigned int SCR_HEIGHT = 600;
-
-
- //camera
- Camera camera(glm::vec3(0.0f, 0.0f, 3.0f));
- float lastX = SCR_WIDTH / 2.0f;
- float lastY = SCR_HEIGHT / 2.0f;
- bool firstMouse = true;
-
- //timing
- float deltaTime = 0.0f;//不同配置绘制速度不同,所以需要这个属性
- float lastFrame = 0.0f;
- // lighting
- glm::vec3 lightPos(1.2f, 1.0f, 2.0f);
-
- int main() {
- //glfw:initialize and configure
- //=============================
- glfwInit();
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
- glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
-
- #ifdef __APPLE__
- glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
- #endif
-
- //glfw window creation
- //=============================
- GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Learn", NULL, NULL);
- if (window == NULL) {
- std::cout << "Failed to create GLFW window" << std::endl;
- glfwTerminate();
- return -1;
- }
-
- glfwMakeContextCurrent(window);
- glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
- glfwSetCursorPosCallback(window, mouse_callback);
- glfwSetScrollCallback(window, scroll_callback);
-
- //tell GLFW to capture our mouse
- glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
-
- //glad::load all OPenGL function pointers
- //=============================
- if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
- std::cout << "Failed to initialize GLAD" << std::endl;
- return -1;
- }
-
- //configure gloabl opengl state
- //=============================
- glEnable(GL_DEPTH_TEST);
-
- //build and compile our shader zprogram
- //=============================
- Shader lightingShader("./cube.vs", "./cube.fs");
- Shader lightingCubeShader("./light_cube.vs", "./light_cube.fs");
- //set up vertex data
-
- float vertices[] = {
- // positions // normals // texture coords
- -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
- 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
- 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
- -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
-
- -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
- 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
- -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
-
- -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
- -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
- -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
-
- 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
- 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
-
- -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f,
- 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
- 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
- -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
- -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
-
- -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
- -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
- -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f
- };
- glm::vec3 cubePositions[] = {
- glm::vec3(0.0f, 0.0f, 0.0f),
- glm::vec3(2.0f, 5.0f, -15.0f),
- glm::vec3(-1.5f, -2.2f, -2.5f),
- glm::vec3(-3.8f, -2.0f, -12.3f),
- glm::vec3(2.4f, -0.4f, -3.5f),
- glm::vec3(-1.7f, 3.0f, -7.5f),
- glm::vec3(1.3f, -2.0f, -2.5f),
- glm::vec3(1.5f, 2.0f, -2.5f),
- glm::vec3(1.5f, 0.2f, -1.5f),
- glm::vec3(-1.3f, 1.0f, -1.5f)
- };
- //第一个
- unsigned int VBO, cubeVAO;
- glGenVertexArrays(1, &cubeVAO);
- glGenBuffers(1, &VBO);
-
- glBindBuffer(GL_ARRAY_BUFFER, VBO);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
- glBindVertexArray(cubeVAO);
- //position attribute
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
- glEnableVertexAttribArray(0);
- //normal attribute
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
- glEnableVertexAttribArray(2);
-
- //第二个
- unsigned int lightCubeVAO;
- glGenVertexArrays(1, &lightCubeVAO);
- glBindVertexArray(lightCubeVAO);
-
- glBindBuffer(GL_ARRAY_BUFFER, VBO);
-
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
- glEnableVertexAttribArray(0);
- //----------
- std::string texturePath = "../../Data/container2.png";
- unsigned int diffuseMap = loadTexture(texturePath.c_str());
-
- std::string specularPath = "../../Data/container2_specular.png";
- unsigned int specularMap = loadTexture(specularPath.c_str());
-
- lightingShader.use();
- lightingShader.setInt("material.diffuse", 0);
- lightingShader.setInt("material.specular", 1);
- // render loop
- // -----------
- while (!glfwWindowShouldClose(window))
- {
- // per-frame time logic
- // --------------------
- float currentFrame = static_cast<float>(glfwGetTime());
- deltaTime = currentFrame - lastFrame;
- lastFrame = currentFrame;
-
- // input
- // -----
- processInput(window);
-
- // render
- // ------
- glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- // be sure to activate shader when setting uniforms/drawing objects
- lightingShader.use();
- lightingShader.setVec3("light.position", camera.Position);
- lightingShader.setVec3("light.direction", camera.Front);
- lightingShader.setFloat("light.cutOff", glm::cos(glm::radians(12.5f)));
- lightingShader.setVec3("viewPos", camera.Position);
-
- //光照属性
- lightingShader.setVec3("light.ambient", 0.1f, 0.1f, 0.1f);
- lightingShader.setVec3("light.diffuse", 0.8f, 0.8f, 0.8f);
- lightingShader.setVec3("light.specular", 1.0f, 1.0f, 1.0f);
- lightingShader.setFloat("light.constant", 1.0f);
- lightingShader.setFloat("light.linear", 0.09f);
- lightingShader.setFloat("light.quadratic", 0.032f);
-
-
-
- //材质属性
- lightingShader.setFloat("material.shininess", 32.0f);
-
- // view/projection transformations
- glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);
- glm::mat4 view = camera.GetViewMatrix();
- lightingShader.setMat4("projection", projection);
- lightingShader.setMat4("view", view);
-
- // world transformation
- glm::mat4 model = glm::mat4(1.0f);
- lightingShader.setMat4("model", model);
-
- //bind diffuse map
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, diffuseMap);
- glActiveTexture(GL_TEXTURE1);
- glBindTexture(GL_TEXTURE_2D, specularMap);
- // render the cube
- glBindVertexArray(cubeVAO);
- for (unsigned int i = 0; i < 10; i++) {
- glm::mat4 model = glm::mat4(1.0f);
- model = glm::translate(model, cubePositions[i]);
- float angle = 20.0f * i;
- model = glm::rotate(model, glm::radians(angle), glm::vec3(1.0f, 0.3f, 0.5f));
- lightingShader.setMat4("model", model);
- glDrawArrays(GL_TRIANGLES, 0, 36);
- }
-
- // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
- // -------------------------------------------------------------------------------
- glfwSwapBuffers(window);
- glfwPollEvents();
- }
-
- glDeleteVertexArrays(1, &cubeVAO);
- glDeleteVertexArrays(1, &lightCubeVAO);
- glDeleteBuffers(1, &VBO);
-
- glfwTerminate();
- return 0;
-
- }
- void processInput(GLFWwindow* window)
- {
- if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
- glfwSetWindowShouldClose(window, true);
-
- if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)
- camera.ProcessKeyboard(FORWARD, deltaTime);
- if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS)
- camera.ProcessKeyboard(BACKWARD, deltaTime);
- if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)
- camera.ProcessKeyboard(LEFT, deltaTime);
- if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)
- camera.ProcessKeyboard(RIGHT, deltaTime);
- }
-
- void framebuffer_size_callback(GLFWwindow* window, int width, int height)
- {
- // make sure the viewport matches the new window dimensions; note that width and
- // height will be significantly larger than specified on retina displays.
- glViewport(0, 0, width, height);
- }
- // glfw: whenever the mouse moves, this callback is called
- // -------------------------------------------------------
- void mouse_callback(GLFWwindow* window, double xposIn, double yposIn)
- {
- float xpos = static_cast<float>(xposIn);
- float ypos = static_cast<float>(yposIn);
-
- if (firstMouse)
- {
- lastX = xpos;
- lastY = ypos;
- firstMouse = false;
- }
-
- float xoffset = xpos - lastX;
- float yoffset = lastY - ypos; // reversed since y-coordinates go from bottom to top
-
- lastX = xpos;
- lastY = ypos;
-
- camera.ProcessMouseMovement(xoffset, yoffset);
- }
-
- // glfw: whenever the mouse scroll wheel scrolls, this callback is called
- // ----------------------------------------------------------------------
- void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
- {
- camera.ProcessMouseScroll(static_cast<float>(yoffset));
- }
-
- // utility function for loading a 2D texture from file
- // ---------------------------------------------------
- unsigned int loadTexture(char const* path)
- {
- unsigned int textureID;
- glGenTextures(1, &textureID);
-
- int width, height, nrComponents;
- unsigned char* data = stbi_load(path, &width, &height, &nrComponents, 0);
- if (data)
- {
- GLenum format;
- if (nrComponents == 1)
- format = GL_RED;
- else if (nrComponents == 3)
- format = GL_RGB;
- else if (nrComponents == 4)
- format = GL_RGBA;
-
- glBindTexture(GL_TEXTURE_2D, textureID);
- glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
- glGenerateMipmap(GL_TEXTURE_2D);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
- stbi_image_free(data);
- }
- else
- {
- std::cout << "Texture failed to load at path: " << path << std::endl;
- stbi_image_free(data);
- }
-
- return textureID;
- }
