GLSL 纹素尺寸

GLSL Texel Size

为什么人们使用这个等式来指定单个纹素的大小?

vec2 tex_offset = 1.0 / textureSize(image, 0);

在我看来,这应该是:

whole texels -> whole texture size
single texel -> single texel size

所以

singleTexelSize = (singleTexel * wholeTextureSize) / wholeTexel = wholeTextureSize / wholeTexel

这是 Bloom 关于 Joey de Vries 的 OpenGL 课程的片段着色器的完整版本:

#version 330 core
out vec4 FragColor;
  
in vec2 TexCoords;

uniform sampler2D image;
  
uniform bool horizontal;
uniform float weight[5] = float[] (0.227027, 0.1945946, 0.1216216, 0.054054, 0.016216);

void main()
{             
    vec2 tex_offset = 1.0 / textureSize(image, 0); // gets size of single texel
    vec3 result = texture(image, TexCoords).rgb * weight[0]; // current fragment's contribution
    if(horizontal)
    {
        for(int i = 1; i < 5; ++i)
        {
            result += texture(image, TexCoords + vec2(tex_offset.x * i, 0.0)).rgb * weight[i];
            result += texture(image, TexCoords - vec2(tex_offset.x * i, 0.0)).rgb * weight[i];
        }
    }
    else
    {
        for(int i = 1; i < 5; ++i)
        {
            result += texture(image, TexCoords + vec2(0.0, tex_offset.y * i)).rgb * weight[i];
            result += texture(image, TexCoords - vec2(0.0, tex_offset.y * i)).rgb * weight[i];
        }
    }
    FragColor = vec4(result, 1.0);
}

我无法按照您提出的计算纹素大小的方法进行操作,但也许这样更清楚:

纹理坐标(也称为 UV)已归一化,因此无论纹理大小如何,它们都是 0 到 1 之间的分数,这意味着坐标 1 可以是 256 像素或 2048 像素。要计算如何在标准化 space 中从一个专用值获取下一个专用值,您需要将 1 除以单个值的数量。

换句话说:假设我有 10 个苹果,那么这是 100%,一个苹果的百分比是多少? 100(%) / 10(苹果) = 10(%) = 1(苹果)。 所以如果你现在只想要我的整个苹果,你知道你必须要 10% 的倍数。通过除以 100 将其转换为分数,然后您又回到了 UV。

如需进一步阅读,请查看此答案,它还有一个漂亮的图表: