Проблема устройства Android OpenGLES
Я недавно начал изучать OpenGLES с Android. Я создаю livewallpaper с классом GLWallpaperService с рендерингом.
Проблема с симулятором 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);
}
Спасибо,
1 ответ
Если вы уверены, что настроили open gl right, то чаще всего проблема не в том, где вы рисуете. Вы могли бы вытягивать из диапазона зрения. Будьте очень осторожны с вашими переводами и тому подобным.
Вам также может понадобиться перевернуть вашу поли, я знаю, что у меня была такая проблема раньше, когда вы смотрите сквозь нее, потому что ваш рисунок обращен к вам спиной.
когда я сделал это, моя ничья выглядела очень похоже на это
* 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();
***********************************************************************************************************************
Конечно, это орто, и ваш, кажется, 3D, но основы должны быть примерно одинаковыми.