【发布时间】:2013-10-29 07:11:36
【问题描述】:
嘿嘿,
我正在使用 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)?
【问题讨论】:
-
你想要的是实例化渲染。 GLES 2.0 没有它,但是如果您向顶点数组添加额外的顶点属性,您可以伪造它。添加一个表示顶点 ID 的 GLubyte,然后通过一些巧妙的工作,您可以在编译时选择适当的矩阵统一。它不会像真正的实例化,但您可能无需进行多次绘制调用就可以逃脱。
-
你能详细解释一下吗?例如,假设我有 1 个带有 2 个顶点的对象,我想用 MVP 将其转换为 2 个位置。如何让“gl_Position”同时在 2 个不同的地方绘制?
标签: android optimization opengl-es-2.0 sprite