检查属性是否提供给着色器

Check if attribute is provided to shader

我在基于 WebGL 的应用程序中绘制了许多三角形。其中一些三角形需要转换,我计划在着色器端进行转换。我将 attribute vec3 vTranslate; 添加到我的顶点着色器。

我想做以下事情:

if(condition_that_vTranslate_is_buffered)
{
    // Do translation
}

但是,我还没有找到可行的条件。虽然我 可以 简单地为每个未翻译的点提供 [0, 0, 0],但我宁愿不要在管道中浪费这些数据。

While I could simply provide [0, 0, 0] for each point which is not being translated, I would prefer to not waste that data in the pipeline.

WebGL 1.0 specification; 5.13.10 Uniforms and attributes refers to OpenGL ES Specification 2.0.25。请参阅第 2.7 章当前顶点状态:

The initial values for all generic vertex attributes are (0, 0, 0, 1).

这意味着如果顶点属性的当前顶点状态是禁用的(disableVertexAttribArray),那么顶点着色器中的顶点属性的值分别为(0, 0, 0, 1)(0 , 0, 0) 对于 vec3 类型的属性。因此,您不需要 "waste" 数据,也不需要使用 (0, 0, 0) 初始化的指定通用顶点数组数据。只是禁用顶点数组,这会导致相同的结果,顶点着色器中的属性值为 (0, 0, 0)。

我不完全确定我是否理解这个问题,但基于我所做的:

attribute vec4 aPosition;
attribute vec3 vTranslate;

void main(){

   vec4 worldPosition = modelMatrix * vec4(aPosition.xyz,1.);

   worldPosition.xyz += vTranslate * aPosition.w;

   gl_Position = ndc * view * worldPosition;

}

一些地方建议不要在着色器中使用 if 语句,如果可以的话。