Android:Adreno GPU上的奇怪纹理

时间:2014-01-16 13:46:49

标签: android opengl-es

我遇到的问题是,在我的2台Qualcomm设备(Adreno 320(Android 4.4.2)和205(4.0.4))上严格绘制了纹理。

看起来像这样:

Optimus G-Pro

但是在注2中它看起来应该是:

Note 2

该应用程序基于OpenGL ES 1.0,因为它只是简单的2D

我的代码:

渲染类:

public void onSurfaceCreated(GL10 gl, EGLConfig arg1) {
        gl.glClearColor(0f, 0f, 0f, 1f);
        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glShadeModel(GL10.GL_SMOOTH);

        gl.glDepthFunc(GL10.GL_LEQUAL);
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);

    }

    @Override
    public void onSurfaceChanged(GL10 gl, int arg1, int arg2) {

        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glDisable(GL10.GL_DEPTH_TEST);

        //gl.glEnable(GL10.GL_ALPHA);
        gl.glEnable(GL10.GL_BLEND);
        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
        gl.glEnable(GL10.GL_ALPHA_TEST);
        gl.glAlphaFunc(GL10.GL_GREATER, 0.1f);

        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glOrthof(-1f, 1f, -1f, 1f, -1f, 1f);
    }

网-超类:

绘图方法(主要部分):

            gl.glFrontFace(GL10.GL_CCW);

            gl.glEnable(GL10.GL_CULL_FACE);

            gl.glCullFace(GL10.GL_BACK);

            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

            gl.glVertexPointer(2, GL10.GL_FLOAT, 0, verticesBuffer);

            gl.glColor4f(rgba[0], rgba[1], rgba[2], rgba[3]);

            if (colorBuffer != null) {
                gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
                gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);
            }

            if (!textureLoaded) {
                loadGLTexture(gl);
                textureLoaded = true;
            }
            if (textureID != -1 && textureBuffer != null) {
                gl.glEnable(GL10.GL_TEXTURE_2D);
                gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

                gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
                gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID);
            }

            gl.glTranslatef(tx, ty, tz);
            gl.glRotatef(rx, 1, 0, 0);
            gl.glRotatef(ry, 0, 1, 0);
            gl.glRotatef(rz, 0, 0, 1);

            gl.glDrawElements(GL10.GL_TRIANGLES, numberOfIndices,
                    GL10.GL_UNSIGNED_SHORT, indexBuffer);
            gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

            if (textureID != -1 && textureBuffer != null) {
                gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
            }

            gl.glDisable(GL10.GL_CULL_FACE);


protected void loadGLTexture(GL10 gl) {
        int[] textures = new int[1];
        gl.glGenTextures(1, textures, 0);
        textureID = textures[0];

        gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID);

        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
                GL10.GL_LINEAR);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
                GL10.GL_LINEAR);

        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
                GL10.GL_CLAMP_TO_EDGE);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
                GL10.GL_REPEAT);

        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
    }

public void setTextureCoordinates(float[] textureCoords) {
        ByteBuffer byteBuf = ByteBuffer.allocateDirect(textureCoords.length * 4);
        byteBuf.order(ByteOrder.nativeOrder());
        textureBuffer = byteBuf.asFloatBuffer();
        textureBuffer.put(textureCoords);
        textureBuffer.position(0);
    }

我认为这一切都是相关的。

0 个答案:

没有答案
相关问题