在对多重采样纹理进行采样时,我们必须使用整数坐标,即
ivec2 Texcoord = ivec2(textureSize(texsampler) * In.Texcoord);
vec4 color = texelFetch(texsampler, Texcoord, i); //i = sample, Texcoord is integer
而不是
vec4 color = texture(texsampler, txcooord); //txcoord is float between [0,1]
为什么我们需要映射到每个纹素的精确整数坐标?为什么我的UV坐标不能漂浮在0.0到1.0之间。我猜这与多重采样纹理存储在内存中的方式有关。但是整个想法对我来说有点模糊。
我在这里看到了类似的问题:Multisample texture sampling,但它不是我想要的。
答案 0 :(得分:3)
在这里使用标准化值有什么意义?多重采样纹理不允许在纹素之间进行过滤,因为当纹素可以具有多个值时,过滤没有意义。由于您只能访问特定的纹素,以及 这些纹素中的特定样本,因此他们认为强制您具体了解您想要的纹素是没有害处的。
他们可以允许标准化值吗?当然。你可以这样做:
vec4 textureMS(in sampler2DMS tex, in vec2 texCoord, in int sampleIx)
{
ivec2 textureSize = textureSize(tex);
ivec2 texelCoords = ivec2(textureSize * clamp(texCoord, 0.0, 1.0));
return texelFetch(tex, texelCoords, sampleIx);
}
但是这需要实现来提供纹理的大小,这可能意味着将其作为内部统一或其他东西传递。这只会让事情变得更长。由于您可以轻松地自己完成,因此他们只提供快速方式。这样,那些可以使用快速方式的人不会意外地被缓慢的方式困住。