2016-04-22 17 views
1

Microsoft stellt list zur Verfügung, in dem die Eingabe- und Ausgabesemantik von Vertex- und Pixel-Shadern erläutert wird. Inzwischen habe ich einige Codebeispiele gesehen, die die dokumentierten Datentypen nicht verwenden. Sie verwenden float3 als Eingabe COLOR zum Pixel-Shader oder float2 als Eingabe POSITION zum Vertex-Shader. Auch wenn eine 2-Komponenten-Position oder eine 3-Komponenten-Farbe Sinn für mich tun machen, kann ich nicht, dass dies dokumentiert, die mich fragen,Welche Schriftgrößen kann ich für bestimmte Semantiken verwenden?

  • macht

    Kann ich float3 als Vertex-Shader-Eingabe verwende POSITION (wenn ich wissen, dass ich die W-Komponente nicht verwenden werde, ohne Fehler zu erwarten?

  • Wenn ich andere als die dokumentierten Datentypen verwenden kann, gibt es eine Liste, die jeden erlaubten Datentyp für eine Semantik oder eine Regel wie "So lange der verwendete Datentyp kleiner oder gleich groß wie der dokumentiert, du kannst es benutzen "?


Codebeispiele nicht nach der Dokumentation:

StackOverflow - Passing colors through a pixel shader in HLSL

C++/DirectX11 Tutorials - S02E05 - Creating and loading Shaders um 9:33

Antwort

1

In Shader Model 4.0 und höher (DX10 +), die einzigen semantischen Namen, Materie sind System-Wert-Semantik (die Präfix SV_). Andere Semantiken haben keine spezielle Behandlung, abgesehen davon, dass sie verwendet werden, um Shader-Parameter mit ihren Eingaben zu vergleichen. Die Dokumentation in Bezug auf Semantik wie COLOR ist float4 ist rein Konvention oder Legacy von DX9. In DX10/SM4 + gibt es nichts, was Sie davon abhält, COLOR als float2 zu deklarieren oder UNICORN als semantischen Namen für Ihre Farben zu verwenden. Seien Sie jedoch nicht überrascht, wenn dies andere Entwickler (oder Sie) verwirrt, die den Code in Zukunft überprüfen .

Um Ihre spezifische Frage zu beantworten, ja können Sie einen beliebigen Datentyp für nicht-Semantik verwenden, oder sogar Ihre eigenen Namen erfinden. Stellen Sie nur sicher, dass Sie konsistente Benennung und Kanalanzahl zwischen den Stufen und der Deklaration des Eingabe-Layouts verwenden.

+0

Ahh, das ist großartig! Nach dem Nachdenken macht das einen Sinn. Da die Eingabestruktur des Shaders und die Vertexstruktur im Code gleich strukturiert sind, kopiert DirectX die Rohstruktur einfach auf die GPU und muss daher die spezifischen Komponentengrößen nicht kennen. Vielen Dank :) – Cubinator73