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

时间:2018-04-24 16:59:50

标签: glsl webgl

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

我想做以下事情:

if(condition_that_vTranslate_is_buffered)
{
    // Do translation
}

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

2 个答案:

答案 0 :(得分:2)

  

虽然我可以简单地为每个未被翻译的点提供[0,0,0],但我宁愿不在管道中浪费这些数据。

WebGL 1.0 specification; 5.13.10 Uniforms and attributes指的是OpenGL ES Specification 2.0.25。参见Chaper 2.7当前顶点状态:

  

所有通用顶点属性的初始值为(0,0,0,1)。

这意味着如果禁用顶点属性的当前顶点状态(disableVertexAttribArray),则顶点着色器中顶点属性的值分别为(0,0,0,1)(0,0) ,0)表示vec3类型的属性。所以你不需要浪费"数据并且您不需要使用(0,0,0)初始化的指定通用顶点数组数据。只需禁用顶点数组,这会导致相同的结果,顶点着色器中的属性值为(0,0,0)。

答案 1 :(得分:1)

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

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语句,否则可以这样做。