0

我正在尝试使用 2d 纹理作为查找表来索引更大的纹理。然后将颜色值纹理映射到四边形。我遇到的问题是,当我对其进行采样时,较大的纹理似乎小于其原始分辨率。例如,我有一个大的 4k x 4k 纹理。查找纹理对大纹理的 1k x 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;
}
4

1 回答 1

0

It is not surprising that aliasing is a noticable issue, texelFetch (...) disables filtering, including mip mapping. You will have to implement this stuff yourself if you use this function.

A typical use case for texelFetch (...) is to disable texture filtering (not what you want here) or to fetch a specific sample from a multisample texture (also not what you want). You would be better off using normalized texture coordinates and a regular texture (...) if you want texture anti-aliasing.

于 2013-11-07T14:01:21.950 回答