Mappage de texture OSL [dupliquer]

Dec 04 2020

Je suis nouveau sur OSL et Blender. J'utilise le code suivant pour générer un cercle sur un plan. L'avion, cependant, semble être divisé en deux triangles. Quelqu'un peut-il expliquer comment résoudre ce problème afin que mon cercle OSL soit correctement mappé? Merci!

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);

}

Réponses

1 RobinBetts Dec 04 2020 at 16:44

uet vsont des variables globales fournies par OSL. Ils se réfèrent aux paramétriques U et V; les coordonnées barycentriques normalisées du point d'ombrage dans le triangle actuellement ombré. Ce sont les mêmes U et V que ceux renvoyés dans le vecteur 2D obtenu à partir du nœud Géométrie > Sortie paramétrique .

Pour obtenir les U et V du quad, tels que mappés, vous devez rechercher les U et V à partir de la carte UV active de l'objet, en utilisant 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);
}

.. mais ici, nous rencontrons une promesse non tenue dans le manuel de Blender, qui à en juger par l'âge de cette réponse , vous pourriez vous attendre à avoir été corrigée maintenant. Bizarrement, en ce qui concerne l'utilisateur, l'implémentation d'OSL par Blender refuse de donner une valeur à geom:uv, à moins qu'il n'y ait un nœud Image Texture quelque part dans l'arborescence. (Si vous souhaitez évaluer une autre UV map par son nom dans votre OSL, l'arborescence doit également contenir un nœud UV Map du même nom, connecté au nœud Image Texture .)

Donc, votre arbre ressemble à ceci:

J'espère que cette réponse vous fera gagner du temps .. :)