嘿嘿,
我正在用 OpenGL ES 2.0 为 Android 创建简单的游戏。游戏将包含几种不同的精灵,但这些精灵会不止一次出现。
现在假设我有 1 个对象(精灵)。到目前为止,我已经实现了 VBO 和索引缓冲,因此据我所知,整个对象都存储在 GPU 上。
我现在想做的是多次绘制这个对象,只是它的位置不同。就目前而言,这是按如下方式实现的:
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer.getBufferId());
for(int i=0; i<1000; i++){
multiplyMM(MVP, 0, viewMatrix, 0, tempGetRandomMVPMatrix(), 0);
glUniformMatrix4fv(uMatrixLocation, 1, false, MVP, 0);//TODO
if(androidVersion > Build.VERSION_CODES.FROYO)
glDrawElements(GL_TRIANGLES, indexArray.length, GL_UNSIGNED_SHORT, 0);
else{
if(repairedGL20 == null){
repairedGL20 = new AndroidGL20();
}
repairedGL20.glDrawElements(GL_TRIANGLES, indexArray.length, GL_UNSIGNED_SHORT, 0);
}
}
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
如果我理解正确,主要问题是调用 glDrawElements ,每次更改 MVP 矩阵时都会调用它。有什么方法可以将所有 MVP 矩阵发送到 GPU 并在那里多次绘制一个元素,而只需调用 1 次 glDrawElements?
有关对象的更多信息。它有大约 24 个顶点和 64x64 纹理。目前有 1k 个对象,我有 35FPS,我想获得更高的 fps,因为我将绘制更多的精灵。
这是我的着色器: 顶点:
uniform mat4 u_Matrix;
attribute vec4 a_Position;
attribute vec2 a_TextureCoordinates;
varying vec2 v_TextureCoordinates;
void main(){
v_TextureCoordinates = a_TextureCoordinates;
gl_Position = u_Matrix * a_Position;
}
分段:
precision mediump float;
uniform sampler2D u_TextureUnit;//actual texture data
varying vec2 v_TextureCoordinates;
void main(){
gl_FragColor = texture2D(u_TextureUnit, v_TextureCoordinates);
}
还有一件事我不太了解纹理。如果我创建这样的纹理:
glBindTexture(GL_TEXTURE_2D, textureObjectIds[0]);//binds texture to texture object
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);//minimization filter
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
texImage2D(GL_TEXTURE_2D, 0, bitmap, 0);//send texture data to OpenGL to the CURRENTLY BOUND object
当我将使用此纹理绘制对象时,纹理保存在哪里,在 CPU 的内存或 GPU 上?此外,在上面的示例中,我正在绘制相同的精灵,每次绘制调用是否都会将纹理发送到 GPU?如果是这样,有没有办法优化它(类似于 VBO)?