android opengles 手机唤醒后 界面上的图形的贴图都没有了,图形呈白色

libRA_kin 2013-08-12 10:10:48
当手机从锁屏界面解锁后 发现在运行的程序上画出的图形全部变成了白色;
原来图形上的贴图都没有了;
如果 退出程序 再重新打开的话 那么显示正常;

我想锁屏幕的话 应该经过onSurfaceChanged 方法;所以 我怀疑是方法出问题了;
下面贴出 我的renderer 的主要代码


public abstract class AbstractRender implements Renderer{

AnimationCallback mCallback ;
int viewWidth ;
int viewHeight ;
int[] mViewport = null ;

float scale = 0.5f ;
public int[] textures ;
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glEnable(GL10.GL_TEXTURE_2D); //Enable Texture Mapping ( NEW )
gl.glShadeModel(GL10.GL_SMOOTH); //Enable Smooth Shading
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); //Black Background
gl.glClearDepthf(1.0f); //Depth Buffer Setup
gl.glEnable(GL10.GL_DEPTH_TEST); //Enables Depth Testing
gl.glDepthFunc(GL10.GL_LEQUAL); //The Type Of Depth Testing To Do

//Really Nice Perspective Calculations
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
//纹理相关
// IntBuffer textureBuffer = IntBuffer.allocate(6);
// gl.glGenTextures(6, textureBuffer);
//
// textures = textureBuffer.array();
// bindTexture(gl);

}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
viewWidth = width ;
viewHeight = height ;
mViewport = new int[]{0,0,width,height};
Log.d("onSurfaceChanged", "onSurfaceChanged,");
gl.glViewport(0, 0, width, height);
float ratio = (float)width/height;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity(); //Reset The Projection Matrix
gl.glFrustumf(-ratio, ratio, -1, 1, 2, 12);
((CubeActivity)mCallback).mGrabber.getCurrentProjection(gl);
gl.glMatrixMode(GL10.GL_MODELVIEW); //Select The Modelview Matrix
gl.glLoadIdentity(); //Reset The Modelview Matrix
gl.glDisable(GL10.GL_DITHER);
gl.glActiveTexture(GL10.GL_TEXTURE0);
}
float angleX = 30f ;

float angleY = -45f ;

@Override
public void onDrawFrame(GL10 gl) {
if(mCallback != null ){
//Log.d("onDrawFrame", "onDrawFrame");
mCallback.updateTime() ;
mCallback.worldRotate() ;
mCallback.layerRotate() ;
}
gl.glDisable(GL10.GL_DITHER);
// gl.glClearColor(0.5f,0.5f,0.5f,1);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
// 设置观察点位置
GLU.gluLookAt(gl, 0, 0, 1.0f, 0, 0, 0, 0, 1, 0);
gl.glTranslatef(0, 0, -3.0f);
gl.glScalef(scale, scale, scale);
// 旋转魔方,绕X轴旋转30度,然后绕Y轴旋转45度
gl.glRotatef(angleX, 1, 0, 0);
gl.glRotatef(angleY, 0, 1, 0);
gl.glColor4f(0.7f, 0.7f, 0.7f, 1.0f);
// gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
// gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
//
// gl.glEnable(GL10.GL_TEXTURE_2D);
// gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY) ;
//
// gl.glEnable(GL10.GL_CULL_FACE);
// gl.glFrontFace(GL10.GL_CW);
// gl.glShadeModel(GL10.GL_SMOOTH);
// gl.glEnable(GL10.GL_DEPTH_TEST);
((CubeActivity)mCallback).mGrabber.getCurrentModelView(gl);
// 绑定纹理
// gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);
draw(gl);
// 禁用顶点、纹理坐标数组
// gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
// gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
// gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
// gl.glDisable(GL10.GL_DEPTH_TEST);
// gl.glDisableClientState(GL10.GL_CULL_FACE);
//angle++ ;
}

protected abstract void draw(GL10 gl);

public interface AnimationCallback{
void worldRotate();
void layerRotate();
void updateTime();
}

public void setScale(float _scale){
scale = scale *_scale ;
if(scale > 0.85f){
scale = 0.85f ;
}else if(scale < 0.1f){
scale = 0.1f ;
}
//缩放后要重新将立体点转换成2维的平面坐标,因为立方体大小改变了
((CubeActivity)mCallback).isPoint2DProjected = false ;
}
}


