我正在尝试在GLSL / openGL中实现非常简单的漫反射着色器。 这是我得到的: 顶点着色器:
#version 130
in vec3 vertPos3D;
in vec3 vertNormal3D;
uniform mat3 transpMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform vec3 lightPosition;
varying vec3 vertNormal;
varying vec3 lightVector;
void main()
{
vec4 res_pos = projectionMatrix * viewMatrix * vec4(vertPos3D.xyz, 1.0);
gl_Position = res_pos;
mat4 pm = projectionMatrix * viewMatrix;
vertNormal = (viewMatrix * vec4(vertNormal3D, 0)).xyz;
lightVector = (viewMatrix * vec4(lightPosition, 1.0)).xyz - (viewMatrix * vec4(vertPos3D.xyz, 1.0)).xyz;
}
Fragment Shader:
#version 130
out vec4 color;
varying vec3 lightVector;
varying vec3 vertNormal;
void main()
{
float dot_product = max(normalize(dot(lightVector, vertNormal)), 0.0);
color = dot_product * vec4( 1.0, 1.0, 1.0, 1.0 );
}
只要我将最终颜色与dot_product相乘,就不会显示任何内容。我删除了dot_product,一切正常(除了漫射闪电ofc。)。我担心这很明显我不在了。
答案 0 :(得分:3)
问题:
normalize(dot(lightVector, vertNormal))
GLSL 1.3中的 dot
返回一个浮点数
normalize
接受一个向量,而不是浮点数
documentation for dot
documentation for normalize
解决方案,至少解决这个问题:
在片段着色器中,替换
float dot_product = max(normalize(dot(lightVector, vertNormal)), 0.0);
与
float dot_product = clamp(dot(lightVector, vertNormal), 0, 1);
看起来您正在使用max和normalize来避免从dot
返回的负数。这正是clamp
的用途。这是documentation for clamp
答案 1 :(得分:2)
使用
float dot_product = max(dot(normalize(lightVector), normalize(normalVector)), 0.0);
Dylan Holmes的回答有些不正确:
仍需要将lightVector标准化!
不需要夹紧。 max
是正确的。如果输入向量被标准化,则点积不会返回高于1.0的值。