c++ - 片段着色器不会像 OpenGL GLSL 中的光那样创建渐变

标签 c++ opengl graphics glsl shader

我试图了解如何使用着色器操作我的渲染。我没有更改场景的投影矩阵,但我绘制了一个顶点 = {-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/

相关文章:

用于 win32 或 C++ 的 C#

c++ - Mac OS X 拒绝创建我的 OpenGL 窗口

ios - 为什么我的 PhoneGap 应用程序图形仅在 iOS 上损坏?

java - JFrame随机渲染图形

c++ - 使用 namespace 别名优于预处理器的好处

C++ - 如何从同一类的静态函数访问类的私有(private)成员?

c++ - 使用 distutils 加快构建过程

c++ - 在 GLSL 中从 int 中解压 4 个字节

java - LWJGL glCreateBuffers 导致问题

graphics - 沿着 CoreAudio 编程 : CoreGraphics? CoreAnimation 最快的动画图形是什么?科科斯2D? OpenGL?