片段着色器不会在 OpenGL GLSL 中创建像光一样的渐变

Posted

技术标签:

【中文标题】片段着色器不会在 OpenGL GLSL 中创建像光一样的渐变【英文标题】:Fragment shader not creating gradient like light in OpenGL GLSL 【发布时间】:2019-11-18 22:46:58 【问题描述】:

我正在尝试了解如何使用着色器来操作我的渲染。我没有更改场景的投影矩阵,但我绘制了一个顶点 = -0.5, -0.5 0.5, -0.5 0, 0.5 的三角形。然后我将“光”的 vec2 位置传递给片段着色器的制服,我想从三角形的右上角(lightPos = (0.5,0.5))基本上照亮我的三角形(lightPos = (0.5,0.5))

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

这就是我在三角形中的目标(有点......它不需要从白色变为蓝色,它只需要在靠近光线的地方更亮,在更远的地方更暗)

这是着色器

#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 个顶点,就好像它们在完全相同的位置一样。我把数学写出来了,我强烈地觉得这应该可行。非常感谢任何帮助。

编辑

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

【问题讨论】:

发布您的顶点着色器和显示当前输出的图像。 【参考方案1】:

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

#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

【讨论】:

@Luke 很高兴为您提供帮助。我们都从某个地方开始。我做过比这更糟糕的事情,而且我是一个“专业人士”。有时,只需要多一双眼睛就能发现问题。

以上是关于片段着色器不会在 OpenGL GLSL 中创建像光一样的渐变的主要内容,如果未能解决你的问题,请参考以下文章

用于片段着色器的 OpenGL GLSL 绑定采样器

片段着色器中设置的颜色未显示 GLSL 1.30

带有片段着色器的 GLSL 仅渲染黑色 GL_POINTS

OpenGL3:高级篇 GLSL

GLSL实现图像处理

✠OpenGL-2-图像管线