more lighting

This commit is contained in:
Claire Schwarzer 2026-02-08 04:48:42 +01:00
parent 16b674efc1
commit 79fa59c3aa
5 changed files with 89 additions and 27 deletions

View file

@ -1,16 +1,56 @@
#version 330 core #version 330 core
out vec4 FragColor; out vec4 FragColor;
in vec3 FragPos;
in vec3 Normal;
in vec2 TexCoord; in vec2 TexCoord;
uniform sampler2D ourTexture; uniform sampler2D ourTexture;
uniform sampler2D decal; uniform sampler2D decal;
void main() uniform vec3 lightPos;
{ uniform vec3 lightColor;
uniform vec3 viewPos;
vec4 calcTextures(){
vec4 tex1 = texture(ourTexture, TexCoord); vec4 tex1 = texture(ourTexture, TexCoord);
vec4 tex2 = texture(decal, TexCoord); vec4 tex2 = texture(decal, TexCoord);
vec4 textures = mix(tex1, tex2, 0.2f); vec4 textures = mix(tex1, tex2, 0.2f);
FragColor = textures; return textures;
}
vec4 calcDirectLight(norm, viewDir){
// Ambient Lighting
float ambientStrength = 0.1;
vec3 ambient = ambientStrength * lightColor;
// Diffuse Lighting
vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = diff * lightColor;
// Specular Lighting
float specularStrength = 0.5;
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
vec3 specular = specularStrength * spec * lightColor;
vec4 result = vec4(ambient.rgb + diffuse.rgb + specular.rgb, 1.0f);
return result;
}
void main()
{
vec3 norm = normalize(Normal);
vec3 viewDir = normalize(viewPos - FragPos);
vec4 result = calcTextures();
result += calcDirectLight(norm, viewDir);
FragColor = result;
} }

View file

@ -3,6 +3,7 @@ layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal; layout (location = 1) in vec3 aNormal;
layout (location = 2) in vec2 aTexCoord; layout (location = 2) in vec2 aTexCoord;
out vec3 FragPos;
out vec3 Normal; out vec3 Normal;
out vec2 TexCoord; out vec2 TexCoord;
@ -12,8 +13,9 @@ uniform mat4 projection;
void main() void main()
{ {
gl_Position = projection * view * model * vec4(aPos, 1.0f); FragPos = vec3(model * vec4(aPos, 1.0));
Normal = mat3(transpose(inverse(model))) * aNormal;
Normal = aNormal;
TexCoord = aTexCoord; TexCoord = aTexCoord;
gl_Position = projection * view * model * vec4(aPos, 1.0f);
} }

View file

@ -0,0 +1,6 @@
#version 330 core
out vec4 FragColor;
void main() {
FragColor = vec4(1.0);
}

View file

@ -19,8 +19,6 @@ public:
std::string vertexCode, fragmentCode; std::string vertexCode, fragmentCode;
std::ifstream vertexFile, fragmentFile; std::ifstream vertexFile, fragmentFile;
std::cout << vertexPath << std::endl;
vertexFile.exceptions (std::ifstream::failbit | std::ifstream::badbit); vertexFile.exceptions (std::ifstream::failbit | std::ifstream::badbit);
fragmentFile.exceptions (std::ifstream::failbit | std::ifstream::badbit); fragmentFile.exceptions (std::ifstream::failbit | std::ifstream::badbit);

View file