说实话 对于有些方法的调用不是很清楚...


下面是 draw方法:

public void draw(GL10 gl,int[] texture){
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
// mIndexBuffer.position(0);
// mVertexBuffer.position(0);
// mColorBuffer.position(0);
// mTextureBuffer.position(0);
// gl.glEnable(GL10.GL_CULL_FACE);
gl.glFrontFace(GL10.GL_CCW);
// gl.glShadeModel(GL10.GL_FLAT);
gl.glCullFace(GL10.GL_BACK);
// gl.glEnable(GL10.GL_DEPTH_TEST); //不会画被挡住的图形部分
// gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);
//gl.glColorPointer(4, GL10.GL_FIXED, 0, mColorBuffer);

//gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextureBuffer);
for(int i = 0 ;i < 27 ;i++){
mWorldCubeList.get(i).draw(gl);
}
// gl.glDisable(GL10.GL_DEPTH_TEST);
// gl.glDisableClientState(GL10.GL_CULL_FACE);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
//gl.glDrawElements(GL10.GL_TRIANGLES, mIndexCount, GL10.GL_UNSIGNED_SHORT, mIndexBuffer);
}



mWorldCubeList.get(i).draw(gl);

再一个draw方法 如下:

public void draw(GL10 gl){

if(this.bInitTexture){
this.loadGLTexture(gl);
bInitTexture = false;
}


//gl.glColor4f(mFaceColor.red, mFaceColor.green, mFaceColor.blue, mFaceColor.alpha);

//if(!mFaceColor .equals(UtilHelper.BLACK) ){
// Enable the texture state
// gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
// Point to our buffers
gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureId);

FloatBuffer textureBuffer = getTextureBuffer();
textureBuffer.position(0);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
//}else{
//}

ShortBuffer indicesBuffer = getIndicesBuffer();
indicesBuffer.position(0);
gl.glDrawElements(GL10.GL_TRIANGLE_STRIP, 4, GL10.GL_UNSIGNED_SHORT, indicesBuffer);
// if (!mFaceColor .equals(UtilHelper.BLACK)) {
//gl.glDisable(GL10.GL_TEXTURE_2D);
// gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

// }
}



实在不知道 屏幕从锁屏到解锁后 需要处理哪些,怎么 贴图都没了...

望有人 能够解答!!
...全文
305 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
libRA_kin 2013-08-15
  • 打赏
  • 举报
回复
引用 2 楼 wangdong20 的回复:
[quote=引用 1 楼 wangdong20 的回复:] 我觉得你需要在AbstractRender类里面重写onResume()方法,用OpenGL对图片重新加载
详细看了下public void onSurfaceCreated(GL10 gl, EGLConfig config) 这个方法,使用OpenGL ES的时候,一旦停止渲染线程,上下文就会丢失,程序里面所用的图片资源会被回收,所以你需要在public void onSurfaceCreated(GL10 gl, EGLConfig config)这个方法里对图片资源进行加载[/quote] 问题找到了,现在才回帖,原来锁屏再解锁后会触发onSurfaceCreated 方法,导致之前初始化的图片资源被回收,而我又没有重新生成那些图片,一直以为锁屏幕解锁只会触发 onSurfaceChanged方法,没想到理解错了 原来不止这一个方法,已经处理好了 谢谢!
wangdong20 2013-08-13
  • 打赏
  • 举报
回复
引用 1 楼 wangdong20 的回复:
我觉得你需要在AbstractRender类里面重写onResume()方法,用OpenGL对图片重新加载
详细看了下public void onSurfaceCreated(GL10 gl, EGLConfig config) 这个方法,使用OpenGL ES的时候,一旦停止渲染线程,上下文就会丢失,程序里面所用的图片资源会被回收,所以你需要在public void onSurfaceCreated(GL10 gl, EGLConfig config)这个方法里对图片资源进行加载
wangdong20 2013-08-13
  • 打赏
  • 举报
回复
我觉得你需要在AbstractRender类里面重写onResume()方法,用OpenGL对图片重新加载

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