diff --git a/OpenGL/hello/src/cube.fs b/OpenGL/hello/src/cube.fs index 105f994..835b4fa 100644 --- a/OpenGL/hello/src/cube.fs +++ b/OpenGL/hello/src/cube.fs @@ -1,25 +1,32 @@ #version 330 core out vec4 FragColor; -in vec3 Normal; -in vec3 FragPos; - -uniform vec3 lightPos; +in vec3 Normal; +in vec3 FragPos; + +uniform vec3 lightPos; uniform vec3 lightColor; uniform vec3 objectColor; +uniform vec3 viewPos; -void main() -{ - // ambient - float ambientStrength = 0.1; - vec3 ambient = ambientStrength * lightColor; - - // diffuse - vec3 norm = normalize(Normal); - vec3 lightDir = normalize(lightPos - FragPos); - float diff = max(dot(norm, lightDir), 0.0); - vec3 diffuse = diff * lightColor; - - vec3 result = (ambient + diffuse) * objectColor; - FragColor = vec4(result, 1.0); -} \ No newline at end of file +void main() { + // 环境 + float ambientStrength = 0.1; + vec3 ambient = ambientStrength * lightColor; + + // 漫反射 + vec3 norm = normalize(Normal); + vec3 lightDir = normalize(lightPos - FragPos); + float diff = max(dot(norm, lightDir), 0.0); + vec3 diffuse = diff * lightColor; + + // 镜面 + float specularStrength = 0.5; + vec3 viewDir = normalize(viewPos - FragPos); + vec3 reflectDir = reflect(-lightDir, norm); + float spec = pow(max(dot(viewDir, reflectDir), 0.0), 64); + vec3 specular = specularStrength * spec * lightColor; + +vec3 result = (ambient + diffuse + specular) * objectColor; + FragColor = vec4(result, 1.0); +} \ No newline at end of file diff --git a/OpenGL/hello/src/light.fs b/OpenGL/hello/src/light.fs index 674ab6e..1c649f4 100644 --- a/OpenGL/hello/src/light.fs +++ b/OpenGL/hello/src/light.fs @@ -1,8 +1,7 @@ #version 330 core out vec4 FragColor; -uniform vec3 lightColor; void main() { - FragColor = vec4(lightColor, 1.0); // set all 4 vector values to 1.0 + FragColor = vec4(1.0); // set all 4 vector values to 1.0 } \ No newline at end of file diff --git a/OpenGL/hello/src/main.cpp b/OpenGL/hello/src/main.cpp index a0c9606..67b533e 100644 --- a/OpenGL/hello/src/main.cpp +++ b/OpenGL/hello/src/main.cpp @@ -69,18 +69,6 @@ int main() { glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void *)0); glEnableVertexAttribArray(0); - // 激活着色器 - shader.use(); - // 绑定纹理 - shader.setInt("texture1", 0); - shader.setInt("texture2", 1); - shader.setVec3("lightColor", 1.0f, 1.0f, 1.0f); - shader.setVec3("objectColor", 1.0f, 0.5f, 0.31f); - - lightShader.use(); - lightShader.setVec3("lightColor", 1.0f, 1.0f, 1.0f); - lightShader.setVec3("lightPos", lightPos); - // 开启深度测试 glEnable(GL_DEPTH_TEST); @@ -99,44 +87,37 @@ int main() { glClearColor(0.1f, 0.1f, 0.1f, 0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glm::mat4 view = camera.GetViewMatrix(); + lightPos.x = 1.0f + sin(glfwGetTime()) * 2.0f; + lightPos.y = sin(glfwGetTime() / 2.0f) * 1.0f; + glm::mat4 view = camera.GetViewMatrix(); glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f); + glm::mat4 model = glm::mat4(1.0f); // 绘制三角形 shader.use(); - + shader.setVec3("objectColor", 1.0f, 0.5f, 0.31f); + shader.setVec3("lightColor", 1.0f, 1.0f, 1.0f); + shader.setVec3("lightPos", lightPos); + shader.setVec3("viewPos", camera.Position); + shader.setMat4("model", model); shader.setMat4("projection", projection); shader.setMat4("view", view); - // 设置变换矩阵 - glm::mat4 trans(1.0f); - trans = glm::rotate(trans, (float)glfwGetTime(), glm::vec3(0.0, 0.25, 0.0)); - shader.setMat4("trans", trans); glBindVertexArray(VAO); + glDrawArrays(GL_TRIANGLES, 0, 36); - for (unsigned int i = 0; i < 10; i++) { - glm::mat4 model(1.0f); - model = glm::translate(model, cubePositions[i]); - float angle = 20.0f * i + 50.0f; - model = - glm::rotate(model, glm::radians(angle), glm::vec3(1.0f, 0.3f, 0.5f)); - shader.setMat4("model", model); - - glDrawArrays(GL_TRIANGLES, 0, 36); - } - - lightShader.use(); - - glm::mat4 model = glm::mat4(1.0f); + model = glm::mat4(1.0f); model = glm::translate(model, lightPos); model = glm::scale(model, glm::vec3(0.2f)); // a smaller cube - glBindVertexArray(lightVAO); + + lightShader.use(); lightShader.setMat4("projection", projection); lightShader.setMat4("view", view); lightShader.setMat4("model", model); + glBindVertexArray(lightVAO); glDrawArrays(GL_TRIANGLES, 0, 36); // 检查并调用事件,交换缓冲