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)