OSL Texture Mapping [Duplikat]
Ich bin neu bei OSL und Blender. Ich verwende den folgenden Code, um einen Kreis in einer Ebene zu generieren. Die Ebene scheint jedoch in zwei Dreiecke aufgeteilt zu sein. Kann jemand erklären, wie dies behoben werden kann, damit mein OSL-Kreis korrekt zugeordnet wird? Vielen Dank!
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);
}

Antworten
u
und v
sind globale Variablen, die von OSL bereitgestellt werden. Sie beziehen sich auf das parametrische U und V; die normalisierten Schwerpunktkoordinaten des Schattierungspunkts im aktuell schattierten Dreieck. Sie sind die gleichen U und V, die in dem 2D-Vektor zurückgegeben werden, den Sie vom Geometrieknoten > Parametrische Ausgabe erhalten.
Um das U und V des Quads wie abgebildet zu erhalten, müssen Sie das U und V aus der aktiven UV-Karte des Objekts nachschlagen, indem Sie Folgendes verwenden 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);
}
.. aber hier stoßen wir im Blender-Handbuch auf ein unerfülltes Versprechen , das nach dem Alter dieser Antwort zu erwarten ist, dass es inzwischen behoben ist. Seltsamerweise weigert sich Blenders Implementierung von OSL, dem Benutzer einen Wert zu geben geom:uv
, es sei denn, irgendwo in der Baumstruktur befindet sich ein Bildtexturknoten . (Wenn Sie eine andere UV-Karte nach Namen in Ihrer OSL auswerten möchten, muss der Baum auch einen gleichnamigen UV-Kartenknoten enthalten, der mit dem Bildtexturknoten verbunden ist.)
Ihr Baum sieht also so aus:

Ich hoffe diese Antwort spart dir etwas Zeit .. :)