9

両方のテクスチャが同じ長方形をカバーしている場合、フラグメントシェーダーで異なるブレンドモードの2つのテクスチャをブレンドできます。しかし、今私の問題は、1つのテクスチャが回転のないプレーンな長方形であり、もう1つのテクスチャが回転/スケールと平行移動のある別の長方形であるということです。これらのテクスチャを希望どおりにマージするにはどうすればよいですか?(写真の中の)

私はこれを行う方法を知っています...

ここに画像の説明を入力してください

しかし、これを行う方法がわかりません...

ここに画像の説明を入力してください

1つの長方形(最初の画像)でテクスチャをブレンドするために、次のコードを使用しました。

ObjectiveCコード...

- (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);
}
4

2 に答える 2

8

2 つのテクスチャ座標をシェーダーに渡し、シェーダーを変更する必要があります

ObjectiveC に追加

glVertexAttribPointer(inputTextureCoordinate2, 2, GL_FLOAT, 0, 0, textureCoordinates2);

頂点シェーダー

attribute vec4 position;
attribute vec4 inputTextureCoordinate;
attribute vec4 inputTextureCoordinate2;

varying vec2 textureCoordinate;
varying vec2 textureCoordinate2;

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

フラグ シェーダー

varying highp vec2 textureCoordinate;
varying highp vec2 textureCoordinate2;

uniform sampler2D inputTextureTop;
uniform sampler2D inputTextureBot;

uniform highp float alphaTop;

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

    gl_FragColor = someBlendOperation(pixelTop, pixelBot);
}

ところで、inputTextureCoordinate は vec4 である必要はありませんが、vec2 である可能性があります

于 2012-09-03T08:56:04.187 に答える
5

同じプリミティブで 2 つのテクスチャをブレンドしている場合は、シェーダーで色を混合できます。

ただし、2 つの異なるプリミティブをブレンドしたい場合、本当に使用したいのはハードウェア ブレンド (GL_BLEND) です。

下の絵をそのまま描いてから、ブレンドを有効にして上の絵を描きます。一番上の画像のアルファ値は、透明度を制御します。

同じ座標を使用しないため、同じ描画呼び出しで両方のクワッドを描画しようとはしません。

于 2012-09-03T06:24:02.730 に答える