0

ユーザーが異なるシェーダーとそれらの組み合わせを切り替えることができるアプリケーションを作成しています。したがって、まったく同じシーンを複数回描きたいと思います。

最後に、すべてのパスを 1 つの出力に結合する必要があります。glblendfunc を使用することを考えたすべてのパスを結合するには、必要な結果が得られません。

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//use first shader
draw();
if (secondShaderWished) {
    //use second shader
    draw()
}

各描画呼び出しで、透明領域などのアルファ値を持つテクスチャを描画します。最終的な結果として、主に最後のレンダー パスの効果が見られますが、境界 (アルファ値がわずかに低下する場所) では最初のシェーダー効果が見られます。私が考えているのは、2つのパスをブレンドできるようにする2番目のglBlendFuncを使用する必要があるということですが、希望する効果を破壊するアルファ値に触れない方法は考えられません。

私は何をすべきか?アルファブレンディング以外に何かありますか?

編集: 私の目標は、1 つまたは複数のパスを結合することです。色を混ぜたい (ほとんどの場合、それらを一緒に追加する) のですが、各パスの色は、異なるレイヤー間で次のブレンド関数を介して計算されます:

編集: こんにちは!私はこの問題に取り組んでいますが、行き詰まります。シェーダーで sampler2d を適切に設定する方法がわかりません...何が間違っていますか?

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, _FBO)
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _Tex);
glViewport(0, 0, viewportSize.x(), viewportSize.y());
draw();
GLuint texLocation = glGetUniformLocation(_shader->getProgramID(),"pass0");
glUniform1i(texLocation, 0);
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
4

2 に答える 2

1

あなたのコメントにより、必要なブレンド関数を使用して、各パスを個別にテクスチャにレンダリングすることができます ( FBOを使用して行うのが最適です)。次に、画面サイズのクワッドを描画し、フラグメント シェーダーですべてのパスのテクスチャを平均化するだけで、さまざまなパスを 1 つのパスにブレンドできます。

編集:あなたのコメントによると。これらのパスをテクスチャ (FBO アタッチメントとしてバインドされている) に個別に直接レンダリングします。次に、3 つのパスがあると仮定して、画面サイズのクワッドで次のようなフラグメント シェーダーを使用します。

uniform sampler2D pass0;
uniform sampler2D pass1;
uniform sampler2D pass3;
uniform vec2 screenSize;

void main()
{
    vec2 texCoord = gl_FragCoord.xy / screenSize;
    gl_FragColor = (1.0/3.0) * (texture2d(pass0, texCoord) + 
                                texture2d(pass1, texCoord) + 
                                texture2d(pass2, texCoord));
}

編集:または、単純な 1 テクスチャ フラグメント シェーダ (単一のテクスチャから色を検索して出力するだけ) を使用し、Tobias のブレンド構成を使用して複数のテクスチャ付きクワッドを描画することもできます。これは、パスの数が事前にわかっていない場合にも、より適切にスケーリングされる可能性があります。

于 2011-09-07T10:46:28.587 に答える
0

I think you don't want to use the alpha-values of the textures as a blend factor but rather a constant factor that gives you a 1:1 blending.

You have to distribute the blending factors on all texture layers. So a white pixel on all textures would add up to exactly 1.

float factor = 1.0f / numTextures;
glBlendColor(factor, factor, factor, factor);
glBlendFunc(GL_CONSTANT_COLOR, GL_ONE);

For 3 layers that would become:

             source        dest
1st pass: (tex1 * 1/3) + (0 * 1)
2nd pass: (tex2 * 1/3) + (tex1 * 1/3 * 1)
3rd pass: (tex3 * 1/3) + ((tex2 * 1/3 + tex1 * 1/3) * 1)

Also remember that alpha-blending is an order-dependent operation.

于 2011-09-06T20:38:42.940 に答える