我正在尝试在 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;
}
片段着色器:
#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,一切正常(除了漫射闪电)。恐怕这是我明显遗漏的东西。
最佳答案
问题:
normalize(dot(lightVector, vertNormal))
GLSL 1.3 中的 dot
返回 float 。
normalize
接受向量,而不是 float 。
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
关于OpenGL、漫反射着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18902644/