GLSL 1.0.0 - 在顶点着色器和片元着色器中使用"Varying"时出现问题

4
我正在使用OpenGL ES 2.0.0和GLSL ES 1.0.0进行开发。
目前我正在将一个正方形渲染到屏幕上,并尝试应用纹理。
在顶点和片段着色器中使用“varying”时遇到了问题,收到错误消息:
- Failed to compile vertex shader - 
0(3) : error C5060: out can't be used with non-varying tex_varying

in vec4 texture_coord ;
in vec4 position ;
out vec2 tex_varying ;
uniform mat4 translate ;
void main ( ) 
{
  gl_Position = translate * position ;
  tex_varying = texture_coord . xy ;
}

我已经阅读了文档,但仍然无法确定我的错误在哪里。
以下是代码。
顶点:
attribute vec4 position; 
attribute vec4 texture_coord; 
varying vec2 tex_varying; 
uniform mat4 translate; 

void main()
{ 
  gl_Position = translate * position; 
  tex_varying = texture_coord.xy;
}

Fragment:

varying vec2 tex_varying; 
uniform sampler2D texture; 

void main()
{
  gl_FragColor = texture2D(texture, tex_varying);
}

已解决: 这是一个晚回复,但我很久以前就解决了这个问题 - 以防其他人遇到此问题。原来“tex_varying”被Nvidia保留了!只需将tex_varying重命名即可解决问题。

干杯。


3
你将一个vec4分配给了一个vec2类型的变量。"tex_varying = texture_coord.xy;" - djmj
抱歉,这段代码本来就是这样的,我在这里复制的时候出了错。 - Ben
3
收到错误信息:“在哪个着色器中?它在哪一行发生的?你能贴出整个错误信息吗?” - Nicol Bolas
它发生在顶点着色器中。这是错误信息:
  • 无法编译顶点着色器 - 0(3):错误C5060:out不能与非varying的tex_varying一起使用
- Ben
1个回答

6
你展示的inout关键字适用于GLSL v3及更高版本。对于v1(这是你正在尝试使用的版本?),你需要在顶点着色器中将in替换为attribute,将out替换为varying。在片段着色器中,将in替换为varying,不能使用out - 需要输出到gl_FragColor,就像你似乎正在做的那样。

因此,你的第二个/第三个着色器看起来像是你已经将第一个着色器中的GLSL v3代码正确翻译成了GLSL v1,并且看起来应该可以与ES2/GLSL v1一起使用。


第一篇是我收到的错误信息,而不是我使用的着色器。第二和第三个着色器是我正在使用的,其中包括“varying”。这是我正在使用的版本。OpenGL ES 2.0.0 OpenGL ES GLSL ES 1.0.0 Desktop; Shading Language Vendor(NVIDIA Corporation) Version(3.30 NVIDIA via Cg compiler) Renderer(GeForce 9600 GT/PCI/SSE2) - Ben
看起来第一个块既有错误消息,又有生成该错误的v3顶点着色器。第二个块将相同的着色器转换为GLSL v1,应该可以工作。或者我可能没有理解你上面发布的内容。另一个不清楚的地方是“-无法编译顶点着色器-”这一行是从哪里来的。 - Chris Dodd
此外,那个供应商字符串看起来像是桌面GL v3.30,而不是GL/ES。 - Chris Dodd
编译顶点着色器失败 - 这是我用来查看错误的输出。再次强调,第一个块是我收到的错误消息。我不确定为什么它将其转换为v3。有没有办法确保我正在使用正确版本的GLSL? - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接