BindBuffer和BufferData背靠背调用

时间:2013-12-27 19:14:48

标签: graphics opengl-es webgl

在OpenGL ES(或者我的情况下,WebGL)中,我没有看到如何绑定顶点和颜色缓冲区,然后调用drawArrays。例如,这里有一些示例代码供您了解:

vertexBuffer = glCreateBuffer();
glBindBuffer(GL_ARRAY_BUFFER, vertextBuffer);
glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW);

colorBuffer = glCreateBuffer();
glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
glBufferData(GL_ARRAY_BUFFER, colors, GL_STATIC_DRAW);

glDrawArrays(GL_TRIANGLES, 0, numberOfVertices);

如果我将GL_ARRAY_BUFFER绑定到第一个顶点,bufferData,然后再绑定一些颜色,那么幕后会发生什么?在某种程度上,我觉得应该忽略顶点信息,因为我将颜色信息绑定到GL_ARRAY_BUFFER之后。

2 个答案:

答案 0 :(得分:6)

gl.vertexAttribPointer实际上是设置哪些属性使用哪个缓冲区。

您可以将其视为

gl = { 
   arrayBuffer: someBuffer, 
   vertexArray: {
     elementArrayBuffer: someOtherBuffer,
     attributes: [], 
   },
};

当你致电gl.bindBuffer时,你只是在gl状态下设置2个全局变量之一。

gl.bindBuffer = function(bindPoint, buffer) {
   switch (bindPoint) {
      case: this.ARRAY_BUFFER:
         this.arrayBuffer = buffer;
         break;
      case: this.ELEMENT_ARRAY_BUFFER:
         this.vertexArray.elementArrayBuffer = buffer;
         break;
   }
};

当您致电gl.vertexAttribPointer时,它会将arrayBuffer的当前值复制到指定的属性。

gl.vertexAttribPointer = function(index, size, type, normalized, stride, offset) {
    var attribute = this.vertexArray.attributes[index];
    attribute.size = size;
    attribute.type = type;
    attribute.normalized = normalized;
    attribute.stride = stride;
    attribute.offset = offset;
    attribute.buffer = this.arrayBuffer;  // copies the current buffer reference.
};

纹理的工作方式类似,只有1个全局变量

gl = { 
    activeTextureUnit: 0,
    textureUnits: [], 
};

gl.activeTexture设置您正在处理的纹理单元。

gl.activeTexture = function(unit) {
   this.activeTextureUnit = unit - this.TEXTURE_0;  // make it zero based.
};

每个纹理单元都有TEXTURE_2DTEXTURE_CUBEMAP,因此gl.bindTexture(b, t)实际上是

gl.bindTexture = function(bindPoint, texture) {
   var textureUnit = this.textureUnits[this.activeTextureUnit];
   switch (bindPoint) {
       case this.TEXTURE_2D:
           textureUnit.texture2D = texture;
           break;
       case this.TEXTURE_CUBEMAP:
           textureUnit.textureCubeMap = texture;
           break;
   }
};

答案 1 :(得分:2)

glDrawArrays()并不关心GL_ARRAY_BUFFER的约束条件。它确实关心顶点属性指针。

这里真正重要的是你粘贴的代码中没有显示:属性指针设置。当调用GL_ARRAY_BUFFER时,对当前绑定的glVertexAttribPointer()的引用将成为attrib指针的一部分。不同的属性可以来自不同的VBO,或者您可以使用一个VBO作为may属性的源,这完全取决于您。