我最近开始用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, 0);
gl.glClearColor(0.0f, 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, 0, _spriteVerices);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glTexCoordPointer(2, GL10.GL_SHORT, 0, 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, 1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 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, 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, 0, -5);
gl.glRotatef(30f, 1, 0, 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, 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);
}
谢谢,
答案 0 :(得分:2)
如果你确定你设置了正确的开放式,那么更常见的是问题不在于你在哪里画画。您可能正在绘制视图的范围。你的翻译要非常小心。
你也可能需要翻转你的聚合物,我知道在你看到它之前我已经遇到了这个问题,因为你的画面背对着你。
当我这样做时,我的抽奖看起来与此非常相似
* This is where you draw the screen, called every auto onDraw Loop pass
* ************************************************************************/
//Log.d("Game", "Render");
gl.glViewport(0, 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, 0, Screen.HEIGHT_SCALE, 1, -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,y,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,0)
mRect.Draw(GL10.GL_TRIANGLES, gl); //Finally tell that rectangle to draw
gl.glPopMatrix();
***********************************************************************************************************************
当然这是ortho,你的看起来是3d,但基本应该是差不多的。