如何将纹理应用于Android中的顶点缓冲区对象?
答案:
代码工作正常,但缺少对
的调用glEnable(GL_TEXTURE_2D);
这和
的召唤glEnableClientState(GL_TEXTURE_COORD_ARRAY);
为了使顶点缓冲区对象绘制纹理,都是必需的。
问题:
据我所知,首先你必须创建一个NIO缓冲区:
ByteBuffer tbb = ByteBuffer.allocateDirect(texCoords.length * 4);
tbb.order(ByteOrder.nativeOrder());
FloatBuffer textureBuffer = tbb.asFloatBuffer();
textureBuffer.put(texCoords);
textureBuffer.position(0);
在此代码示例中,数组 texCoords 包含2分量(s,t)纹理数据。
创建NIO缓冲区后,需要将其传递给opengl并创建顶点缓冲区对象:
int[] id = new int[1];//stores the generated ID.
gl11.glGenBuffers(1, id, 0);
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, id[0]);
gl11.glBufferData(GL11.GL_ARRAY_BUFFER, texCoords.length * 4, textureBuffer, GL11.GL_STATIC_DRAW);
这样可以处理所有的初始化。接下来我们需要绘制它,我们这样做:
gl11.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY);//enable for textures
gl11.glActiveTexture(GL11.GL_TEXTURE0);
//lets pretend we created our texture elsewheres and we have an ID to represent it.
gl11.glBindTexture(GL11.GL_TEXTURE_2D, textureId);
//Now we bind the VBO and point to the buffer.
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, id[0])//the id generated earlier.
gl11.glTexCoordPointer(2, GL11.GL_FLOAT, 0, 0);//this points to the bound buffer
//Lets also pretend we have our Vertex and Index buffers specified.
//and they are bound/drawn correctly.
所以即使这是我认为为了让OpenGL绘制纹理所需要的,我有一个错误,只有一个红色三角形(没有我调制的石头纹理)呈现。
答案 0 :(得分:1)
需要调用VBO的两个函数来启用纹理。
gl.glEnable(GL11.GL_TEXTURE_2D); gl.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY);