OpenGL-渲染纹理与transapare

时间:2015-08-23 07:02:27

标签: android opengl-es

我有一个png图像,它在opengl中绘制到我的矩形网格中,问题是图像背景是透明的,但是当我将它绑定到我的网格时,它的背景变白;我希望图像背景仍然是透明的。 我尝试了glEnableClientState(GLES10.GL_COLOR_ARRAY);glColorPointer,但没有按照我的意愿工作。

enter image description here

更新: 渲染openGL代码:

void render(GL10 gl){

    // First allocate texture if there is not one yet.
    if (DRAW_TEXTURE && mTextureIds == null) {
        // Generate texture.
        mTextureIds = new int[2];
        gl.glGenTextures(2, mTextureIds, 0);
        for (int textureId : mTextureIds) {
            // Set texture attributes.
            gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
            gl.glTexParameterf(GL10.GL_TEXTURE_2D,
                    GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
            gl.glTexParameterf(GL10.GL_TEXTURE_2D,
                    GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
            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_CLAMP_TO_EDGE);
        }
    }

    if (DRAW_TEXTURE && mPage.getTexturesChanged()) {
        gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureIds[0]);
        Bitmap texture = mPage.getTexture(mTextureRectFront,
                CurlPage.SIDE_FRONT);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, texture, 0);
        texture.recycle();

        mTextureBack = mPage.hasBackTexture();
        if (mTextureBack) {
            gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureIds[1]);
            texture = mPage.getTexture(mTextureRectBack,
                    CurlPage.SIDE_BACK);
            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, texture, 0);
            texture.recycle();
        } else {
            mTextureRectBack.set(mTextureRectFront);
        }

        mPage.recycle();
        reset();
    }




    // Some 'global' settings.
    gl.glEnableClientState(GLES10.GL_VERTEX_ARRAY);

    if (DRAW_TEXTURE) {
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mBufTexCoords);
    }
    gl.glVertexPointer(3, GLES10.GL_FLOAT, 0, mBufVertices);
    //inja khasiate transparent ro faAl mikonim ke betoonim too CurlPage be kaaghaz alpha bedim
    gl.glEnable(GLES10.GL_BLEND);
    gl.glBlendFunc(GLES10.GL_SRC_ALPHA, GLES10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glDisable(GLES10.GL_LIGHTING);
    gl.glDisable(GL10.GL_TEXTURE_2D);

    gl.glDrawArrays(GLES10.GL_TRIANGLE_STRIP, 0, mVerticesCountFront);

    // Draw front facing texture.
    if (DRAW_TEXTURE) {
        gl.glEnable(GL10.GL_BLEND);
        gl.glEnable(GL10.GL_TEXTURE_2D);

        if (!mFlipTexture || !mTextureBack) {
            gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureIds[0]);
        } else {
            gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureIds[1]);
        }

        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, mVerticesCountFront);

        gl.glDisable(GL10.GL_BLEND);
        gl.glDisable(GL10.GL_TEXTURE_2D);
    }

    int backStartIdx = Math.max(0, mVerticesCountFront - 2);
    //Log.d("mVerticesCountFront", ""+mVerticesCountFront+"");
    int backCount = mVerticesCountFront + mVerticesCountBack - backStartIdx;

    // Draw back facing blank vertices.
    //gl.glColor4f(1.0f, 0.0f, 0.0f, 0.5f);
    gl.glDrawArrays(GLES10.GL_TRIANGLE_STRIP, backStartIdx, backCount);


    // Disable textures and color array.
    gl.glDisableClientState(GLES10.GL_TEXTURE_COORD_ARRAY);

    gl.glDisableClientState(GLES10.GL_VERTEX_ARRAY);
}

OnSurfaceCreated方法:

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
//  mCurlMesh.setup(gl);
    gl.glClearColor(0f, 0f, 0f, 0f);
    gl.glShadeModel(GL10.GL_SMOOTH);
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
    gl.glHint(GL10.GL_LINE_SMOOTH_HINT, GL10.GL_NICEST);
    //gl.glHint(GL10.GL_POLYGON_SMOOTH_HINT, GL10.GL_NICEST);
    gl.glEnable(GL10.GL_LINE_SMOOTH);
    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glDisable(GL10.GL_CULL_FACE);
    gl.glDisable(GL10.GL_DITHER);



}

0 个答案:

没有答案