在WebGL中,gl_Color是未声明的标识符。

5

我正在查看http://www.swiftless.com/tutorials/glsl/3_glcolor.html,其中包含如下代码片段:

void main() {
// Set the output color of our current pixel
gl_FragColor = gl_Color;}

我尝试在我的WebGL中使用gl_Color,但是出现了一个“gl_Color未声明”的错误。

我做错了什么?

感谢您的帮助。

2个回答

9

WebGL使用OpenGL ES 2.0作为其基础,因此您应该使用GLSL ES 1.0来编写着色器。GLSL ES没有gl_Color,因此您需要重写这个着色器。


1
谢谢你的帮助。我刚刚在Google上搜索了GLSL ES 1.0。它在http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf上。我如何在GLSL ES 1.0中访问与gl_Color等效的内容? - pion
3
在ES 2.0中,没有与gl_Color、gl_Vertex、gl_Normal等任何旧的固定渲染管线相关的内容。无法复制或模拟旧的渲染管线,如glColorPointer等函数也不可用。您需要按照需要定义自己的属性或统一变量,并以常规方式进行获取和设置。 - Tommy
我对WebGL还很新。我只是在尝试将帧缓冲区上当前像素与当前纹素混合。最好的方法是什么? - pion
要使用正常的混合模式(glEnable(GL_BLEND),glBlendFunc等),只需输出具有正确alpha值的像素即可。您无法从当前帧缓冲区中读取,但可以渲染到纹理中,然后从中采样,尽管从正在渲染的相同纹理中读取会产生未定义的结果,因此请小心。除其他事项外,能够读取帧缓冲区将在许多多重采样实现中引入竞争条件,否则需要更加复杂和缓慢的硬件路径。 - Tommy
在花费更多时间解决这个问题后,我最终使用了多重纹理TEXTURE0和TEXTURE1来解决它。请参见https://dev59.com/HlLTa4cB1Zd3GeqPdMLX#4478350上的相关讨论。感谢您的帮助。 - pion

-3

我猜你正在尝试使用普通的C编译器编译GLSL代码。

看起来它应该是C代码,但实际上它是GLSL源码 - 旨在由OpenGL GLSL编译器编译,而不是您的机器C编译器。

片段着色器有一个预定义变量'gl_Color',它是顶点着色器的输出。

你提到的示例将代码放在shader.frag文件中,并通过shader.init()引用。OpenGL库本身将处理将其编译为GPU指令以供您的机器使用。将代码放入该文件中,希望示例能够正常工作 :)


我忘了在原帖中提到我正在使用WebGL。我正在修改一个已经工作的现有WebGL(和GLSL)示例。我刚刚尝试将gl_Color包含在上面的教程中。似乎echeese给出了正确的答案。可能WebGL使用GLSL 1.0。 - pion

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