auf den Wunsch hin beschreibe ich hier mal Stichpunktartig wie man shader per Makefile und der VC 2008 console kompilieren kann.
Benötigt wird Visual Studio und das Microsoft SDK:
http://www.microsoft.com/express/download/
http://www.microsoft.com/downloads/deta ... laylang=en
Habt ihr beides installiert navigiert zu:
C:\Program Files\Microsoft Visual Studio 9.0\VC\include
macht eine Kopie von "io.h" im gleichen Ordner und benennt diese in "unistd.h".
Als nächstes legen wir uns einen Ordner an, den wir für unsere shader- Entwicklung benutzen, z.B.
"ShaderSources"
In diesen Ordner legen wir 5 weitere Ordner und eine Textdatei (ohne Endung) an:
bin32
bin64
inc
lib
src
->Textdatei: "makefile"
Im Ordner src werden wir später unsere Source Codes (.c bzw. .cpp) anlegen und bearbeiten.
In den Ordner lib kopieren wir unsere shader libs. In Max wären diese zu finden unter:
*\3dsMax***\mentalray\dev\lib32 bzw. 64
Um 32 bit sowie 64 bit kompilieren zu können kopieren wir gleich beide und benennen diese um in:
shader32.lib
shader64.lib
In der Ordner inc kopieren wir nun als letztes unsere Include Files. Vollständige Liste der mr Includes wären:
geoshader.h
mi_ioptions.h
mi_shader_if.h
mi_version.h
mia_material_api.h
shader.h
Meistens werden jedoch nur "geshader.h;mi_shader_if.h;shader.h" benötigt. Kompiliert ihr bestehende Sources seht ihr am Anfang des Codes eh welche Includes benötigt werden.
Als nächste öffnen wir, mit einen geeigneten Editor, nun unsere Makefile im Rootordner. An dieser Stelle kann ich nur Nodepad++ empfehlen, ist ein sehr feiner Texteditor: http://notepad-plus.sourceforge.net/de/site.htm
In das File kopiert nun folgenden Text:
- Code: Select all
EXENAME=shadername
SSYSTEM=WINDOWS
CFLAGS=/TP /c /O2 /MD /nologo /W3 -DWIN_NT /EHsc
LFLAGS=/nologo /nodefaultlib:LIBC.LIB /OPT:NOREF /INCREMENTAL:NO
DEFINES=\
/D "WIN32" \
/D "NDEBUG" \
/D "_CRT_SECURE_NO_WARNINGS"
INCLUDES=\
/I "./" \
/I "./src" \
/I "./inc" \
/I "./lib"
LIBS=\
kernel32.lib\
user32.lib\
gdi32.lib\
winspool.lib\
comdlg32.lib\
advapi32.lib\
shell32.lib\
comctl32.lib
LIBS32=\
$(LIBS)\
.\lib\shader32.lib
LIBS64=\
$(LIBS)\
.\lib\shader64.lib
OBJS=\
src\shadername.obj
OBJS32=\
$(OBJS)
OBJS64=\
$(OBJS)
32: $(OBJS32)
@link $(LFLAGS) /MACHINE:IX86 /SUBSYSTEM:$(SSYSTEM) /DLL /OUT:./bin32/$(EXENAME).dll $(OBJS32) $(LIBS32)
mt.exe -nologo -manifest ./bin32/$(EXENAME).dll.manifest -outputresource:./bin32/$(EXENAME).dll;2
@echo - DONE -
64: $(OBJS64)
@link $(LFLAGS) /MACHINE:AMD64 /SUBSYSTEM:$(SSYSTEM) /DLL /OUT:./bin64/$(EXENAME).dll $(OBJS64) $(LIBS64)
mt.exe -nologo -manifest ./bin64/$(EXENAME).dll.manifest -outputresource:./bin64/$(EXENAME).dll;2
@echo - DONE -
.cpp.obj:
@cl $(CFLAGS) $(DEFINES) $(INCLUDES) /Fo$*.obj /c $<
.c.obj:
@cl $(CFLAGS) $(DEFINES) $(INCLUDES) /Fo$*.obj /c $<
clean:
@del .\*.idb
@del .\bin32\*.exp
@del .\bin32\*.lib
@del .\bin64\*.exp
@del .\bin64\*.lib
@del src\*.obj
Und Speichert das File ab. Dieses File bleibt zum größten Teil immer so wie es ist. Zum Kompilieren müssen immer nur zwei Zeilen geädert werden.
In Zeile 1, wird der Shadername angegeben und in Zeile 40 wird das "obj" zum shader angegeben. Möchten wir z.B. den shader add_color.c kompilieren sehen die Zeilen so aus:
- Code: Select all
EXENAME=add_colors
[...]
OBJS=\
src\add_colors.obj
Für das Kompilieren stehen nun 3 Befehle für die Kommandozeile zur Verfügung:
>nmake (kompiliert 32 bit shader)
>nmake 64 (kompiliert 64 bit shader)
>nmake clean (löscht die entstandenen Tempfiles: obj usw.)
Noch kurz zu den Parametern im Makefile:
EXENAME=add_colors
SSYSTEM=WINDOWS
"Exename" sagt dem Compiler welches File er zu kompilieren hat, "System" für welches BS entwickelt wird.
- Code: Select all
CFLAGS=/TP /c /O2 /MD /nologo /W3 -DWIN_NT /EHsc
LFLAGS=/nologo /nodefaultlib:LIBC.LIB /OPT:NOREF /INCREMENTAL:NO
Hier werden die Kompilierungsparameter übergeben.
- Code: Select all
INCLUDES=\
/I "./" \
/I "./src" \
/I "./inc" \
/I "./lib"
Hier wird auf die Projektornder verwiesen, in welchen die Sources liegen, die Includes und Libs.
- Code: Select all
LIBS=\
kernel32.lib\
user32.lib\
gdi32.lib\
winspool.lib\
comdlg32.lib\
advapi32.lib\
shell32.lib\
comctl32.lib
Hier werden die Windows- eigenen Libs eingebunden.
- Code: Select all
LIBS32=\
$(LIBS)\
.\lib\shader32.lib
LIBS64=\
$(LIBS)\
.\lib\shader64.lib
Hier wird auf die 32 bit und 64 bit shader libs verwiesen
- Code: Select all
OBJS=\
src\add_colors.obj
OBJS32=\
$(OBJS)
OBJS64=\
$(OBJS)
In diesem Abschnitt wird dem Compiler gesagt welches obj er erstellen muss.
- Code: Select all
32: $(OBJS32)
@link $(LFLAGS) /MACHINE:IX86 /SUBSYSTEM:$(SSYSTEM) /DLL /OUT:./bin32/$(EXENAME).dll $(OBJS32) $(LIBS32)
mt.exe -nologo -manifest ./bin32/$(EXENAME).dll.manifest -outputresource:./bin32/$(EXENAME).dll;2
@echo - DONE -
64: $(OBJS64)
@link $(LFLAGS) /MACHINE:AMD64 /SUBSYSTEM:$(SSYSTEM) /DLL /OUT:./bin64/$(EXENAME).dll $(OBJS64) $(LIBS64)
mt.exe -nologo -manifest ./bin64/$(EXENAME).dll.manifest -outputresource:./bin64/$(EXENAME).dll;2
@echo - DONE -
.cpp.obj:
@cl $(CFLAGS) $(DEFINES) $(INCLUDES) /Fo$*.obj /c $<
.c.obj:
@cl $(CFLAGS) $(DEFINES) $(INCLUDES) /Fo$*.obj /c $<
Hier wird der Output definiert, also dass eine dll kompiliert werden soll, für welches System, was gelinkt werden muss und dass die manifest Datei einbezogen werden soll.
(Siehe: http://forum.mentalimages.com/showthread.php?t=4513 )
- Code: Select all
clean:
@del .\*.idb
@del .\bin32\*.exp
@del .\bin32\*.lib
@del .\bin64\*.exp
@del .\bin64\*.lib
@del src\*.obj
Durch das Aufrufen von "nmake clean" wird über diesen Abschnitt definiert, was alles nach dem Kompilieren wieder gelöscht werden soll.
Haben wir nun alles korrekt eingerichtet und haben einen Sourcecode zur Hand, rufen wir nun die VC Console auf und Kompilieren unseren Code. Zu finden ist die Console unter:
Start/Programme/Microsoft Visual Studio 2008/Visual Studio Tools/Visual Studio 2008 x64 Cross Tools-Eingabeaufforderung öffnen
Bzw. für 32 bit: Visual Studio 2008-Eingabeaufforderung öffnen
Für dieses Beispiel möchte ich einen 64 bit shader kompilieren, daher nehme ich die 64 bit Console.
Hier navigieren wir nun zu unserem Projektordner, in diesem Fall "ShaderSources", und tippe den Befehl nmake 64 ein und anschließend nmake clean:
Haben wir alles richtig gemacht, dürften keine Fehler auftauchen
Ich hoffe ihr könnt was damit anfangen, wenn ihr fragen oder Kritik habt, könnt ihr diese hier gerne schildern. Natürlich übernehme ich keine Verantwortung für eventuelle Schäden, noch die Vollständigkeit des Textes.
Grüße
jb_
