在TWGL中,为什么“ setBuffersAndAttributes”和“ drawBufferInfo”是两个单独的调用?

问题描述

TWGL中,为什么必须先将缓冲区信息传递给setBuffersAndAttributes,然后再将其传递给drawBufferInfo?我是WebGL的新手,只是尝试了解管道,为什么要进行这两个单独的调用在这种情况下,我将首先设置缓冲区信息,然后在绘制之前进行其他操作,或者根本不绘制它,或者绘制另一个缓冲信息?

解决方法

为什么要用这两个单独的调用,在这种情况下,我会先设置缓冲区信息,然后再做其他操作,然后再绘制或根本不绘制它或绘制不同的缓冲区信息?

最常见的原因是要绘制许多相同的东西。

twgl.setBuffersAndAttributes(gl,someProgramInfo,someBufferInfo);

// uniforms shared by all instances like projection or view
twgl.setUniforms(...); 

for each instance
  // uniforms unique this instance like material,texture or world matrix
  twgl.setUniforms(...);  
  twgl.drawBufferInfo(...);

twgl.drawBufferInfo唯一要做的就是调用gl.drawArraysgl.drawElements,而要做的唯一信息就是

  1. 绘制数量以及要处理的顶点数量
  2. 是否对数据建立索引(换句话说,应该调用gl.drawArrays还是gl.drawElements
  3. 如果是索引,则UNSIGNED_BYTEUNSIGNED_SHORTUNSIGNED_INT是什么类型的索引

这是唯一的目的,因此,如果您将数据从非索引更改为索引,则不必将代码从gl.drawArrays更改为gl.drawElements或反之亦然