【问题标题】:How to sample native resolution texture in glsl fragment shader如何在 glsl 片段着色器中对原生分辨率纹理进行采样
【发布时间】:2013-11-08 02:45:25
【问题描述】:

我正在尝试使用 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;
}

【问题讨论】:

    标签: textures glsl multisampling


    【解决方案1】:

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

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

    【讨论】:

    • 嗨 Andon,我也尝试过简单地使用: vec4 color = texture(image,vec2(pos.s,pos.t));而不是 texelfetch。结果与 texelFetch 相同。
    • @user2964105:对于绑定到mapimage 采样器的纹理,你的纹理过滤器是什么?如果地图的过滤器是最近邻,那么这是可以预料的,因为您选择的是最近的整数坐标,而不是插值坐标。我不能肯定地说,但我想你想要相邻纹素之间的平滑过渡,而不是突然的对齐网格行为。如果您对两种纹理都使用线性最小/放大过滤器,您应该得到 much 更少的锯齿。其实你map纹理的纹理过滤器在这里比image的过滤器更重要
    • @user2964105:这一切都归结为纹理坐标的生成方式。通常,如果您不使用查找纹理来查找坐标,它们将在您的多边形上平滑插值,但由于您的坐标取决于从另一个纹理中获取,因此行为取决于您的纹理过滤器。
    • 感谢您的回复。我相信我已经找到了问题所在。该程序是因为我为查找纹理中的每种颜色使用了 GL_BYTE 大小。这并没有给我足够精细的粒度来从大纹理中获取。在我切换到 GL_Float 后,问题就消失了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多