1

ボリューメトリック データの平面を切断する必要があるボリューメトリック レンダリング アプリケーションに取り組んでいます。問題は、解像度が限られているため、白いゾーンの境界にアーティファクトが発生することです。

255ボリュームは、 s とsがある GLubyte M[depth][width][height]0です。ご覧のとおり、モデルを回転すると境界線に明らかな問題があります。

OpenGL の次の設定が既にあります。

glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glEnable(GL_TEXTURE_3D);
glTexImage3D(GL_TEXTURE_3D, 0, GL_LUMINANCE, iWidth, iHeight, iDepth, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, M);
gluBuild3DMipmaps(texName,GL_LUMINANCE,iWidth,iHeight,iDepth, GL_LUMINANCE, GL_UNSIGNED_BYTE, M);

粒子の粗い境界線や迷惑なアーティファクトを滑らかにするのに役立つ sampler3D を使用して、GLSL で texture3D 用のバイリニア フィルターを作成できるかどうか疑問に思っています。

texture2D の双一次フィルタリングの例はたくさんありますが、3D テクスチャの例は見つかりません。

このコードを 3D サンプラーに適応させることは可能ですか?

const float textureSize = 512.0; //size of the texture
const float texelSize = 1.0 / textureSize; //size of one texel
vec4 texture2DBilinear( sampler2D textureSampler, vec2 uv )
{
    // in vertex shaders you should use texture2DLod instead of texture2D
    vec4 tl = texture2D(textureSampler, uv);
    vec4 tr = texture2D(textureSampler, uv + vec2(texelSize, 0));
    vec4 bl = texture2D(textureSampler, uv + vec2(0, texelSize));
    vec4 br = texture2D(textureSampler, uv + vec2(texelSize , texelSize));
    vec2 f = fract( uv.xy * textureSize ); // get the decimal part
    vec4 tA = mix( tl, tr, f.x ); // will interpolate the red dot in the image
    vec4 tB = mix( bl, br, f.x ); // will interpolate the blue dot in the image
    return mix( tA, tB, f.y ); // will interpolate the green dot in the image
}

または、ボリューム データのサイズを大きくせずに補間を改善することは可能ですか (実際には 512x512x512 Glubyte です)。

4

0 に答える 0