在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之后。
答案 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_2D
和TEXTURE_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属性的源,这完全取决于您。