我是,是OpenGL的新手。
我试图画纹理四角(两个三角形)。织构尺寸为900×900 is。我对一个四边形没有问题,但当我试图画5-10个四边形时,我看到明显的减速。
也许我做错了什么..。
代码:
public void onDrawFrame(GL10 gl) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
... matrix calculation ...
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
}顶点着色器:
uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
attribute vec2 a_TexCoordinate;
varying vec2 v_TexCoordinate;
void main() {
gl_Position = uMVPMatrix*vPosition;
v_TexCoordinate = a_TexCoordinate;
}碎片着色器:
precision mediump float;
uniform sampler2D u_PreviewTexture;
varying vec2 v_TexCoordinate;
void main() {
vec4 color = texture2D(u_PreviewTexture, v_TexCoordinate);
gl_FragColor = color;
}测试平台是Galaxy S3。在分析器中,我看到大约60 In接受eglSwapBuffers调用。
如何快速绘制大纹理的四角体?
发布于 2013-02-22 14:21:45
这可能是由于您的纹理大小和您正在使用的设备的OpenGL驱动程序实现。
大多数现代GPU在NPOT (没有两种力量)纹理方面做得很好,但是这会导致纹理的重新缩放,每次它需要被绘制到最接近的2的幂(在你的例子中是1024X1024)。
尝试使用以下2种解决方案:
1-将纹理转换为1024x1024,并使用几何中的坐标只绘制所需的(900x900)。
2-尝试生成mipmap,如果您有大量放大,这是一个性能救星在许多情况下。
发布于 2013-02-25 11:22:08
您的S3可能有大约6亿像素/秒的填充率(参见GLBenchmark)。如果你渲染全屏四角体-十个双纹理四边形,每帧提供20M纹理。假设GLBenchmark按它所说的(测量纹理吞吐量),20M纹理是填充率的1/30,给出33 is的最佳,hw可以处理一个帧。框架缓冲区混合,我相信积极竞争的填充率-10百万像素混合是相当多,所以我可以猜测瓶颈也可能在那里。
您可以尝试确定什么是慢部分--减少纹理大小,例如,512x512,并查看它如何影响性能。减少渲染的四角体的屏幕尺寸(相当大,就像纹理一样--例如,使其成为屏幕的一半/四分之一)。
发布于 2013-03-02 23:50:35
根据我的经验,纹理性能问题通常源于MIPMAP滤波的设置。如果没有最优地设置下列参数(所显示的最小设置),则可能会丢失许多性能:
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
如果可能,请尝试禁用深度测试。@marekb关于纹理压缩的建议也提供了很多性能上的好处。
https://stackoverflow.com/questions/14995181
复制相似问题