0

OpenGL ビューの CAEAGLLayer で opaque プロパティが NO に設定されています。OpenGL ビュー (チェックボード) の背後に UIImageView があります。テクスチャは、最初に OpenGL ビュー (エミューの鳥の写真) に描画されます。ここで、名声バッファの真ん中に別のテクスチャを描画したいと思います。新しいテクスチャは完全に黒く、アルファは上から下に 0 から 255 まで変化します。

これは私の2番目のテクスチャです...

チェックボードは透明度を示します

これは私が欲しいものです...

私が欲しいもの

これは私が得るものです...

私が得るもの

チェックボード テクスチャは、EAGLView の背後にある UIImageView 内の UIImage です。

フレーム バッファ内の RGB 値を乱したくありません。アルファ チャネルに書き込みたいだけです。私は試した...

  1. glDisable(GL_BLEND) と glColorMask(0, 0, 0, 1)
  2. glEnable(GL_BLEND) と glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_ONE, GL_ZERO)

何も機能していないようです。RGB 値は常に変更され、ピクセルは明るくなります。

ソース RGBA が (r2, g2, b2, a2) で、宛先が (r1, g1, b1, a1) の場合。最終値を (r1, g1, b1, a2) またはできれば (r1, g1, b1, some_function_of(a1, a2)) にしたい。どうすればこれを達成できますか?

これが私のコードです...

2 番目のテクスチャを描画するための Objective C コード...

- (void) drawTexture {
    GLfloat textureCoordinates[] = {
        0.0f, 1.0f,
        1.0f, 1.0f,
        0.0f,  0.0f,
        1.0f,  0.0f,
    };

    static const GLfloat imageVertices[] = {
        -0.5f, -0.5f,
        0.5f, -0.5f,
        -0.5f,  0.5f,
        0.5f,  0.5f,
    };

    [EAGLContext setCurrentContext:context];

    glViewport(0, 0, backingWidth, backingHeight);

    glUseProgram(program);

    glActiveTexture(GL_TEXTURE2);
    glBindTexture(GL_TEXTURE_2D, texture);

    glEnable (GL_BLEND);
    glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_ONE, GL_ZERO);

    glUniform1i(inputImageTexture, 2);

    glVertexAttribPointer(position, 2, GL_FLOAT, 0, 0, imageVertices);
    glVertexAttribPointer(inputTextureCoordinate, 2, GL_FLOAT, 0, 0, textureCoordinates);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER];
}

頂点シェーダ...

 attribute vec4 position;
 attribute vec4 inputTextureCoordinate;

 varying vec2 textureCoordinate;

 void main()
 {
    gl_Position = position;
    textureCoordinate = inputTextureCoordinate.xy;
 }

フラグメント シェーダ...

 varying highp vec2 textureCoordinate;

 uniform sampler2D inputImageTexture;

 void main()
 {
     gl_FragColor = texture2D(inputImageTexture, textureCoordinate);
 }
4

1 に答える 1

0

glColorMask動作する必要があります-私の場合はうまくいきました。また、私が知る限り、glBlendFuncSeparateiOS ではバグがあります。

(理論的には)次のことができます。

  • ブレンディングを乗算モードに設定 (GL_DST_COLOR、GL_ONE_MINUS_SRC_ALPHA)
  • テクスチャを白くする
  • glColorMaskすべてのチャネルを有効に設定

iOS 5 以降の iDevice をお持ちの場合はOpenGL Capture、XCode のウィンドウでフレームバッファ アルファを確認できます。

于 2012-08-20T06:29:47.610 に答える