2016-05-20 7 views
3

ビットマップをテクスチャにレンダリングして問題なく表示できます。私がしようとしているのは、その上にPNGの別のテクスチャをレンダリングすることです。オーバーレイpngには透明な(アルファ)ピクセルがいくつか含まれています。OpenGL ES 2.0 Android Alphaが黒く表示されます

オーバーレイをバックグラウンドテクスチャイメージの上にレンダリングすることはできますが、それを行うと、透明ピクセルが半透明の黒としてレンダリングされているように見えますか?黒が実際に私が黒として設定しているテクスチャの背景から来ていない限り...誰かが私が間違ったやり方をしたり、このような効果を達成するために別の方法を提案しているのですか?

バーテックスシェーダ:

private final String vertexTextureShaderCode = 
       "attribute vec4 aPosition;"+ // Position of out Vertex 
       "attribute vec2 aTexPosition;"+ // Position of our texture contained in the vertex 
       "varying vec2 vTexPosition;"+ // 
       "void main(){"+ 
       " gl_Position = aPosition;"+ 
       " vTexPosition = aTexPosition;"+ 
       "}"; 

フラグメントシェーダ:

private final String fragmentTextureShaderCode = 
      "precision mediump float;" + 
      "uniform sampler2D uTexture;" + // Our Background Image (Our uploaded image) 
      "uniform sampler2D uOverlay;"+ // Our Ovrelay image 
      "varying vec2 vTexPosition;" + 
      "void main() {" + 
      " vec4 colImage = texture2D(uTexture,vTexPosition);" + 
      " vec4 colOverlay = texture2D(uOverlay, vTexPosition);" + 
      " gl_FragColor = mix(colImage, colOverlay, 0.7);" + 
      "}"; 

ドローフレーム方式

public void drawOverlay(Context context,int resourceId){ 
    BitmapFactory.Options opts = new BitmapFactory.Options(); 
    opts.inScaled = false; 

    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId,opts); 

    // Bind our TEXTURE_COORDS to the array 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,mTexturePointer[1]); 

    // Create the nearest filter TEXTURE_COORDS 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); 

    // Use Android GL Utils to specify a 2d TEXTURE_COORDS image from our bitmap 
    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); 

    bitmap.recycle(); 

    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); 
    GLES20.glUseProgram(mProgram); 

    // ENable bledning 

//  GLES20.glEnable(GLES20.GL_BLEND); 
// 
//  // User SRC_OVE 
//  GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

    // get handle to vertex shader vPosition member 
    mPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition"); 
    mTextureHandle = GLES20.glGetUniformLocation(mProgram, "uTexture"); 
    mTextureOverlayhandle = GLES20.glGetUniformLocation(mProgram, "uOverlay"); 
    mTexturePositionHandle = GLES20.glGetAttribLocation(mProgram, "aTexPosition"); 

    GLES20.glVertexAttribPointer(mTexturePositionHandle, 2, GLES20.GL_FLOAT, false, 0, mTextureBuffer); 
    GLES20.glEnableVertexAttribArray(mTexturePositionHandle); 

    // ACTIVATING OUR FIRST TEXTURE, I.E our background image. 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTexturePointer[0]); 
    GLES20.glUniform1i(mTextureHandle,0); 

    // ACTIVATE OUR SECOND SECOND I.E our overlay 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE1); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTexturePointer[1]); 
    GLES20.glUniform1i(mTextureHandle,1); 

    // Prepare the triangle coordinate data 
    GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, 0, vertexBuffer); 

    // enable a handle to the triangle vertice 
    GLES20.glEnableVertexAttribArray(mPositionHandle); 

    // clear the colors 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 

    GLES20.glDisable(GLES20.GL_DEPTH_TEST); 

    GLES20.glEnable(GLES20.GL_BLEND); 

    // User SRC_OVER 
    GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA); 
    // Draw the square 
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, vertexCount); 

    // Disbale the vertex array 
    GLES20.glDisableVertexAttribArray(mPositionHandle); 

} 

は、ここに私のフラグメントシェーダでミックス法に正しいアプローチを使用していますか?代わりに、2つの画像を1つのテクスチャ(sampler2D)に描画して、2つのsampler2Dオブジェクトのミックスを使用する必要がありますか?もしそうなら、私はそれをどうやってしますか?毎回、前景テクスチャが背景テクスチャの上に直接描画されるようにします。

+0

私は、事前計算済みのアルファを使ってビットマップオブジェクト(および基礎となるskiaライブラリ)を覚えています... BitmapFactoryによってロードされたアルファのpngテクスチャは機能していません...私がOpenGLで遊んでいたとき、ロード用にネイティブlibpngを使用しました – Selvin

+0

事前に生成されたアルファがこの問題の原因であるように見えます。しかし、GLES20.BLENDをこれを修正するために使用することは、数多くのリソースが指摘しています。それは私の場合に働いているように見えません – Devsil

答えて

2

OK、自分の問題を理解しました。

1つのテクスチャに2つの異なるビットマップを描画しようとしましたが、同じテクスチャハンドルを使用していました。上記のフラグメントシェーダは、このタイプの結果を得るには間違っています。 2つのテクスチャに「ミックス」を使用することは正しいアプローチではありませんでした。

正しいアプローチは、1つのテクスチャを使用することでしたが、私の背景テクスチャと前景テクスチャのハンドルを持っていました。 draw()メソッドでは、まず通常のようにバックグラウンドイメージを設定し、glDrawArrays(...)を使用し、その後、フォアグラウンドイメージを(正しいポインタを使用して)設定して、フォアグラウンドイメージを別のglDrawArraysで描画します(...)呼び出し。

関連する問題