フラグメントシェーダーでミップマップレベルをぼかしてブレンドすることにより、深度テクスチャをぼかしようとしています。
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に対して行われた呼び出しが期待される結果をもたらすように、プログラムをセットアップする適切な方法は何ですか?
ありがとう、デニス