2012-03-06 12 views
2

現在、OpenGL ES 2.0を使用してAndroid用ゲームを開発中です。私はテクスチャと頂点の色を扱うことがほとんどありますが、テクスチャで透明を使用すると透明部分が点になります。 Dotted transparency透明度ドット付きOpenGL ES 2.0

現在表示されているボウル(青色の円)には、現在、彼の目の上に3つの面があり、目、口、歯があります。すべてのレイヤーが同じ大きさと透明度を持っていて、追加するレイヤーが増えれば点滅が悪化するようです。これは、レンダラののonCreateメソッドです:

mMVPMatrix = new float [16]; 
    mViewMatrix = new float [16]; 
    mProjectionMatrix = new float [16]; 
    mModelMatrix = new float [16]; 

    Matrix.setLookAtM(mViewMatrix, 0, 0.0f, 0.0f, mZoom, 0.0f, 0.0f, -0.1f, 0.0f, 1.0f, 0.0f); 
    Matrix.setIdentityM(mModelMatrix, 0); 

    mTexturePointer = new int [32]; 

    loadTextures(); 

    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    mShaderPointer = loadProgram(); 

    GLES20.glEnable(GLES20.GL_BLEND); 
    GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

    GLES20.glUseProgram(mShaderPointer); 

    mMVPMatrixPointer = GLES20.glGetUniformLocation(mShaderPointer, "uMVPMatrix"); 
    mPositionPointer = GLES20.glGetAttribLocation(mShaderPointer, "a_position"); 
    mTexCoordPointer = GLES20.glGetAttribLocation(mShaderPointer, "a_texCoord"); 
    mSamplerPointer = GLES20.glGetUniformLocation(mShaderPointer, "s_texture"); 
    mColorPointer = GLES20.glGetAttribLocation(mShaderPointer, "a_color"); 

これは、フラグメントシェーダである:

   "precision mediump float;           \n" 
      + "uniform sampler2D s_texture;             \n" 
      + "                    \n" 
      + "varying vec4 v_color;              \n" 
      + "varying vec2 v_texCoord;              \n" 
      + "                    \n" 
      + "void main()                 \n" 
      + "{                   \n" 
      + "                    \n" 
      + "  vec4 final_color = vec4(texture2D(s_texture, v_texCoord).r * v_color.r, " 
      + "        texture2D(s_texture, v_texCoord).g * v_color.g, " 
      + "        texture2D(s_texture, v_texCoord).b * v_color.b, " 
      + "        texture2D(s_texture, v_texCoord).a + v_color.a);\n" 
      + "                    \n" 
      + "  //Set the Fragments colour            \n" 
      + "  gl_FragColor = final_color;            \n" 
      + "}                   \n"; 

と頂点シェーダ:

   "attribute vec4 a_position;  \n" 
      + "uniform mat4 uMVPMatrix;      \n" 
      + "            \n" 
      + "attribute vec2 a_texCoord;     \n" 
      + "attribute vec4 a_color;      \n" 
      + "            \n" 
      + "varying vec4 v_color;      \n" 
      + "varying vec2 v_texCoord;      \n" 
      + "            \n" 
      + "void main()         \n" 
      + "{           \n" 
      + " gl_Position = uMVPMatrix * a_position; \n" 
      + " v_texCoord = a_texCoord;     \n" 
      + " v_color = a_color;      \n" 
      + "}           \n"; 

そして最後にではなく、少なくとも引き分け(この各オブジェクトの描画方法です):

GLES20.glViewport(0, 0, mScreenWidth, mScreenHeight); 

GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 