@ -74,7 +74,6 @@ int main(int argc, char* argv[])
*/ */
// Load Shader // Load Shader
Shader shaderTest("assets/shaders/basicVertex.vert", "assets/shaders/basicFragment.frag");
std::vector<Vertex> vertices = { std::vector<Vertex> vertices = {
// Front face (-z) normal: (0, 0, -1) // Front face (-z) normal: (0, 0, -1)
{ -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 },
@ -125,23 +124,12 @@ int main(int argc, char* argv[])
{ -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 }
}; };
std::vector<unsigned int> indices = { std::vector<unsigned int> indices = {
// Front (-z) ── outer view CCW 0, 1, 2, 2, 4, 0,
0, 1, 2, 0, 2, 5, 6, 7, 8, 8, 10, 6,
12, 13, 14, 14, 16, 12,
// Back (+z) ── outer view CCW 18, 19, 20, 20, 22, 18,
6, 7, 8, 6, 8, 11, 24, 25, 26, 26, 28, 24,
30, 31, 32, 32, 34, 30
// Left (-x) ── outer view CCW
12, 13, 14, 12, 14, 17,
// Right (+x) ── outer view CCW
18, 19, 20, 18, 20, 23,
// Bottom (-y) ── outer view CCW
24, 25, 26, 24, 26, 29,
// Top (+y) ── outer view CCW
30, 31, 32, 30, 32, 35
}; };
Mesh testMesh(vertices, indices); Mesh testMesh(vertices, indices);
@ -149,12 +137,18 @@ int main(int argc, char* argv[])
Texture texture1("assets/wall.jpg"); Texture texture1("assets/wall.jpg");
Texture texture2("assets/awesomeface.png", true); Texture texture2("assets/awesomeface.png", true);
Shader shaderTest("assets/shaders/basicVertex.vert", "assets/shaders/basicFragment.frag");
shaderTest.Use(); // don't forget to activate/use the shader before setting uniforms! shaderTest.Use(); // don't forget to activate/use the shader before setting uniforms!
shaderTest.setInt("ourTexture", 0); shaderTest.setInt("ourTexture", 0);
shaderTest.setInt("decal", 1); shaderTest.setInt("decal", 1);
Shader lightingShader("assets/shaders/basicVertex.vert", "assets/shaders/lightFragment.frag");
Mesh lightMesh(vertices, indices);
// Render Loop // Render Loop
float lastUpdate = 0; float lastUpdate = 0;
glm::vec3 lightPos = glm::vec3(0.0f, 0.0f, 0.0f);
glm::vec3 orbitCenter = glm::vec3(0.0f, 0.0f, 0.0f);
while (!glfwWindowShouldClose(window)) while (!glfwWindowShouldClose(window))
{ {
// per-frame time logic // per-frame time logic
@ -183,6 +177,9 @@ int main(int argc, char* argv[])
glBindTexture(GL_TEXTURE_2D, texture2.ID); glBindTexture(GL_TEXTURE_2D, texture2.ID);
shaderTest.Use(); shaderTest.Use();
shaderTest.setVec3("lightColor", 1.0f, 1.0f, 1.0f);
shaderTest.setVec3("lightPos", orbitCenter);
shaderTest.setVec3("viewPos", camera.position);
// pass projection matrix to shader (note that in this case it could change every frame) // pass projection matrix to shader (note that in this case it could change every frame)
glm::mat4 projection = glm::perspective(glm::radians(camera.zoom), (float)SCREEN_WIDTH / (float)SCREEN_HEIGHT, 0.1f, 100.0f); glm::mat4 projection = glm::perspective(glm::radians(camera.zoom), (float)SCREEN_WIDTH / (float)SCREEN_HEIGHT, 0.1f, 100.0f);
@ -197,6 +194,25 @@ int main(int argc, char* argv[])
testMesh.Draw(); testMesh.Draw();
lightingShader.Use();
lightingShader.setMat4("projection", projection);
lightingShader.setMat4("view", view);
model = glm::mat4(1.0f);
glm::vec3 offset = glm::vec3(
2.0f * cos(glfwGetTime() * 1.0f),
0.0f,
sin(glfwGetTime() * 1.0f) * 2.0f
);
orbitCenter = lightPos + offset;
model = glm::translate(model, orbitCenter);
model = glm::scale(model, glm::vec3(0.2f)); // a smaller cube
lightingShader.setMat4("model", model);
lightMesh.Draw();
// Call events & swap buffers // Call events & swap buffers
glfwSwapBuffers(window); glfwSwapBuffers(window);
glfwPollEvents(); glfwPollEvents();