下采样和上采样纹理偏移,OpenGL GLSL

下采样和上采样纹理偏移,OpenGL GLSL,opengl,glsl,textures,Opengl,Glsl,Textures,假设我想从4x4到2x2 texel纹理进行下采样,做一些有趣的事情,然后再次从2x2到4x4进行上采样。如何计算正确的相邻纹理偏移?我不能使用双线性过滤或最近过滤。我需要为每个片段执行挑选4个样本,并在下采样之前挑选最大的一个。上采样过程也是如此,即,我需要为每个片段执行挑选4个样本 我是否正确计算了相邻偏移(我使用的是全屏四元) 假设texelSize在这两种情况下都是渲染目标的texel大小,则偏移看起来是正确的。也就是说,下采样过程比上采样过程大两倍。在上采样的情况下,您并没有精确地命中

假设我想从4x4到2x2 texel纹理进行下采样,做一些有趣的事情,然后再次从2x2到4x4进行上采样。如何计算正确的相邻纹理偏移?我不能使用双线性过滤或最近过滤。我需要为每个片段执行挑选4个样本,并在下采样之前挑选最大的一个。上采样过程也是如此,即,我需要为每个片段执行挑选4个样本

我是否正确计算了相邻偏移(我使用的是全屏四元)


假设texelSize在这两种情况下都是渲染目标的texel大小,则偏移看起来是正确的。也就是说,下采样过程比上采样过程大两倍。在上采样的情况下,您并没有精确地命中源texel中心,而是足够接近最近邻过滤将它们捕捉到预期的结果

更有效的选择是使用扩展名中指定的指令。当用于对纹理进行采样时,它返回与过滤相同的四个texel。它只返回每个texel的一个分量来生成vec4,但是考虑到您只关心红色分量,如果扩展可用,它是一个理想的解决方案。然后,下采样和上采样的代码将相同:

#define GATHER_RED_COMPONENT 0
vec4 vals = textureGather(mainTexture, texcoord, GATHER_RED_COMPONENT);

// Output the maximum value
fragColor = max(max(vals.x, vals.y), max(vals.z, vals.w));

您可以使用fbo和reder对具有不同采样计数的多采样纹理进行多采样(如果默认多采样对您来说合适),在我的情况下,这是不可能的,因为我需要对深度纹理进行下采样,然后对另一个纹理进行上采样,以避免像素出血。因此,我必须手动比较双线性邻域。谢谢您的确认!我使用的是OpenGL 4.0,textureGather需要它而不需要扩展。我要试一试,再次感谢:)
#define GATHER_RED_COMPONENT 0
vec4 vals = textureGather(mainTexture, texcoord, GATHER_RED_COMPONENT);

// Output the maximum value
fragColor = max(max(vals.x, vals.y), max(vals.z, vals.w));