Wie kompilieren Sie Vertex- und Pixelshader zum Zeitpunkt der Erstellung in SharpDX? Die Art, wie Sie in "Direct3D Rendering Cookbook" lesen können, besteht darin, HLSLCompiler.CompileFromFile zu verwenden. Dies wird Shader zur Laufzeit kompilieren, was nicht immer gut ist.SharpDX Kompilieren von Shadern
Antwort
In neuesten SharpDX 4 können Sie Pixel-und Vertex-Shader zur Laufzeit kompilieren, das Problem ist, haben die meisten der (nicht aktualisiert) Windows 7 nicht D3DCompiler_47.dll, die Sie nicht einmal die SharpDX ausführen können (SharpDX.D3DCompiler ist nicht verfügbar). Es ist besser, fxc von DirectX SDK verwenden Shadern zur Buildzeit zu kompilieren wie folgt:
ComplieShaders.bat (diese Fledermaus-Datei ich als Teil des Projekts haben und ich es nennen, wenn app Gebäude):
Echo Building shaders
Echo Launch dir: "%~dp0"
Echo Current dir: "%CD%"
cd "%~dp0"
PATH="c:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Utilities\bin\x86\"
fxc /T vs_5_0 /E VSMain "Laser.hlsl" /Fo "MyVS.cso"
fxc /T ps_5_0 /E PSMain "Laser.hlsl" /Fo "MyPS.cso"
Die seltsame CD "% ~ dp0" wird in das richtige Verzeichnis verschoben. Diese Bat-Datei rufe ich von der Pre-Build-Ereignis-Befehlszeile auf (in C# -Projekteinstellungen -> Build-Ereignisse).
Dadurch werden binäre Shader-Daten wie MyVS.cso (für Vertex-Shader) und MyPS.cso (für Pixel-Shader) erzeugt. Diese beiden Dateien füge ich wieder als Inhalt in C# -Projekt ein.
Dann können Sie beide Dateien in C# verwenden:
string shaderFile = @"SomeDirectoryInYourApp\Shaders\MyVS.cso";
if (!Path.IsPathRooted(shaderFile))
{
shaderFile = Path.Combine(System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetEntryAssembly().Location),
shaderFile);
}
using (var shaderCodeReader = new System.IO.StreamReader(shaderFile))
{
vertexShaderBytecode = ToDispose(ShaderBytecode.FromStream(
shaderCodeReader.BaseStream));
}
vertexShader = ToDispose(new VertexShader(device, vertexShaderBytecode));
Wenn Sie Problem haben, Ihre MyVS.cso Datei in Ihrem C# app haben, können Sie assembly.GetManifestResourceNames() verwenden, Liste aller verfügbaren Inhalte zu erhalten Dateien in Assembly (mit vollständigem Pfad).
Nun, ich fand heraus, der obige Weg ist nicht so gut für den Einsatz. Das Problem ist, dass Inhaltsdateien außerhalb von exe oder dll liegen, also verwende ich sie lieber als "Eingebettete Ressource" - auf diese Weise werden die cso-Dateien in Assembly (dll oder exe) eingebettet. Um den Stream für eingebettete Ressourcen Gebrauch zu laden:
protected SharpDX.D3DCompiler.ShaderBytecode LoadShaderFromManifestResourceFile(
System.Reflection.Assembly assembly, string resourceName)
{
SharpDX.D3DCompiler.ShaderBytecode shaderBytecode = null;
using (var shaderCodeReader = assembly.GetManifestResourceStream(resourceName))
{
shaderBytecode = ToDispose(ShaderBytecode.FromStream(shaderCodeReader));
}
return shaderBytecode;
}
Um den Ressourcenpfad/Kennung zu erhalten (es kann ziemlich lang sein) können Sie:
var assembly = Assembly.GetExecutingAssembly();
string[] resources = assembly.GetManifestResourceNames();
- 1. Kompilieren von Shadern in PyQt
- 2. Shadern kompilieren nicht
- 3. Fehler beim Kompilieren Shadern GLSL 3.30
- 4. Fehler beim Kompilieren von Vertex-Shadern: ERROR: 0: 1: '/': Syntaxfehler
- 5. SharpDX StrokeStyle1
- 6. Unterschied zwischen Tessellations-Shadern und Geometry-Shadern
- 7. OpenGL - Schalter Shadern
- 8. QGLShaderProgram OpenGL Shadern
- 9. Performance-Profiling von OpenGL-Shadern
- 10. Größe ändern Texture2D SharpDX
- 11. SharpDX Render in WPF
- 12. 2D Kameraschwenk in SharpDX
- 13. 3D-Engine mit SharpDX
- 14. SharpDX 2D Fenster Resize
- 15. Verlassen der SharpDX RenderLoop
- 16. Cocos2d Unschärfe mit Shadern
- 17. GLSL für OpenGL ES 3.0, Kompilieren von Shadern fehlgeschlagen: nicht unterstützte Shader-Version
- 18. OpenGL: Linien mit Shadern
- 19. Profil Grafiken Shadern
- 20. Speichererhöhung mit SharpDX Bitmap Zeichnung
- 21. Ausführen von WebGL-Shadern auf travis-ci
- 22. Laden von Metallkern-Shadern zum Testen
- 23. Anwenden von Pixel-Shadern auf Bilder
- 24. Kombinieren von 2 Shadern in Einheit
- 25. Qt "Fehler beim Erstellen von D3D-Shadern."
- 26. SharpDX, DirectWrite und Windows Forms
- 27. SharpDX v4.0.1 sharpdx_direct3d11_effects_x64.dll DllNotFoundException
- 28. SharpDx Bitmap in Datei speichern
- 29. Dekonvolution mit Metal Performance Shadern
- 30. Zeichnung Antialiased Kreis mit Shadern