1

私は OpenGL ES 2.0 の初心者です。2 つのテクスチャを最終的なフレームバッファの結果にブレンドする方法に関するこのスレッドを読みました。iPhone の OpenGL ES 2.0 で座標が異なる 2 つのテクスチャをブレンドするにはどうすればよいですか?

私の現在の要件は少し異なります。

inputTextureTop(Varying) というテクスチャとテクスチャ inputTextureBot(constant) をブレンドし、結果をテクスチャ inputTextureTop に保存したいと考えています。

それは十分に単純でなければなりません。スレッド内のサンプル コードを変更して試すにはどうすればよいですか?

目的の C コード...

    - (void) display {
        [EAGLContext setCurrentContext:context];

        glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);

        glUseProgram(program);

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

        glActiveTexture(GL_TEXTURE3);
        glBindTexture(GL_TEXTURE_2D, textureBot);

        glUniform1i(inputTextureTop, 2);
        glUniform1i(inputTextureBot, 3);

        glUniform1f(alphaTop, alpha);

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

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

        glClearColor(0.0, 0.0, 0.0, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);

        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 inputTextureTop;
    uniform sampler2D inputTextureBot;

    uniform highp float alphaTop;

    void main()
    {
        lowp vec4 pixelTop = texture2D(inputTextureTop, textureCoordinate);
        lowp vec4 pixelBot = texture2D(inputTextureBot, textureCoordinate);

        gl_FragColor = someBlendOperation(pixelTop, pixelBot);
    }

本当にありがとう!

よろしく、

ハワード

======================== 8月22日更新。

調べてみると、行き止まりであることがわかりました。テクスチャー(上)+テクスチャー(下)を合成してテクスチャー(上)に変更する方法はありません。

しかし、テクスチャ(上)+テクスチャ(下)を合成してテクスチャ(対象)に保存する方法があります。

これを行う方法は、テクスチャ トップとテクスチャボトムが使用する同じフレーム バッファにターゲット テクスチャをバインドすることです。

以下のコードを追加すると、ジョブが実行されます。

      glActiveTexture(GL_TEXTURE0); 
      bindTexture(textureTarget); 
      glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureTarget, 0);

結果は textureTarget に格納されます。

ビンゴ。

4

1 に答える 1

1

FBO を使用する必要があるため、テクスチャへのレンダリングはより複雑になります。これは、OpenGL ES 2.0 または 1.1 (拡張機能付き) で実行できます。この記事では、次のように詳しく説明しています。

http://processors.wiki.ti.com/index.php/Render_to_Texture_with_OpenGL_ES

また、シェーダー コードで 2 つのテクスチャを組み合わせる例については、こちらの回答を参照してください。

OpenGL ES 2 : 追加のテクスチャ ユニットを使用して、この画像を現在の画像とブレンドします

于 2013-08-14T23:27:20.197 に答える