Начиная с этого ответа здесь Я пытаюсь применить текстуру с некоторыми прозрачными частями (png) только к краям моей прямоугольной призмы.
Моя первая попытка (левая картинка) с текстурой 4x4 с использованием линейной фильтрации.Вот код:
// Normal direction branching
// M: coordinates, MN: normals of the model, sX,sY,sZ. size of the box
if( (abs(MN.x) > abs(MN.y)) && (abs(MN.x) > abs(MN.z)) ) {
// X axis
texCoords = M.yz / vec2(sY, sZ);
} else if( (abs(MN.z) > abs(MN.x)) && (abs(MN.z) > abs(MN.y)) ) {
// Z axis
texCoords = M.xy / vec2(sX, sY);
} else {
// Y axis
texCoords = M.xz / vec2(sX, sZ);
}
texCoords += vec2(0.5);
Я недоволен этим результатом из-за хорошо видимого артефакта по бокам коробки.После этого я попытался использовать функцию расстояния и текстуру 2x2 (центральное изображение), но я не могу параметризовать расстояние отображаемой текстуры от краев моего блока.Вот код моей второй попытки:
float squared(vec2 pos) {
float at = (atan(pos.x, pos.y) + PI) / (2.0 * PI);
float st = floor(at * 4.0 + 0.5) / 4.0;
float dist = length(pos) * cos((at - st) * 2.0 * PI);
return smoothstep(0.3, 1.0, dist);
}
// Here goes the same direction branching as above
texCoords *= squared(texCoords);
texCoords += vec2(0.5);
Я пытаюсь добиться результата, как на картинке с правой стороны, где моя текстура наносится на все стороны моего бокса, имитируя хороший квадратзатенение краев.
Я сейчас подхожу к дистанционным функциям, поэтому я не уверен, какой метод будет использоваться здесь, и мне интересно, будет ли это правильным подходом к тому, что я пытаюсь сделать.
Как я могу отобразить координаты текстуры вокруг граней моих блоков до определенного расстояния от краев?