4

最近、Android で OpenGLES の学習を開始しました。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);
}

ありがとう、

4

1 に答える 1

2

If you are sure you set up open gl right, then more often then not the problem is where you are drawing. You could be drawing out of the range of the view. Be very careful with your translates and such.

You also may need to flip your poly, I know I have had that issue before where you are looking right through it because your drawing is facing its back to you.

when I did this my draw looked very similar to this

*  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();
        ***********************************************************************************************************************

of course this is ortho, and yours looks to be 3d, but the basics should be near the same.

于 2012-12-06T09:05:00.643 に答える