Размер 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 + интерполяция на холсте?