0

使用 绘图时gl.disableVertexAttribArray(0),Firefox(就像他们说的其他浏览器一样)发出以下警告:

WebGL 警告:drawElementsInstanced:未启用顶点属性 0 数组的绘图会强制浏览器在桌面 OpenGL 平台(例如 Mac)上运行时进行昂贵的仿真工作。最好始终在启用顶点属性 0 数组的情况下进行绘制,方法是使用 bindAttribLocation 将一些始终使用的属性绑定到位置 0。

我知道这个。我知道不禁用 0 被认为是很好的做法。我知道它到处都有。

然而,这很有趣,这正是我想要的。在我的着色器中,我有一个 3D 属性和另一个 2D 属性,用于在 3D 点周围的窗口坐标中绘制一个 2D 标记:

gl_Position = doSomething(aPosition) + vec4(aDelta, 0.0, 0.0);

有时我只想aDelta保持不变和aPosition变化,有时反过来。我特别不想链接同一个程序两次(将属性绑定到不同的位置),或者有两个不同的着色器,因为其余的功能是共享的,要么是浪费。

我知道性能受到影响,但它就是这样工作的。模拟与否,结果是正确的并且符合规范。这是一个简单的函数,一次只绘制几个顶点。任何其他方式对我来说都是“昂贵的仿真”。我可以向 Firefox 解释一下,这样它就不会淹没我的控制台(仅这个警告就占用了所有通常空间的一半!)如果我分发这个,我的用户不会认为我无能无视警告?

4

2 回答 2

1

我可以静音关于顶点属性数组 0 被禁用的警告吗?

这取决于你在做什么。一般来说,不,您不能禁用警告。

您可以做的是,如果您的着色器始终使用某个属性,您可以确保该属性使用位置 0。

例如,一些着色器使用位置,其他使用位置和法线,其他使用位置和 texcoords,其他使用位置、texcoords、法线和顶点颜色是很常见的。也许我只有一个着色器,如果不使用,则将 texcoords、法线和顶点颜色设置为常量,但我总是使用缓冲区中的位置。在这种情况下,在将程序强制位置链接到位置 0之前

 gl.bindAttribLocation(someProgram, 0, 'position');
 gl.linkProgram(someProgram);

如果没有从不禁用的属性,则不,您不能关闭警告。


我不确定这里有什么正确的解决方案。除非我像调试器“额外的 WebGL 警告”中的某些选项那样要求它,否则我最喜欢没有警告或至少不显示它。我觉得这个警告大多是无用的。当然,很高兴知道如果我想获得最大性能,我不应该这样做,但就像 1000 多个其他编程优化一样,我通常不在乎。如果您希望它消失,您可以在浏览器上提交错误/问题/功能请求。

于 2020-05-06T06:38:13.733 回答
-1

您可以改为使用将顶点属性设置为常量值vertexAttrib[1234]fv。通过这种方式,您可以显式声明所需的行为,而不是依赖隐式提供的默认值。

void vertexAttrib[1234]f(GLuint index, ...)
void vertexAttrib[1234]fv(GLuint index, ...) 

Sets the vertex attribute at the passed index to the given constant value.

相关规范部分是 5.14.10。

于 2020-05-05T21:29:49.403 回答