OpenGL着色器没有将变量从顶点传递到片段着色器

Posted

技术标签:

【中文标题】OpenGL着色器没有将变量从顶点传递到片段着色器【英文标题】:OpenGL shader not passing variable from vertex to fragment shader 【发布时间】:2014-11-07 16:44:44 【问题描述】:

我遇到了一些非常非常奇怪的事情。

我有一个非常简单的程序,它使用以下着色器管道渲染一个简单的全屏广告牌:

顶点着色器:

#version 430

layout(location = 0) in vec2 pos;

out vec2 tex;

void main()

    gl_Position = vec4(pos, 0, 1);
    tex = (pos + 1) / 2;

片段着色器:

#version 430

in vec2 tex;

out vec3 frag_color;

void main()

    frag_color = vec3(tex.x, tex.y, 1);

程序总是在正确的位置渲染四边形(所以我已经排除了 VAO 是罪魁祸首),但由于某种原因忽略了我为 tex 设置的任何值并总是将其设置为 vec2(0,0),渲染一个蓝色的盒子。

这里有什么我遗漏的吗?我之前做过很多opengl应用程序,我从来没有遇到过这种情况。 :/

【问题讨论】:

pos+1的元素总是小于2吗? 是的。框的边界从 (-1,-1) 到 (1,1)。我也可以直接赋值(例如:tex = vec2(0.5,0.5); ),还是不行。 我以为它是在做整数除法,但如果直接赋值仍然给你同样的问题,也许不会。 使用制服,我可以在片段着色器中设置颜色。 Uniforms 在顶点着色器中不起作用(就像直接赋值一样)... 您是否启用了 Alpha 通道?如果是这样,您应该从片段着色器输出vec4。检查您的格式。此外,frag_color 应该有 layout(location = 0),但这不应该是问题。 【参考方案1】:

我已经看到 OpenGL 2.0 的实现在添加浮点数和未显式转换的整数时在编译时出现问题。 即使这不是我认为在 4.3 实现中可能出现的问题,也许您应该只在“整数”常量中添加点和后缀。

你的顶点着色器的最后一行似乎是唯一可能出现问题的行(我相信值总是在构造函数中强制转换:p)所以你会有这样的东西:

tex = (pos + 1.0f) / 2.0f;

请记住,您的着色器可以在数千种不同的实现上进行编译,因此始终保持明确!!!

是一个好习惯

【讨论】:

请注意,1.0 在 GLSL 中的类型为 float,这与在 C/C++ 中为 double 不同。所以f 后缀是不需要的,实际上在某些 OpenGL 版本中不支持,比如 OpenGL 2.0 和 ES 2.0。

以上是关于OpenGL着色器没有将变量从顶点传递到片段着色器的主要内容,如果未能解决你的问题,请参考以下文章

如果几何着色器处于活动状态,如何将信息从顶点着色器传递到片段着色器?

带有顶点/片段着色器的光。使用不同的变量。 (openGL)

如何将数据从顶点着色器传递到片段着色器,中间有着色器[重复]

OpenGL着色器没有传递正确的纹理坐标

SpriteKit 中的顶点着色器

跨多个着色器的 OpenGL 统一