OpenGL,漫反射着色器

OpenGL,漫反射着色器,opengl,glsl,shader,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 v

我试图在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_乘积相乘时,什么也不显示。我移除了dot_产品,一切正常(除了漫射闪电ofc)。恐怕这是我明显遗漏的东西。

一个问题:

normalize(dot(lightVector, vertNormal))
GLSL 1.3中的点返回浮点。
normalize
接受向量,而不是浮点。

至少是这个问题的解决方案:

normalize(dot(lightVector, vertNormal))
在片段着色器中,替换

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

看起来您正在使用max和normalize来避免从
dot
返回负数。这正是
clamp
的用途。这里是使用

float dot_乘积=max(点(归一化(光向量),归一化(法向量)),0.0)

迪伦·霍姆斯的回答有点不正确:

光向量仍然需要标准化


而且不需要夹紧<代码>最大值
正确。如果输入向量被归一化,点积永远不会返回高于1.0的值

着色器编译/链接日志中有任何内容吗?谢谢你的建议,我更改了那行代码,但总体上没有任何更改:(哦,等待您使用GLSL 1.3,因此尝试在顶点着色器和片段着色器中使用
属性切换
,在
中删除
输出vec4颜色;
并用
gl_FragColor
替换
颜色,恐怕不行,片段着色器中的
变化
应该是
属性
b因为它是输入而不是输出。我编辑了上面的代码。它现在可以工作了吗?实际上1.30已经有了
in/out
,所以不管怎么说,还是不要再使用这些不推荐的
属性/变化的
垃圾了。确切地说:“点积永远不会返回高于1.0的值,只有在向量被规格化的情况下才是真的,而vertNormal仍然需要规格化,因为e它是插值,不是正常的应用程序。在您发表评论之前,我将此信息添加到了关于点积的答案中。着色器编程对我来说是几年前的事了,所以我不确定是否有必要。@djmj规格化确实让我忘了,谢谢您指出了关于clamp/max的内容。