Сопоставление текстур OSL [дубликат]

Dec 04 2020

Я новичок в OSL и Blender. Я использую следующий код для создания круга на плоскости. Самолет, однако, кажется разделенным на два треугольника. Может ли кто-нибудь объяснить, как это исправить, чтобы мой круг OSL отображался правильно? Спасибо!

shader Circle(
        float rad=0.75 [[float min=0, float max=1]],
        float sharp=0.8 [[float min=0, float max=1]],
        int rep=1[[int min=1, int max=10]],
        point cent=point(0.5, 0.5, 0),
    output color c = 0)
{
    point pt = point(rep*u, rep*v,0);
    float ctx = floor(pt[0])+cent[0];
    float cty = floor(pt[1])+cent[1];
    point ct = point(ctx, cty, 0);
    float d = fmod(distance(ct, pt), rep)/rad;

    c = 1-smoothstep(0.5*sharp, 1-0.5*sharp, d);

}

Ответы

1 RobinBetts Dec 04 2020 at 16:44

uи vявляются глобальными переменными, предоставляемыми OSL. Они относятся к параметрическим U и V; нормализованные барицентрические координаты точки затенения в текущем закрашенном треугольнике. Это те же U и V, которые возвращаются в 2D-векторе, который вы получаете из узла Geometry > Parametric output.

Чтобы получить U и V квадрата, как показано на карте, вам нужно найти U и V на активной UV-карте объекта, используя getattribute():

shader Circle(
        float radius = 0.75,
        float sharpness = 0.8,
        int tiles = 1,
        point center = point(0.5, 0.5, 0.0),
        output color c = (0.0) 
        )
{
    vector UV = (0.0);
    int hasUV = getattribute( "geom:uv", UV);
  
    point pt = point(tiles*UV[0], tiles*UV[1],0);
    float ctx = floor(pt[0])+center[0];
    float cty = floor(pt[1])+center[1];
    point ct = point(ctx, cty, 0);
    float d = fmod(distance(ct, pt), tiles)/radius;

    c = 1-smoothstep(0.5*sharpness, 1-0.5*sharpness, d);
}

... но здесь мы сталкиваемся с невыполненным обещанием в руководстве по Blender, которое, судя по возрасту этого ответа , вы можете ожидать, что к настоящему времени оно исправлено. Как ни странно, с точки зрения пользователя, реализация OSL в Blender отказывается давать значение geom:uv, если где-то в дереве нет узла текстуры изображения . (Если вы хотите оценить какую-либо другую UV-карту по имени в вашем OSL, дерево также должно содержать узел UV-карты с таким же именем, связанный с узлом Image Texture .)

Итак, ваше дерево выглядит так:

Надеюсь, этот ответ сэкономит вам время .. :)