私は 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 に格納されます。
ビンゴ。