3

我正在尝试在 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,一切正常(除了漫反射闪电)。恐怕这很明显我错过了。

4

2 回答 2

3

一个问题:

normalize(dot(lightVector, vertNormal))

dot在 GLSL 1.3 中返回一个浮点数。
normalize接受向量,而不是浮点数。用于规范化
的点文档

一个解决方案,至少解决这个问题:

在片段着色器中,替换

float dot_product = max(normalize(dot(lightVector, vertNormal)), 0.0);

float dot_product = clamp(dot(lightVector, vertNormal), 0, 1);

看起来您正在使用 max 和 normalize 来避免从dot. 这正是clamp它的用途。这是夹具的文档

于 2013-09-19T19:15:13.640 回答
2

利用

float dot_product = max(dot(normalize(lightVector), normalize(normalVector)), 0.0);

Dylan Holmes 的回答有些不正确:

仍然需要对 lightVector 进行归一化!

并且不需要夹紧。max是正确的。如果输入向量被归一化,点积永远不会返回高于 1.0 的值。

于 2013-09-20T11:11:17.120 回答