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

如果您确定您正确设置了 open gl,那么更多时候问题就不是您在哪里绘制了。您可能会超出视图范围。对你的翻译等要非常小心。

你可能还需要翻转你的多边形,我知道在你直接看它之前我就遇到过这个问题,因为你的绘图背对着你。

当我这样做时,我的抽奖看起来与此非常相似

*  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,但基本应该差不多。

于 2012-12-06T09:05:00.643 回答