【发布时间】:2018-12-11 10:18:47
【问题描述】:
我试图了解 [glGenBuffers, glBindData, glBufferData, glBufferSubData] 和 glVertexAttribPointer 之间的关系。
我看到您实际上不必使用 buffers 方法(至少在 Android 中不是),而是直接调用 glVertexAttribPointer,将指向缓冲区对象的指针作为最后一个参数传递。 (在这种情况下,缓冲区是 FloatBuffer)
例如
GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 12, vertexBuffer);
GLES20.glVertexAttribPointer(colorHandle, 4, GLES20.GL_FLOAT, false, 16, colorBuffer);
GLES20.glVertexAttribPointer(normalHandle, 3, GLES20.GL_FLOAT, false, 12, normalsBuffer);
GLES20.glVertexAttribPointer(textureHandle, 2, GLES20.GL_FLOAT, false, 8, textureBuffer);
1) 为什么要使用缓冲方法?仅当我的数据碰巧堆叠在一个数组中?
2) OpenGL 如何在幕后处理这些直接(非缓冲)函数?我看到它调用了glVertexAttribPointerBounds——它实际上是把它堆在一起形成一个字节数组吗?
3) 如果我将数组绑定到GL_ARRAY_BUFFER - 这意味着我必须使用堆叠数组版本,并且我将无法再传递直接对象,对吗?即我不能这样做:
int[] bufferVertices = new int[1];
GLES20.glGenBuffers(1, bufferVertices, 0);
vertexBufferId = bufferVertices[0];
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertexBufferId);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, cubeCoords.length * 4 , vertexBuffer, GLES20.GL_STATIC_DRAW);
GLES20.glVertexAttribPointer(positionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride,0);
GLES20.glVertexAttribPointer(colorHandle, 4, GLES20.GL_FLOAT, false, 16, colorBuffer);
GLES20.glVertexAttribPointer(normalHandle, 3, GLES20.GL_FLOAT, false,12, normalsBuffer);
GLES20.glVertexAttribPointer(textureHandle, 2, GLES20.GL_FLOAT, false,8, textureBuffer);
【问题讨论】:
标签: android opengl-es opengl-es-2.0 vbo