我的应用每秒生成25位图(1080 * 1920),我尝试通过将它们转换为纹理(调用createTexture()
)来渲染它们,然后使用默认渲染模式(调用OnDrawFrame()
50每秒一次)。但是,我的应用程序在启动后几秒钟就崩溃了。以这种方式使用OpenGL ES是否正确?或者有没有更好的方法来有效地渲染位图?
我渲染的主要代码如下:
public abstract class BaseRenderer implements GLSurfaceView.Renderer{
public BaseRenderer(Context context, String vertex, String fragment){
...
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
GLES20.glClearColor(1.0f,1.0f,1.0f,1.0f);
GLES20.glEnable(GLES20.GL_TEXTURE_2D);
mProgram= ShaderUtils.createProgram(mContext.getResources(),vertex,fragment);
glHPosition=GLES20.glGetAttribLocation(mProgram,"vPosition");
glHCoordinate=GLES20.glGetAttribLocation(mProgram,"vCoordinate");
glHTexture=GLES20.glGetUniformLocation(mProgram,"vTexture");
glHMatrix=GLES20.glGetUniformLocation(mProgram,"vMatrix");
onDrawCreatedSet(mProgram);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
...
}
@Override
public void onDrawFrame(GL10 gl) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT|GLES20.GL_DEPTH_BUFFER_BIT);
GLES20.glUseProgram(mProgram);
onDrawSet();
GLES20.glUniformMatrix4fv(glHMatrix,1,false,mMVPMatrix,0);
GLES20.glEnableVertexAttribArray(glHPosition);
GLES20.glEnableVertexAttribArray(glHCoordinate);
GLES20.glUniform1i(glHTexture, 0);
textureId=createTexture();
GLES20.glVertexAttribPointer(glHPosition,2,GLES20.GL_FLOAT,false,0,bPos);
GLES20.glVertexAttribPointer(glHCoordinate,2,GLES20.GL_FLOAT,false,0,bCoord);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP,0,4);
}
public abstract void onDrawSet();
public abstract void onDrawCreatedSet(int mProgram);
private int createTexture(){
int[] texture=new int[1];
if(mBitmap!=null&&!mBitmap.isRecycled()){
GLES20.glGenTextures(1,texture,0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,texture[0]);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_NEAREST);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_NEAREST);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_CLAMP_TO_EDGE);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, mBitmap, 0);
return texture[0];
}
return 0;
}
}