我在基于WebGL的应用程序中绘制了大量三角形。其中一些三角形需要翻译,我计划在着色器一侧进行翻译。我将attribute vec3 vTranslate;
添加到了我的顶点着色器。
我想做以下事情:
if(condition_that_vTranslate_is_buffered)
{
// Do translation
}
但是,我没有找到有效的条件。虽然我可以只为每个未被翻译的点提供[0, 0, 0]
,但我宁愿不将这些数据浪费在管道中。
答案 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
语句,否则可以这样做。