From 3158ced31bb0be599b74fd7d9ef7fefa605af4c4 Mon Sep 17 00:00:00 2001 From: Linloir <3145078758@qq.com> Date: Sun, 18 Dec 2022 10:05:02 +0800 Subject: [PATCH] [CORE][CHG] Shader update - Update shader to accept multiple lights - Add light count uniform - Clean up code --- FinalProject/FinalProject.vcxproj | 13 +++--- FinalProject/FinalProject.vcxproj.filters | 16 +------- ...{fragmentshader.fs => fragmentshader.glsl} | 41 ++++++++++--------- FinalProject/illuminant.fs | 0 FinalProject/illuminant.vs | 11 ----- .../{vertexshader.vs => vertexshader.glsl} | 0 6 files changed, 31 insertions(+), 50 deletions(-) rename FinalProject/{fragmentshader.fs => fragmentshader.glsl} (81%) delete mode 100644 FinalProject/illuminant.fs delete mode 100644 FinalProject/illuminant.vs rename FinalProject/{vertexshader.vs => vertexshader.glsl} (100%) diff --git a/FinalProject/FinalProject.vcxproj b/FinalProject/FinalProject.vcxproj index ede62bd..17070a7 100644 --- a/FinalProject/FinalProject.vcxproj +++ b/FinalProject/FinalProject.vcxproj @@ -109,7 +109,6 @@ - @@ -145,7 +144,6 @@ - @@ -168,10 +166,13 @@ - - - - + + + + + + + diff --git a/FinalProject/FinalProject.vcxproj.filters b/FinalProject/FinalProject.vcxproj.filters index a4b9fad..8ca5770 100644 --- a/FinalProject/FinalProject.vcxproj.filters +++ b/FinalProject/FinalProject.vcxproj.filters @@ -165,9 +165,6 @@ Source Files\Qt Widgets\Pages\Scene Editor\Object Selector - - Source Files\OpenGL Abstractions - Source Files\OpenGL Abstractions @@ -212,9 +209,6 @@ Header Files\Qt Widgets\Pages\Scene Editor\Object Setter - - Header Files\OpenGL Abstractions - Header Files\OpenGL Abstractions @@ -264,16 +258,10 @@ - + Resource Files - - Resource Files - - - Resource Files - - + Resource Files diff --git a/FinalProject/fragmentshader.fs b/FinalProject/fragmentshader.glsl similarity index 81% rename from FinalProject/fragmentshader.fs rename to FinalProject/fragmentshader.glsl index 5dbf34b..414b2a8 100644 --- a/FinalProject/fragmentshader.fs +++ b/FinalProject/fragmentshader.glsl @@ -42,18 +42,24 @@ struct SpotLight { vec3 specular; }; -#define NR_POINT_LIGHTS 4 +#define MAX_DIR_LIGHTS 1 +#define MAX_POINT_LIGHTS 128 +#define MAX_SPOT_LIGHTS 128 in vec3 FragPos; in vec3 Normal; in vec2 TexCoords; +uniform Material material; uniform vec3 viewPos; -uniform DirLight dirLight; -uniform PointLight pointLights[NR_POINT_LIGHTS]; -uniform SpotLight spotLight; -uniform Material material; + +uniform int dirlightnr; +uniform int pointlightnr; +uniform int spotlightnr; +uniform DirLight dirlights[MAX_DIR_LIGHTS]; +uniform PointLight pointlights[MAX_POINT_LIGHTS]; +uniform SpotLight spotlights[MAX_SPOT_LIGHTS]; // function prototypes vec3 CalcDirLight(DirLight light, vec3 normal, vec3 viewDir); @@ -66,19 +72,16 @@ void main() vec3 norm = normalize(Normal); vec3 viewDir = normalize(viewPos - FragPos); - // == ===================================================== - // Our lighting is set up in 3 phases: directional, point lights and an optional flashlight - // For each phase, a calculate function is defined that calculates the corresponding color - // per lamp. In the main() function we take all the calculated colors and sum them up for - // this fragment's final color. - // == ===================================================== + vec3 result = vec3(0.0); // phase 1: directional lighting - vec3 result = CalcDirLight(dirLight, norm, viewDir); + for (int i = 0; i < dirlightnr; i++) + result += CalcDirLight(dirlights[i], norm, viewDir); // phase 2: point lights - for(int i = 0; i < NR_POINT_LIGHTS; i++) - result += CalcPointLight(pointLights[i], norm, FragPos, viewDir); - // phase 3: spot light - result += CalcSpotLight(spotLight, norm, FragPos, viewDir); + for (int i = 0; i < pointlightnr; i++) + result += CalcPointLight(pointlights[i], norm, FragPos, viewDir); + // // phase 3: spot light + // for (int i = 0; i < spotlightnr; i++) + // result += CalcSpotLight(spotlights[i], norm, FragPos, viewDir); FragColor = vec4(result, 1.0); } @@ -95,7 +98,7 @@ vec3 CalcDirLight(DirLight light, vec3 normal, vec3 viewDir) // combine results vec3 ambient = light.ambient * vec3(texture(material.texture_diffuse1, TexCoords)); vec3 diffuse = light.diffuse * diff * vec3(texture(material.texture_diffuse1, TexCoords)); - vec3 specular = light.specular * spec * vec3(texture(material.texture_specular1, TexCoords)); + vec3 specular = light.specular * spec * vec3(texture(material.texture_specular1, TexCoords).x); return (ambient + diffuse + specular); } @@ -114,7 +117,7 @@ vec3 CalcPointLight(PointLight light, vec3 normal, vec3 fragPos, vec3 viewDir) // combine results vec3 ambient = light.ambient * vec3(texture(material.texture_diffuse1, TexCoords)); vec3 diffuse = light.diffuse * diff * vec3(texture(material.texture_diffuse1, TexCoords)); - vec3 specular = light.specular * spec * vec3(texture(material.texture_specular1, TexCoords)); + vec3 specular = light.specular * spec * vec3(texture(material.texture_specular1, TexCoords).x); ambient *= attenuation; diffuse *= attenuation; specular *= attenuation; @@ -140,7 +143,7 @@ vec3 CalcSpotLight(SpotLight light, vec3 normal, vec3 fragPos, vec3 viewDir) // combine results vec3 ambient = light.ambient * vec3(texture(material.texture_diffuse1, TexCoords)); vec3 diffuse = light.diffuse * diff * vec3(texture(material.texture_diffuse1, TexCoords)); - vec3 specular = light.specular * spec * vec3(texture(material.texture_specular1, TexCoords)); + vec3 specular = light.specular * spec * vec3(texture(material.texture_specular1, TexCoords).x); ambient *= attenuation * intensity; diffuse *= attenuation * intensity; specular *= attenuation * intensity; diff --git a/FinalProject/illuminant.fs b/FinalProject/illuminant.fs deleted file mode 100644 index e69de29..0000000 diff --git a/FinalProject/illuminant.vs b/FinalProject/illuminant.vs deleted file mode 100644 index c875a90..0000000 --- a/FinalProject/illuminant.vs +++ /dev/null @@ -1,11 +0,0 @@ -#version 430 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); -} \ No newline at end of file diff --git a/FinalProject/vertexshader.vs b/FinalProject/vertexshader.glsl similarity index 100% rename from FinalProject/vertexshader.vs rename to FinalProject/vertexshader.glsl