Размер GLSL Texel

Почему люди используют это уравнение для определения размера одного текселя?

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

На мой взгляд, это должно быть:

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

Так

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

Это полная версия фрагментного шейдера урока Блума об 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);
}

1 ответ

Я не могу следовать предложенному вами способу расчета размера текселя, но, возможно, это проясняет его:

Координаты текстуры (также называемые UV) нормализованы, поэтому они являются дробями от 0 до 1 независимо от размера текстуры, что означает, что координата 1 может составлять 256 пикселей или 2048 пикселей. Чтобы вычислить, как перейти от одного выделенного значения к другому в нормализованном пространстве, вам нужно разделить 1 на количество отдельных значений.

В другом контексте: предположим, у меня есть 10 яблок, так что это 100%, сколько процентов составляет одно яблоко? 100(%) / 10(яблоки) = 10(%) = 1(яблоко). Итак, если вы теперь хотите от меня только целые яблоки, вы знаете, что вам нужно попросить кратную 10%. Преобразуйте это в дроби, разделив на 100, и вы вернетесь к UV.

Для дальнейшего чтения ознакомьтесь с этим ответом, у него также есть хорошая диаграмма:Имитация переноса текстур OpenGL + интерполяция на холсте?

Другие вопросы по тегам