3

フラグメントシェーダーでミップマップレベルをぼかしてブレンドすることにより、深度テクスチャをぼかしようとしています。

2つのframbufferオブジェクトがあります
。1)深度renderobjectがアタッチされたカラーframbuffer。
2)デプステクスチャがアタッチされたzフレームバッファ。

シーンをカラーフレームバッファオブジェクトにレンダリングしたら、次に深度バッファオブジェクトにブリットし、それを正常にレンダリングできます(出力はGL_LUMINANCE深度テクスチャです)。

デプスバッファを描画する前に選択することで、任意のミップマップレベルに正常にアクセスできます。たとえば、次のようにミップマップレベル3をレンダリングできます。

// FBO setup - all buffer objects created successfully and are complete and the color
// framebuffer has been rendered to (it has a depth renderbuffer attached), and no
// OpenGL errors are issued:
glBindFramebuffer(GL_READ_FRAMEBUFFER, _fbo_color);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _fbo_z);
glBlitFramebuffer(0,0,_w, _h, 0, 0, _w, _h, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
glGenerateMipmap(GL_TEXTURE_2D);

glBindFramebuffer(GL_FRAMEBUFFER, 0);

// This works:
// Select mipmap level 3
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 3);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 3);

draw_depth_texture_on_screen_aligned_quad();

// Reset mipmap
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1000);

別の方法として、texture2D()GLSL関数にバイアスパラメーターを追加するか、texture2DLod()を使用して単一のテクスチャサンプラーで操作したいのですが、0より大きいレベルを選択すると、ミップマップが生成されません:

// fragment shader (Both texture2DLod and texture2D(sampler, tcoord, bias)
// are behaving the same.
uniform sampler2D zbuffer;
uniform int mipmap_level;

void main()
{
    gl_FragColor = texture2DLod(zbuffer, gl_TexCoord[0].st, float(mipmap_level));
}

mipmappingがglBlitFramebuffer()でどのように機能するかはわかりませんが、私の質問は、texture2D / texture2DLodに対して行われた呼び出しが期待される結果をもたらすように、プログラムをセットアップする適切な方法は何ですか?

ありがとう、デニス

4

1 に答える 1

3

わかりました-私はそれを持っていると思います...私の深度バッファにはミップマップレベルが生成されていませんでした。マルチテクスチャリングを使用しており、レンダリング中に、カラーフレームバッファテクスチャ用にテクスチャユニット0をアクティブにし、深度バッファテクスチャ用にテクスチャユニット1をアクティブにします。テクスチャをアクティブ化/バインドするとき、次のようにglGenerateMipmap(GL_TEXTURE_2D)を呼び出します。

glActiveTextureARB(GL_TEXTURE0_ARB);
glBindTexture(GL_TEXTURE_2D, _color_texture);
glGenerateMipmap(GL_TEXTURE_2D);

glActiveTextureARB(GL_TEXTURE1_ARB);
glBindTexture(GL_TEXTURE_2D, _zbuffer_texture);
glGenerateMipmap(GL_TEXTURE_2D);

これが行われると、texture2D(sampler、coord、bias)のバイアスを増やすと、期待どおりにミップマップレベルからフラグメントが得られます。

于 2010-06-18T17:30:15.967 に答える