OpenGL,漫反射着色器

时间:2013-09-19 18:47:04

标签: opengl glsl shader

我正在尝试在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。)。我担心这很明显我不在了。

2 个答案:

答案 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的值。