Я пытаюсь понять отношения между [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);