【发布时间】:2016-06-02 20:27:01
【问题描述】:
假设我想从 4x4 纹理像素下采样到 2x2 纹理,做一些花哨的事情,然后再从 2x2 上采样到 4x4。如何计算正确的相邻纹素偏移?我不能使用双线性过滤或最近过滤。我需要为每个片段执行选择 4 个样本,并在下采样之前选择最大的一个。上采样过程也是如此,即我需要为每个片段执行选择 4 个样本。
我是否正确计算了邻居偏移(我使用的是全屏四边形)?
//Downsample: 1.0 / 2.0, Upsample: 1.0 / 4.0.
vec2 texelSize = vec2(1.0 / textureWidth, 1.0 / textureHeight);
const vec2 DOWNSAMPLE_OFFSETS[4] = vec2[]
(
vec2(-0.5, -0.5) * texelSize,
vec2(-0.5, 0.5) * texelSize,
vec2(0.5, -0.5) * texelSize,
vec2(0.5, 0.5) * texelSize
);
const vec2 UPSAMPLE_OFFSETS[4] = vec2[]
(
vec2(-1.0, -1.0) * texelSize,
vec2(-1.0, 1.0) * texelSize,
vec2(1.0, -1.0) * texelSize,
vec2(1.0, 1.0) * texelSize
);
//Fragment shader.
#version 400 core
uniform sampler2D mainTexture;
in vec2 texCoord;
out vec4 fragColor;
void main(void)
{
#if defined(DOWNSAMPLE)
vec2 uv0 = texCoord + DOWNSAMPLE_OFFSETS[0];
vec2 uv1 = texCoord + DOWNSAMPLE_OFFSETS[1];
vec2 uv2 = texCoord + DOWNSAMPLE_OFFSETS[2];
vec2 uv3 = texCoord + DOWNSAMPLE_OFFSETS[3];
#else
vec2 uv0 = texCoord + UPSAMPLE_OFFSETS[0];
vec2 uv1 = texCoord + UPSAMPLE_OFFSETS[1];
vec2 uv2 = texCoord + UPSAMPLE_OFFSETS[2];
vec2 uv3 = texCoord + UPSAMPLE_OFFSETS[3];
#endif
float val0 = texture(mainTexture, uv0).r;
float val1 = texture(mainTexture, uv1).r;
float val2 = texture(mainTexture, uv2).r;
float val3 = texture(mainTexture, uv3).r;
//Do some stuff...
fragColor = ...;
}
【问题讨论】:
-
您可以使用 fbo 和 reder 对具有不同样本数的 multisampleTexture 进行多重采样(如果您可以使用默认多重采样)
-
在我的情况下这是不可能的,因为我需要对深度纹理进行下采样并对另一个纹理进行上采样以避免像素出血。因此,我必须手动比较一个双线性邻域。