3

Android用のOpengl-esを使用してビデオゲームを開発しています。背景の色を描画するため、使用する画像の背景に問題があります。

ここで私のレンダラー:

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {

    //Initialize GL:                
    gl.glDisable(GL10.GL_DITHER);
    gl.glEnable(GL10.GL_TEXTURE_2D);            //Enable Texture Mapping ( NEW )
    gl.glShadeModel(GL10.GL_SMOOTH);            //Enable Smooth Shading
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    //Black Background
    gl.glClearDepthf(1.0f);                     //Depth Buffer Setup
    gl.glEnable(GL10.GL_DEPTH_TEST);            //Enables Depth Testing
    gl.glEnable(GL10.GL_CULL_FACE);
    gl.glDepthFunc(GL10.GL_LEQUAL);             //The Type Of Depth Testing To Do
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); //Really Nice Perspective Calculations //<---- SI LAG, probar GL_FASTEST

    LoadTextures(gl);
}

ここで描画方法:

@Override
public void onDrawFrame(GL10 gl) {

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glEnable(GL10.GL_BLEND);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glLoadIdentity();

    for(Entity e : entities)
    {
        if(e.IsActive())
        {
            gl.glPushMatrix();
                e.Draw(gl);
            gl.glPopMatrix();
        }
    }

    gl.glDisable(GL10.GL_BLEND);        
    isDrawing = false;
}

そして、各エンティティの draw メソッド:

gl.glColor4f(red, green, blue, alpha);

    // bind the previously generated texture
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    // Point to our vertex buffer
    gl.glVertexPointer(2, GL10.GL_FLOAT, 0, screenBuffer); //2 dimensiones
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

    // Draw the vertices as triangle strip
    gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4); //12 /3 -> 12 es el tamano del vector de vertices del cuadrado

    //Disable the client state before leaving
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

私はGLSurfaceViewにもこれを持っています:

setEGLConfigChooser(8,8,8,8,16,0);
    renderer = new GRenderer(c);
    setRenderer(renderer);        
    setRenderMode(RENDERMODE_WHEN_DIRTY);
    getHolder().setFormat(PixelFormat.TRANSLUCENT);
    setZOrderOnTop(true);

しかし、うまくいきません。半透明の背景を実現するには、どの色を使用すればよいですか? コードにエラーはありますか?ありがとう

4

1 に答える 1

2

アルファ版を達成するには、コードは OpenGL 呼び出しに関して問題ないようです。

ただし、画像の場合:

1) 画像にアルファ チャネルを焼き付ける必要があります。RGB では対応できません。RGBA が必要です。これは、Photoshop、Gimp、またはその他の画像エディターなどで簡単に修正できます。

2)半透明が必要な場合は、アルファチャンネルを中間値に設定し、RGBを「半透明」のブレンドカラーにしたい色に設定することをお勧めします。または、フラグメント シェーダーでカスタム ブレンディング関数を作成して、アルファ チャネルで特別なことを行うこともできます。

于 2012-10-29T22:06:52.610 に答える