我最近开始用
Android学习OpenGLES.我正在创建一个带有渲染的GLWallpaperService类的livewallpaper.
Android模拟器的问题是能够显示动画,但在使用Android设备(HTC Incredible S)进行测试时,FPS保持在45-50左右,但屏幕仍为空白.
这是代码片段!!
onDrawFrame
public void onDrawFrame(GL10 gl) { float currLevel = curve[(MAX_CURVE_POINT_NO + curveStart - 1) % MAX_CURVE_POINT_NO]; if (!isCreated) { isCreated = !isCreated; _spriteVerices = BufferFactory.createFloatBuffer(8); spriteTextCordinates = BufferFactory.createShortBuffer(8); } _spriteVerices.put(spriteVerices); spriteTextCordinates.put(spriteTextCordinatesArray); _spriteVerices.position(0); spriteTextCordinates.position(0); gl.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE_MINUS_SRC_ALPHA); gl.glEnable(GL10.GL_BLEND); gl.glEnable(GL10.GL_DEPTH_TEST); gl.glEnable(GL10.GL_LINE_SMOOTH); gl.glEnable(GL10.GL_POINT_SMOOTH); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); gl.glOrthof(-1.0f,1.0f,-1.5f,1.5f,-1.0f,1.0f); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); gl.glScalef(0.8f,0.8f,1.0f); gl.glTranslatef(-0.2f,0); gl.glClearColor(0.0f,0.0f,1.0f); gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glEnable(GL10.GL_TEXTURE_2D); gl.glVertexPointer(2,GL10.GL_FLOAT,_spriteVerices); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glTexCoordPointer(2,GL10.GL_SHORT,spriteTextCordinates); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glPushmatrix(); gl.glTranslatef(1.0f,currLevel,-0.01f); gl.glColor4f(0.0f,0.5f,1.0f); gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,4); gl.glPopMatrix(); curve[curveStart] = ekgMap[curveStart]; // ((rand()%32768)/32768.0)*0.4-0.2; curveStart = (curveStart + 1) % MAX_CURVE_POINT_NO; }
onSurfaceChanged
public void onSurfaceChanged(GL10 gl,int width,int height) { gl.glViewport(0,width,height); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); glu.gluPerspective(gl,60f,(float) width / (float) height,1f,100f); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glTranslatef(0,-5); gl.glrotatef(30f,1,0); gl.glEnable(GL10.GL_LIGHTING); gl.glEnable(GL10.GL_RESCALE_norMAL); gl.glEnableClientState(GL10.GL_norMAL_ARRAY); // Set the color of light bouncing off of surfaces to respect the // surface color gl.glEnable(GL10.GL_COLOR_MATERIAL); setupLightSources(gl); // Turn on a global ambient light. The "Cosmic Background Radiation",if // you will. float[] ambientLightRGB = { 0.3f,0.3f,1.0f }; gl.gllightmodelfv(GL10.GL_LIGHT_MODEL_AMBIENT,ambientLightRGB,0); }
onSurfaceCreated
public void onSurfaceCreated(GL10 gl,EGLConfig config) { this.loadTexture(gl,mContext,R.drawable.dot); gl.glClearDepthf(1f); gl.glEnable(GL10.GL_DEPTH_TEST); gl.glDepthFunc(GL10.GL_LEQUAL); // Turn on culling,so OpenGL only draws one side of the primitives gl.glEnable(GL10.GL_CULL_FACE); gl.glFrontFace(GL10.GL_ccw); gl.glCullFace(GL10.GL_BACK); gl.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE_MINUS_SRC_ALPHA); gl.glEnable(GL10.GL_BLEND); gl.glEnable(GL10.GL_DEPTH_TEST); gl.glEnable(GL10.GL_LINE_SMOOTH); gl.glEnable(GL10.GL_POINT_SMOOTH); }
谢谢,
解决方法
如果你确定你设置了正确的开放,那么更常见的是问题不在于你正在绘制的地方.您可能正在绘制视图的范围.你的翻译要非常小心.
您也可能需要翻转您的聚合物,我知道在您正在查看它之前我遇到过这个问题,因为您的绘图正面向它.
当我这样做时,我的画面与此非常相似
* This is where you draw the screen,called every auto onDraw Loop pass * ************************************************************************/ //Log.d("Game","Render"); gl.glViewport(0,Screen.SCREEN_WIDTH,Screen.SCREEN_HEIGHT); gl.glClear(GL10.GL_COLOR_BUFFER_BIT); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); gl.glOrthof(0,Screen.WIDTH_SCALE,Screen.HEIGHT_SCALE,-1); //gl.gltranslatef(x,y,z) will translate everything drawn here after by that amount,effectively scrolling the view. gl.glEnable(GL10.GL_BLEND); gl.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE_MINUS_SRC_ALPHA); gl.glEnable(GL10.GL_TEXTURE_2D); MeshRect mRect; // this holds all of our rectangles gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); /***************** so this is how it goes for rendering any object **************************************************** ball.Update(deltaTime); //first update the object gl.glPushmatrix(); gl.glLoadIdentity(); gl.glTranslate(x,z); texture.bind(gl,Texture.TEXTURE_BALL2); //then bind the texture we would like to use mRect = new MeshRect(ball.getMyRect()); //then create the rectangle at (0,0) mRect.Draw(GL10.GL_TRIANGLES,gl); //Finally tell that rectangle to draw gl.glPopMatrix(); ***********************************************************************************************************************
当然这是ortho,你的看起来是3d,但基本应该是相同的.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。