gpt4 book ai didi

c++ - 片段着色器不会在 OpenGL GLSL 中创建类似光的渐变

转载 作者:行者123 更新时间:2023-12-01 14:49:38 25 4
gpt4 key购买 nike

我试图了解如何使用着色器操纵我的渲染。我没有改变场景的投影矩阵,但我画了一个顶点 = {-0.5, -0.5} {0.5, -0.5} {0, 0.5} 的三角形。然后我将“光”的 vec2 位置传递给我的片段着色器的制服,我想从三角形的右上角照射到我的三角形上(lightPos = (0.5,0.5))

这是一张非常糟糕的图,描绘了所有东西的位置。

Terrible image i made in paint

这就是我想要在我的三角形中拥有的东西(有点……它不需要是白色到蓝色,它只需要在靠近光线的地方更亮,更远的地方更暗)

Example image

这是着色器

#version 460 core

in vec3 oPos;
out vec4 fragColor;

uniform vec3 u_outputColor;
uniform vec2 u_lightPosition;

void main(){

float intensity = 1 / length(oPos.xy - u_lightPosition);
vec4 col = vec4(u_outputColor, 1.0f);
fragColor = col * intensity;
}

下面是编译着色器的基本代码(大部分都被抽象掉了,所以相当简单)
/* Test data for shader program. */
program.init("passthrough.vert", "passthrough.frag");
program.setUniformVec3("u_outputColor", 0.3f, 0.3f, 0.8f);
program.setUniformVec2("u_lightPosition", 0.5f, 0.5f);



GLfloat vertices[9] = {-0.5f, -0.5, 0, 0,0.5f,0, 0.5, -0.5, 0};

这是顶点着色器:
#version 460 core

layout (location = 0) in vec3 aPos;
out vec3 oPos;

void main(){
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}

我进行的每一次测试都想看看为什么我不能让它工作,似乎向我表明,如果有轻微的颜色变化,它会将整个三角形更改为不同的阴影。所有测试都在整个事物中显示一种颜色的三角形;根本没有梯度。我希望三角形是一个渐变,在靠近光线的地方更亮,离它更远的地方更暗。这让我发疯了,因为我已经在这么简单的事情上坚持了 3 个小时,而且似乎我编写的任何代码都会一次修改所有 3 个顶点,就好像它们在完全相同的位置。我把数学写出来了,我强烈觉得这应该可行。非常感谢任何帮助。

编辑

解决方案后的三角形解决了我的问题:

enter image description here

最佳答案

为您的顶点着色器试试这个:

#version 460 core

layout (location = 0) in vec3 aPos;
out vec3 oPos;

void main(){
oPos.xyz = aPos.xyz; // ADD THIS LINE
gl_Position = vec4(aPos.xyz, 1.0);
}

您的版本永远不会写入 oPos ,因此片段着色器会获得 a) 随机值,或者在您的情况下 b) vec3(0,0,0) .由于您的颜色计算基于:
float intensity =  1 / length(oPos.xy - u_lightPosition);

这与
float intensity =  1 / length(-1*u_lightPosition);

所以颜色只取决于光的位置。

您可以通过将片段颜色设置为 oPos 来调试和验证这一点。 :
vec4 col = vec4(oPos.xy, oPos.z + 0.5, 1.0f);

oPos在顶点着色器中正确设置,然后片段着色器中的这一行将显示一个 RGB 渐变。如 oPos设置不正确,您将看到 50% 的蓝色。

始终 检查从 OpenGL 返回的错误和日志。它应该发出一个警告,让你直接解决这个问题。

另外,我很惊讶你的整个三角形没有被剪裁,因为顶点有 z0 .

关于c++ - 片段着色器不会在 OpenGL GLSL 中创建类似光的渐变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58924047/

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