ビットマップをテクスチャにレンダリングして問題なく表示できます。私がしようとしているのは、その上に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オブジェクトのミックスを使用する必要がありますか?もしそうなら、私はそれをどうやってしますか?毎回、前景テクスチャが背景テクスチャの上に直接描画されるようにします。
私は、事前計算済みのアルファを使ってビットマップオブジェクト(および基礎となるskiaライブラリ)を覚えています... BitmapFactoryによってロードされたアルファのpngテクスチャは機能していません...私がOpenGLで遊んでいたとき、ロード用にネイティブlibpngを使用しました – Selvin
事前に生成されたアルファがこの問題の原因であるように見えます。しかし、GLES20.BLENDをこれを修正するために使用することは、数多くのリソースが指摘しています。それは私の場合に働いているように見えません – Devsil