2016-04-09 9 views
0

Ich arbeite über DirectX-Shadern und C++ - Code in Visual Studio 2015 und möchte nur einen Code machen, also habe ich angefangen, mit Makros zu spielen, weil ich es als effektiven Weg ansehe, wie man das vereinheitlicht Code.HLSL-Präprozessor in Visual Studio 2015

Der HLSL-Präprozessor in Visual Studio unterscheidet sich ein wenig von dem C++ - Präprozessor, z. Es unterstützt keine Variadic-Makros. auf der anderen Seite ist die grundlegende Arbeit die gleiche (siehe documentation).

Mein Problem ist, dass, wenn ich folgenden Code verwenden:

STATIC_TRAITS_DECLARATION SimpleVertexDefinition(PARSER_MEMORY, CONTEXT_MEMORY) 

Wo alle Bedingungen (SimpleVertexDefinitions, STATIC_TRAITS_DECLARATION, CONTEXT_MEMORY, PARSER_MEMORY) sind Makros, funktioniert alles einwandfrei. Aber wenn ich versuche, es zu definieren, indem folgende Makro

#define DECLARE_VERTEX_SHADER_INPUT(type) STATIC_TRAITS_DECLARATION type##Definition(PARSER_MEMORY, CONTEXT_MEMORY) 

DECLARE_VERTEX_SHADER_INPUT(SimpleVertex) 

ich

Error X1516 not enough actual parameters for macro 'SimpleVertexDefinition' 
Error X3000 unrecognized identifier 'SimpleVertexDefinition'  

Durch die Art und Weise

  • C++ Präprozessor hat kein Problem, es zu kompilieren
  • Macro Verkettung funktioniert gut in anderen HLSL-Codes.

ich froh wäre, wenn jemand kann mir erklären, was falsch ist, weil ich glaube, dass meine Makros geschrieben werden nach documentation ...

Antwort

0

Problem ist wahrscheinlich in der falschen Umsetzung der Präprozessor in fxc.exe (Effekt-Compiler-Werkzeug).

Mögliche Lösung ist Visual Studio manuell mit c

  • Vorprozess Datei zu konfigurieren ++ Compiler cl.exe file /P [other option] /FipreprocessedFile
  • und dann kompilieren mit Wirkung Compiler Tool fxc.exe preprocessedFile [options]

https://social.msdn.microsoft.com/Forums/en-US/b6ccd269-8ef4-4b80-b575-da58894a71ee/hlsl-preprocessor-in-visual-studio-2015?forum=vclanguage

+0

Kann jemand es bestätigen? – user4663214

0

es gut ist kein Fehler in der Microsoft HLSL-Implementierung. Tatsächlich funktioniert der HLSL-Prozessor anders (was schade ist). Weitere Informationen finden Sie unter dem folgenden Link.

https://msdn.microsoft.com/en-us/library/windows/desktop/dd607345%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

Als Abhilfe können Sie eine Vorverarbeitung Bibliothek verwenden könnten (ich benutze FCPP, es funktioniert OK) Vorprozess den Code, bevor es die HLSL-Compiler übergeben.

+0

Es ist Bug (wie auf MSDN bestätigt) und ja, dieser Präprozessor arbeitet anders als Standard-C++ Präprozessor. Das beschriebene Beispiel ist nicht außerhalb der Spezifikation des HLSL-Präprozessors, auch wenn es fehlschlägt, daher könnte es als Fehler angesehen werden ... – user4663214