Проблема устройства 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, но основы должны быть примерно одинаковыми.

Другие вопросы по тегам