diff --git a/Shaders/Projector/Projector.frag b/Shaders/Projector/Projector.frag index cafa84e149e79bfb0da127a1ea90efc5ae4a007d..b4fc7338a4b90020d82c35dccc7dd9707f41a293 100644 --- a/Shaders/Projector/Projector.frag +++ b/Shaders/Projector/Projector.frag @@ -1,19 +1,59 @@ #version 330 core -uniform sampler2D image; out vec4 FragColor; -in vec4 TexCoords; +struct Material +{ + sampler2D diffuse; + sampler2D specular; + float shininess; +}; + +struct Light +{ + vec3 position; + + vec3 ambient; + vec3 diffuse; + vec3 specular; +}; + +in vec3 FragPos; +in vec3 Normal; +in vec2 TexCoords; +in vec4 ProjTexCoords; + +uniform vec3 viewPos; +uniform Material material; +uniform Light light; +uniform sampler2D projImage; void main (void) { - vec4 final_color; - if( TexCoords.q > 0.0 ) + // ambient + vec3 ambient = light.ambient * texture(material.diffuse, TexCoords).rgb; + + // diffuse + vec3 norm = normalize(Normal); + vec3 lightDir = normalize(light.position - FragPos); + 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; + + vec4 result = vec4(ambient + diffuse + specular, 1.0); + + vec4 projColor; + if( ProjTexCoords.q > 0.0 ) { - vec2 finalCoords = TexCoords.st / TexCoords.q; - vec4 ProjMapColor_forCam1 = texture(image, finalCoords); - final_color = ProjMapColor_forCam1; + vec2 finalCoords = ProjTexCoords.st / ProjTexCoords.q; + vec4 ProjMapColor_forCam1 = texture(projImage, finalCoords); + projColor = ProjMapColor_forCam1; } - FragColor = final_color; + FragColor = mix(result, projColor, 0.4f); } \ No newline at end of file diff --git a/Shaders/Projector/Projector.vert b/Shaders/Projector/Projector.vert index 0082afb510821ea7eabedabc7fb56d82b627c880..3ef7c9dfd1ceb0b0a1f5444d52736d6000756618 100644 --- a/Shaders/Projector/Projector.vert +++ b/Shaders/Projector/Projector.vert @@ -1,20 +1,34 @@ #version 330 core layout (location = 0) in vec3 aPos; +layout (location = 1) in vec3 aNormal; +layout (location = 2) in vec2 aTexCoords; -out vec4 TexCoords; +out vec4 ProjTexCoords; + +out vec3 FragPos; +out vec3 Normal; +out vec2 TexCoords; + +uniform mat4 projectorBias; +uniform mat4 projectorProjection; +uniform mat4 projectorView; -uniform mat4 TexGenMatCam0; uniform mat4 model; uniform mat4 view; uniform mat4 projection; void main() -{ - vec3 FragPos = vec3(model * vec4(aPos, 1.0)); - vec4 VertexPos_eye = model * view * vec4(aPos, 1.0); - vec4 VertexPos_world = inverse(view) * VertexPos_eye; - - TexCoords = TexGenMatCam0 * VertexPos_world; - +{ + FragPos = vec3(model * vec4(aPos, 1.0)); + Normal = mat3(transpose(inverse(model))) * aNormal; + TexCoords = aTexCoords; + + mat4 InvViewMat = inverse(view); + mat4 TexGenMatCam0 = projectorBias * projectorProjection * projectorView; + + vec4 posEye = view * model * vec4(aPos, 1.0); + + ProjTexCoords = TexGenMatCam0 * posEye; + gl_Position = projection * view * vec4(FragPos, 1.0); } \ No newline at end of file