【问题标题】:OpenGL shader not passing variable from vertex to fragment shaderOpenGL着色器没有将变量从顶点传递到片段着色器
【发布时间】: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),但这不应该是问题。

标签: opengl glsl shader fragment-shader vertex-shader


【解决方案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。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多