gpt4 book ai didi

OpenGL、漫反射着色器

转载 作者:行者123 更新时间:2023-12-03 03:59:13 25 4
gpt4 key购买 nike

我正在尝试在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com