如何在glsl片段着色器中对原始分辨率纹理进行采样

时间:2013-11-07 10:46:38

标签: textures glsl multisampling

我正在尝试使用2d纹理作为查找表来索引更大的纹理。然后纹理将颜色值映射到四边形。我遇到的问题是,当我对其进行采样时,较大的纹理看起来比原始分辨率小。例如,我有一个4k x 4k的大纹理。查找纹理对大纹理的1k×1k区域进行采样。然后纹理将结果映射到填充视口的四边形,该视口也是1k宽x 1k高。我希望在纹理四边形和原始4k x 4k纹理的1k x 1k部分之间仍能看到1:1的地图。但是,纹理四边形非常混淆。看起来好像虽然4k x 4k纹理减少到1k x 1k纹理,但我的查找地图会采样该纹理的512 x 512部​​分。

换句话说,虽然我从一个已经调整大小以适合1k x 1k视口的纹理中采样,而不是原生的4k x 4k纹理。我接近这个问题的原因是否存在问题?

这是我的顶点着色器:

uniform mat4 pvm;

void main()
{   
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = ftransform();
}

and fragment shader:

uniform sampler2D image;  //The large texture
uniform sampler2D map;    //The lookup texture

void main()
{

    vec4 pos = texture(map,(gl_TexCoord[0].st * vec2(-1.0, 1.0)));  //Flip the origin

    vec4 color = texelFetch(image,ivec2(pos.s*4096,pos.t*4096),0);  
    gl_FragColor = color;
}

1 个答案:

答案 0 :(得分:0)

别名是一个值得注意的问题并不奇怪,texelFetch (...)禁用过滤,包括mip映射。如果你使用这个功能,你必须自己实现这些东西。

texelFetch (...)的一个典型用例是禁用纹理过滤(不是你想要的)或从多重采样纹理中获取特定样本(也不是你的想)。如果你想要纹理消除锯齿,最好使用标准化纹理坐标和常规texture (...)