OSL Texture Mapping [duplicato]

Dec 04 2020

Sono nuovo di OSL e Blender. Sto usando il seguente codice per generare un cerchio su un aereo. L'aereo, tuttavia, sembra essere diviso in due triangoli. Qualcuno può spiegare come risolvere questo problema in modo che il mio cerchio OSL sia mappato correttamente? Grazie!

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

}

Risposte

1 RobinBetts Dec 04 2020 at 16:44

ue vsono variabili globali fornite da OSL. Si riferiscono al parametrico U e V; le coordinate baricentriche normalizzate del punto di ombreggiatura nel triangolo attualmente ombreggiato. Sono le stesse U e V restituite nel vettore 2D ottenuto dal nodo Geometria > Output parametrico .

Per ottenere l'U e la V del quad, così come mappate, devi cercare l'U e la V dalla mappa UV attiva dell'oggetto, usando 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);
}

.. ma qui, ci imbattiamo in una promessa non mantenuta nel manuale di Blender, che a giudicare dall'età di questa risposta , potresti aspettarti che sia stata risolta ormai. Stranamente, per quanto riguarda l'utente, l'implementazione di OSL di Blender rifiuta di dare un valore a geom:uv, a meno che non ci sia un nodo Image Texture da qualche parte nell'albero. (Se si desidera valutare un'altra mappa UV per nome nel proprio OSL, l'albero deve contenere anche un nodo Mappa UV con nome simile, connesso al nodo Texture immagine .)

Quindi il tuo albero finisce per assomigliare a questo:

Spero che questa risposta ti faccia risparmiare un po 'di tempo .. :)