2012-03-06 82 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是沒問題的。我嘗試將頂點顏色alpha設置爲-1,是的,紋理消失,但點仍然存在。當我禁用混合所有透明度變黑,點消失。我無法弄清楚接下來要做什麼,當片段着色器輸出alpha 0.0並且它仍然是虛線。

想要嘗試的任何反饋意見。謝謝!

+0

嘗試開啓抖動('GLES20.glEnable(GLES20.GL_DITHER)')。 – Jave 2012-03-06 09:11:52

+0

@Jave現在嘗試,但沒有任何改變。儘管謝謝你的建議! – ronnerberg 2012-03-06 11:02:52

+1

雖然它看起來像某種顏色深度問題。你也可以嘗試設置窗口和表面深度爲32位:glview.setEGLConfigChooser(8,8,8,16,0);''和'getWindow().setFormat(PixelFormat.RGBA_8888);' (並且可能爲窗口和opengl添加抖動) – Jave 2012-03-06 11:14:08

回答

1

這似乎是一個顏色深度問題。您應該在表面和窗口設置爲32位模式,並看看是否有幫助:

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

getWindow().setFormat(PixelFormat.RGBA_8888); 

它不應該是必要現在就抖動任何窗口,表面使用相同量的位,但有時它可以給出更好的結果,所以你可以嘗試爲window和openGL啓用它。

0

你的「loadTextures()」函數是什麼樣的?這可能是一個glTexParameteri(...)問題,您可以在其中爲紋理設置濾鏡。 (插值可能不正確)

+0

對不起,錯過了那個方法。原始帖子現在被編輯。謝謝。 – ronnerberg 2012-03-06 10:58:02