无法从 WebGL 中的片段着色器获取所需的属性

3 shader attributes opengl-es glsl webgl

WebGL API(以及 OpenGL)有一个著名的函数getAttribLocation http://msdn.microsoft.com/en-us/library/ie/dn302408(v=vs.85).aspx

在我的项目中,我尝试使用此函数获取所需的属性,但获取值-1

没关系,当着色器中没有这样的属性时,但在我的程序中有:

在此输入图像描述

看见?我已将着色器的现有成员转储到控制台中,并且vertexColor存在。-1当我从中获取属性的着色器转储显示内存中存在这样的属性时,我不知道如何获取。

如果要获取其他属性,一切正常,除了这个(但它的声明方式与其他属性相同,并且我没有删除内存中的某些内容):

在此输入图像描述

正如您所看到的vertexPositiontextureCoordinatesAttribute它返回属性的位置号。

那么出了什么问题以及为什么会发生我无法解释。请大家帮忙提个建议。

无法提供源代码,因为我正在开发大型库,目前有 3k+ 行代码。我只能告诉你,你可能会通过屏幕截图和函数看到着色器是如何创建的,获取属性只是迭代具有属性列表的输入对象的集合,并且对于每个属性都getAttribLocation从 WebGL 调用函数。尽管如此,屏幕截图显示了真实的转储,您可以看到,我所说的是着色器中存在的属性的真相。此外,您还可以看到,获取其中两个给出了正确的结果,而一个则失败。我不知道出了什么问题。至于我,如果要使用逻辑,它一定不能返回该-1值。属性存在于内存中并且调用语法是正确的,所以这个问题现在对我来说相当神秘。

gma*_*man 5

如果未使用该属性,则允许 GLSL 编译器对其进行优化。WebGL API 的设计使您可以忽略这一点。传递-1给任何采用属性位置的函数基本上都变成了无操作。

同样,GLSL 编译器可以优化掉未使用的制服。gl.getUniformLocation将返回null未知的制服并传递null给任何采用统一位置的函数都是无操作

以这种方式工作是一件好事,因为在调试时通常会注释掉着色器的某些部分。因为未知的属性和统一的位置就变成了无操作,所以一切都继续工作,没有错误。