1

我正在开发一个体积渲染应用程序,我必须在其中切割体积数据的平面。问题是,在有限的分辨率下,我会在白色区域的边界上看到一些伪影。

体积是一个 GLubyte M[depth][width][height],其中有255s 和0s。正如你所看到的,当我旋转我的模型时,边界上有明显的问题。

我已经有以下 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 编写一个双线性过滤器,这有助于消除颗粒状边界或那些恼人的伪影。

有许多用于纹理 2D 的双线性过滤示例,但我找不到用于 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