使用OpenGL glTexture3D进行纹理伪像和双线性过滤

时间:2013-06-20 10:29:14

标签: c++ opengl textures volume-rendering

我正在研究体积渲染应用程序,我必须切割体积数据的平面。问题是,鉴于分辨率有限,我在白色区域的边界上会得到一些文物。

音量是GLubyte M [深度] [宽度] [高度],其中有255 s和0 s。 正如您所看到的,当我旋转模型时,边框上存在明显的问题。

我已经有以下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)

0 个答案:

没有答案