2017-05-07 5 views
0

Ich spiele mit einem einfachen farbigen Quad Anwendung Dithering, und fand eine seltsame Frage. Ich habe ein Fragment-Shader, die an einem gewissen uv und gibt eine Mischung Farbe Dithering berechnen soll. Dies funktioniert gut auf einem strukturierten Quad, aber seltsam genug, wenn ich Farbdaten von meinem inVertex zugreifen, die uv Koordinaten Änderung einiger bizarren Werten und y Wert scheint x Achse abgebildet werden. Ich werde versuchen zu veranschaulichen, was passiert, wenn ich Sachen um den Fragment-Shader-Code herum ändere.Metall Fragment-Shader uv Koordinaten ändern, wenn in Vertex Farbe Lesen

fragment float4 fragment_colored_dithered(ColoredVertex inVertex [[stage_in]], 
               float2 uv[[point_coord]]) { 
     float4 color = inVertex.color; 
     uv = (uv/2) + 0.5; 
     if (uv.y < 0.67) { 
      return float4(uv.y, 0, 0, 1); 
     } 
     else { 
      return color; 
     } 
    } 

erzeugt das folgende Ergebnis: enter image description here

Wo die linke Seite des Bildes meinen Gradienten Quad zeigt, feststellen, dass if (uv.y < 0.67) Karten x-Werte im Bild.

Wenn ich diesen Fragment-Shader und nichts anderes im Code ändern, so, wo ich return float4(0, 0, 1, 0) statt inVertex.color, die uv Koordinaten korrekt zugeordnet sind.

fragment float4 fragment_colored_dithered(ColoredVertex inVertex [[stage_in]], 
              float2 uv[[point_coord]]) { 
    float4 color = inVertex.color; 
    uv = (uv/2) + 0.5; 
    if (uv.y < 0.67) { 
     return float4(uv.y, 0, 0, 1); 
    } 
    else { 
     return float4(0, 0, 1, 0); //return color; 
    } 
} 

Erzeugt diese (richtige) Ergebnis: enter image description here

Ich glaube, ich, um dieses Problem durch Anwendung einer 1x1 Textur auf den Gradienten und mit Texturkoordinaten hacken kann, aber ich würde wirklich was wissen, passiert hier, ist das ein Fehler oder ein Feature, das ich nicht verstehe?

Antwort

2

Warum verwenden Sie [[point_coord]]? Was denkst du repräsentiert es?

Wenn Sie keine Punkt-Primitive zeichnen, sollten Sie diese nicht verwenden. Da Sie ein „Quad“ sind zeichnen, und die Screenshots gegeben, nehme ich Sie nicht Punkt Primitive zeichnen.

Ich vermute, [[point_coord]] ist einfach undefiniert und unterliegt zufälligem Verhalten, wenn Sie Dreiecke zeichnen. Die Zufälligkeit wird offensichtlich durch die Besonderheiten (wie Stack-Layout) des Fragment-Shader beeinflusst.

Sie sollten entweder [[position]] verwenden und durch die Fenstergröße skalieren oder ein interpoliertes Feld innerhalb Ihrer ColoredVertex-Struktur verwenden, um "Textur" -Koordinaten zu tragen.

+0

danke dafür, ich werde versuchen, ein Feld für "texCoord" hinzuzufügen und sehen, was damit passiert. Wenn ich die Spezifikation erneut lese, habe ich das Attribut "point_coord" für etwas, das sich wie eine uv-Koordinate verhält, falsch verstanden! –

+0

Ein zusätzliches Feld hinzugefügt, das funktioniert wie ein Zauber, danke nochmal für das Zeigen auf das Offensichtliche :) –

Verwandte Themen