OpenGL、漫反射着色器

标签 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;
}

片段着色器:

#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/

相关文章:

GLSL vec2 用作 float 组?

javascript - 如何消除阴影贴图的虚假伪像?

java - 全局 OpenGL 纹理

opengl - 如何将纹理附加到帧缓冲区?

performance - 如何在没有 ("<<"的情况下执行位移位 || ">>") 运营商有效吗?

javascript - 将 2D SDF 函数转换为 JavaScript

opengl - 如何在着色器中旋转和平移矩形纹理

c++ - OpenGL 窗口切断模型 View

glsl - GLSL 向 C 引入了哪些关键字?

javascript - 调整 Three.js 中的现有着色器