VBO - 我可以在初始化时做啥?
Posted
技术标签:
【中文标题】VBO - 我可以在初始化时做啥?【英文标题】:VBO - What can I do at initialization?VBO - 我可以在初始化时做什么? 【发布时间】:2013-04-24 03:45:33 【问题描述】:我有一个与 [x, y, z, textureX, textureY,.....] 交错的 VBO,所有这些都可以正常工作和显示。我试图弄清楚在初始化时可以做什么并忘记了。
这是我目前在初始化时尝试的。
已编辑:修复了我的缓冲区的解除绑定并移动了一些代码。
mPositionHandle = GLES20.glGetAttribLocation(mProgramHandle, "vPosition");
mTextureUniformHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_Texture");
mTextureCoordinateHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_TexCoordinate");
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, glBufferObjects.get(0));
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, interleavedBuffer.capacity() * BYTES_PER_FLOAT, interleavedBuffer, GLES20.GL_STATIC_DRAW);
//////////These are superfluous but I'd like to do them once since they never change/////
GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle);
GLES20.glVertexAttribPointer(mTextureCoordinateHandle, mTextureCoordinateDataSize, GLES20.GL_FLOAT, false,
INTERLEAVED_VERTEX_TEXTURE_STRIDE, 3 * BYTES_PER_FLOAT);
GLES20.glEnableVertexAttribArray(mPositionHandle);
GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false,
INTERLEAVED_VERTEX_TEXTURE_STRIDE, 0);
////////////////////////////////////////////////////
mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "uMVPMatrix");
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, glBufferObjects.get(1));
GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER,
drawListBuffer.capacity() * BYTES_PER_SHORT,
drawListBuffer,
GLES20.GL_STATIC_DRAW);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
这是有效的。我弄乱了一堆,但我不知道每个并条机需要什么,因为它需要或者我做错了。任何帮助将不胜感激。
public void draw(float[] mvpMatrix)
GLES20.glUseProgram(mProgramHandle);
GLES20.glUniform1i(mTextureUniformHandle, 0);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureDataHandle);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, glBufferObjects.get(0));
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, glBufferObjects.get(1));
GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle);
GLES20.glVertexAttribPointer(mTextureCoordinateHandle, mTextureCoordinateDataSize, GLES20.GL_FLOAT, false,
INTERLEAVED_VERTEX_TEXTURE_STRIDE, 3 * BYTES_PER_FLOAT);
GLES20.glEnableVertexAttribArray(mPositionHandle);
GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false,
INTERLEAVED_VERTEX_TEXTURE_STRIDE, 0);
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_SHORT, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
编辑:更新 - 如果我删除
GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle);
GLES20.glVertexAttribPointer(mTextureCoordinateHandle, mTextureCoordinateDataSize, GLES20.GL_FLOAT, false,
INTERLEAVED_VERTEX_TEXTURE_STRIDE, 3 * BYTES_PER_FLOAT);
GLES20.glEnableVertexAttribArray(mPositionHandle);
GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false,
INTERLEAVED_VERTEX_TEXTURE_STRIDE, 0);
从我的 draw() 中它会抛出一个 gl_draw_error_checks:418: GL_INVALID_OPERATION
【问题讨论】:
“这就是有效的” - 什么不“有效”(以及以何种方式)? 删除 glVertexAttribPointer 或在初始化时分配它而不是按并条框放置它不会显示我的对象。我打算出去说需要的东西是 useProgram + glBindBuffer(GLES20.GL_ARRAY_BUFFER, + glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER + glDrawElements。我一直在寻找,也许我正在寻找的是一个顶点数组对象? 我希望并条机只调用所需的准系统。 我一直在研究,看起来我不应该将句柄传递给 glEnableVertexAttribArray,我应该生成它们......也许吧。 【参考方案1】:如果您不使用扩展,则每帧都需要调用 glEnableVertexAttribArray 和 glVertexAttribPointer。
但是,如果扩展 OES_vertex_array_object 可用,那么您可以使用顶点数组对象将此信息与 VBO 数据一起存储。那么你只需要每帧调用 glBindVertexArray 和 glDrawArrays 即可。
【讨论】:
以上是关于VBO - 我可以在初始化时做啥?的主要内容,如果未能解决你的问题,请参考以下文章