GLSL中的最近邻插值

GLSL中的最近邻插值,glsl,medical-imaging,volume-rendering,Glsl,Medical Imaging,Volume Rendering,我有一个GLSL片段着色器作为管道的一部分,用于渲染混合在一起的两个3D体积的切片。对于其中一个体积,我想使用最近邻插值,因为它是一个“分割遮罩”(即,在每个体素处,表示另一个图像中的体素属于哪个结构,例如,0表示背景,1表示目标结构;请参见下图中的紫色叠加),因为默认的三线性插值会在边界处创建不需要的瑕疵(下图中边界处的绿线) 如何修改下面的片段着色器代码,以便在分段遮罩(vol2)上使用最近邻插值 统一采样器3d-vol1; 均匀采样3d-vol2; 均匀取样器2d-lut1; 均匀采样2

我有一个GLSL片段着色器作为管道的一部分,用于渲染混合在一起的两个3D体积的切片。对于其中一个体积,我想使用最近邻插值,因为它是一个“分割遮罩”(即,在每个体素处,表示另一个图像中的体素属于哪个结构,例如,0表示背景,1表示目标结构;请参见下图中的紫色叠加),因为默认的三线性插值会在边界处创建不需要的瑕疵(下图中边界处的绿线)

如何修改下面的片段着色器代码,以便在分段遮罩(
vol2
)上使用最近邻插值

统一采样器3d-vol1;
均匀采样3d-vol2;
均匀取样器2d-lut1;
均匀采样2dlut2;
均匀浮动maskAlpha=0.5;
void main()
{
float data1=texture3D(vol1,gl_TexCoord[0].xyz).r;
float data2=texture3D(vol2,gl_TexCoord[0].xyz).r;
vec4 col1=texture2D(lut1,vec2(data1));
vec4 col2=texture2D(lut2,vec2(data2));
gl_FragColor=col1+col2*maskAlpha;
}

您需要为CPU端的每个纹理设置所需的过滤代码:

glEnable(GL_纹理_3D);
glBindTexture(GL_TEXTURE_3D,??);//这里是???是纹理ID。。。
glTexParameteri(GL_纹理_3D,GL_纹理_贴图过滤器,GL_最近);
glTexParameteri(GL\u纹理\u 3D,GL\u纹理\u最小\u过滤器,GL\u最近);
支持的基本过滤器有:
GL\u最近、GL\u线性

看看这个:整个事情

有关更多信息,请参见文档

如果您无法访问CPU端代码,则可以将纹理坐标与片段着色器内的纹理位置对齐。但是,为此,您需要知道纹理的分辨率

因此,对于每个坐标
x=
和分辨率
xs[textels]
您可以尝试以下方法:

x' = floor((x*(xs-1)+0.5))/(xs-1);
然后用这个新的坐标来获取texel。。。但是没有测试它,因此它可能需要一些调整(例如将texel的中心移动0.5…)