protected void draw(GameRenderer aRenderer){ 
    if(mVisible){ 
     // Do the animation. 
     if(mAnimated) 
      animate(); 

     GLES20.glEnableVertexAttribArray(aRenderer.mPositionPointer); 
     GLES20.glEnableVertexAttribArray(aRenderer.mTexCoordPointer); 
     GLES20.glEnableVertexAttribArray(aRenderer.mColorPointer); 

     // Load the texture mapping. 
     mTexture.position(0); 
     GLES20.glVertexAttribPointer(aRenderer.mTexCoordPointer, 2, GLES20.GL_FLOAT, false, 2 * 4, mTexture); 

     // Load the vertex position. 
     mVertices.position(0); 
     GLES20.glVertexAttribPointer(aRenderer.mPositionPointer, 3, GLES20.GL_FLOAT, false, 3 * 4, mVertices); 

     // Load the vertex color. 
     mColor.position(0); 
     GLES20.glVertexAttribPointer(aRenderer.mColorPointer, 4, GLES20.GL_FLOAT, false, 4 * 4, mColor); 

     // Set the texture. 
     GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
     GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, aRenderer.mTexturePointer[mTextureId]); 
     GLES20.glUniform1i(aRenderer.mSamplerPointer, 0); 

     // Calculate stuff. 
     Matrix.multiplyMM(aRenderer.mMVPMatrix, 0, aRenderer.mViewMatrix, 0, aRenderer.mModelMatrix, 0); 
     Matrix.multiplyMM(aRenderer.mMVPMatrix, 0, aRenderer.mProjectionMatrix, 0, aRenderer.mMVPMatrix, 0); 

     GLES20.glUniformMatrix4fv(aRenderer.mMVPMatrixPointer, 1, false, aRenderer.mMVPMatrix, 0); 

     GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_SHORT, mIndices); 

     GLES20.glDisableVertexAttribArray(aRenderer.mPositionPointer); 
     GLES20.glDisableVertexAttribArray(aRenderer.mTexCoordPointer); 
     GLES20.glDisableVertexAttribArray(aRenderer.mColorPointer); 
    } 
} 

loadTextureは()メソッド:

public void loadTextures(){ 

    Log.d("loadTextures()", "Loading textures"); 

    Bitmap tBitmap = null; 

    // Tell OpenGL to generate textures. 
    GLES20.glGenTextures(32, mTexturePointer, 0); 

    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inTempStorage = new byte [16 * 1024]; 
    options.inScaled = false; 

    // TEXTURE 0 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTexturePointer[0]); 

    // Scale up if the texture if smaller. 
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); 
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); 

    tBitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ingame_boll_spritesheet_new_style, options); 

    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, tBitmap, 0); 

    tBitmap.recycle(); 
    // TEXTURE 1 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE1); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTexturePointer[1]); 

    // Scale up if the texture if smaller. 
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); 
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); 

    tBitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ingame_boll_mouth, options); 

    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, tBitmap, 0); 

    tBitmap.recycle(); 

    // And so on for all textures 

    Log.d("loadTextures()", "Loaded textures"); 

} 

私は非常に密接に見ていると.pngsは問題ではありません。私は頂点の色アルファを-1に設定しようとしましたが、テクスチャは消えますが、点描はまだそこにあります。ブレンドを無効にすると、すべての透明度が黒くなり点滅が消えます。フラグメントシェーダがアルファ0.0を出力し、それでもまだ点滅しているときに、次に試すべきものを理解できません。

試してみることについてのフィードバックは高く評価されます。ありがとうございました!

+0

ディザリングを有効にしてください( 'GLES20.glEnable(GLES20.GL_DITHER)')。 – Jave

+0

@Javeこれを試しましたが、何も変わりませんでした。しかし、提案していただきありがとうございます! – ronnerberg

+1

それは色深度の問題のいくつかの並べ替えのように見えます。また、ウィンドウとサーフェス深度の両方を32ビットに設定することもできます: 'glview.setEGLConfigChooser(8、8、8、16、0);および' getWindow()。setFormat(PixelFormat.RGBA_8888); ' (そしておそらくウィンドウとOpenGLの両方にディザを追加する) – Jave

答えて

1

色深度の問題のようです。あなたは、32ビットモードにあなたの表面と窓を設定し、それが助けかどうかを確認する必要があります

glview.setEGLConfigChooser(8, 8, 8, 8, 16, 0); 

getWindow().setFormat(PixelFormat.RGBA_8888); 

窓と表面が同じ量を使用していることを、今何をディザリングする必要はありません時にはより良い結果をもたらすことができるので、ウィンドウとOpenGLの両方で有効にすることができます。

0

"loadTextures()"関数はどのように見えますか?これはglTexParameteri(...)の問題で、テクスチャのフィルタリングを設定します。 (内挿が正しくない可能性があります)

+0

申し訳ありませんが、そのメソッドを逃した。元の投稿が編集されました。ありがとうございました。 – ronnerberg