Seite 1 von 1

[C++ / D3D] Precompiled Shader loaden

Verfasst: 13.04.2015, 20:41
von Andi
Hi,

ich versuche ein Precompiled Shader an den Vertex Shader zu übergeben, erfolglos. Die Anwendung schmiert mir immer beim Erstellen des Shader ab. Ich will die "d3dcompiler_47.dll" nicht in meinem Verzeichnis rumliegen habe, deshalb fällt D3DReadFileToBlob schon mal. Kompiliert hab ich mit fxc oder in der App mit D3DWriteBlobToFile gespeichert, in beiden Fällen kommt das gleiche dabei raus. Kompiliere ich zur Laufzeit und übergebe D3D10Blob* an die CreateVertexShader gibt's keine Probleme.
Ist an meinem Code was nicht i.o.? Aufs wesentliche gekürzt:

Code: Alles auswählen

std::ifstream s("datei.hlsl", std::ios::in | std::ios::binary);
char* data;
size_t size

s.seekg(0, std::ios::end);

size = s.tellg();
data = new char[size];

s.seekg(0, std::ios::beg);
s.read(data, size);
s.close();

d3ddevice->CreateVertexShader(data, size, 0, pVertexShader);

delete data;
Ich komme mir gerade ziemlich dumm vor :? Weiss jemand Rat?

Re: [C++ / D3D] Precompiled Shader loaden

Verfasst: 13.04.2015, 21:25
von Krishty
Falls du Visual Studio 2012 oder neuer hast, lass es direkt ganz sein:
  • Shader mit Endung .hlsl ins Projekt einbinden
  • Properties
  • Header-Namen und Header-Variablennamen setzen
  • #include "shadername.h"
  • CreateVertexShader(shader_variable_name, sizeof shader_variable_name);
  • PROFIT
Shader selber kompilieren ist immer scheiße.

Re: [C++ / D3D] Precompiled Shader loaden

Verfasst: 13.04.2015, 21:40
von Andi
Hab ich auch versucht bis auf
  • Header-Namen und Header-Variablennamen setzen
  • #include "shadername.h"
das hab ich nicht ganz begriffen wie und wo. Das ich immer an so trivialen Nebensächlichkeiten anstossen muss mit D3D.

Re: [C++ / D3D] Precompiled Shader loaden

Verfasst: 13.04.2015, 21:48
von Krishty
Properties -> HLSL Compiler -> Header Variable Name / Header File Name
Object File Name muss dementsprechend leer sein, weil du ja nicht an zwei Orte kompilieren kannst.

Wenn es dich nervt, Shader Model etc. für alle Shader des Projekts einzeln einzustellen, dann erinner dich, dass die Projektoptionen vererben :)

Re: [C++ / D3D] Precompiled Shader loaden

Verfasst: 13.04.2015, 22:09
von Andi
Danke Krishty

Das Kompilieren ist jetzt um eine Ecke einfacher, aber beim erstellen des Shader schmiert mir die Applikation immer noch ab.

Re: [C++ / D3D] Precompiled Shader loaden

Verfasst: 13.04.2015, 23:15
von Krishty
Genauer? Zugriffsverletzung? Haltepunkt der Debug-Laufzeitbibliothek? Code?

Re: [C++ / D3D] Precompiled Shader loaden

Verfasst: 14.04.2015, 00:00
von Andi
Hab versucht wieder alle so zu machen wie vorhin. Bekomme jetzt einen Zugriffsverletzung beim Schrieben an Position 0x00000000, hmmm

Re: [C++ / D3D] Precompiled Shader loaden

Verfasst: 14.04.2015, 00:06
von Krishty
d3ddevice->CreateVertexShader(data, size, 0, pVertexShader); von oben ist jedenfalls falsch; du brauchst einen gültigen Zeiger zu irgendeinem Zeiger auf einen ID3D11VertexShader …

Re: [C++ / D3D] Precompiled Shader loaden

Verfasst: 14.04.2015, 00:20
von Andi
War nur ein Bespielscode, einen gültigen Zeiger auf ID3D11VertexShader hab ich. Verstehe nun nicht ganz wieso es so geht:

Code: Alles auswählen

std::ifstream s("datei.hlsl", std::ios::in | std::ios::binary);
std::vector<char> data;
size_t size

s.seekg(0, std::ios::end);

size = s.tellg();
data.resize(size)

s.seekg(0, std::ios::beg);
s.read(&data[0], size);
s.close();

d3ddevice->CreateVertexShader(&data[0], size, 0, pVertexShader);

Re: [C++ / D3D] Precompiled Shader loaden

Verfasst: 14.04.2015, 10:17
von Schrompf
&pVertexShader. Das ist das, was Krishty meinte: ein gültiger Zeiger auf einen ID3D11VertexShader-Zeiger - also ein Doppelzeiger.

Ohne Kenntnis von D3D11, aber bisher war das im D3D immer so.

Re: [C++ / D3D] Precompiled Shader loaden

Verfasst: 14.04.2015, 11:40
von Jonathan
Krishty hat geschrieben:Falls du Visual Studio 2012 oder neuer hast, lass es direkt ganz sein:
  • Shader mit Endung .hlsl ins Projekt einbinden
  • Properties
  • Header-Namen und Header-Variablennamen setzen
  • #include "shadername.h"
  • CreateVertexShader(shader_variable_name, sizeof shader_variable_name);
  • PROFIT
Shader selber kompilieren ist immer scheiße.
Was genau macht das? Den Inhalt einer Textdatei als String zur Verfügung stellen?

Re: [C++ / D3D] Precompiled Shader loaden

Verfasst: 14.04.2015, 14:14
von Krishty
Den kompilierten Bytecode als Array of BYTE zur Verfügung stellen.

Re: [C++ / D3D] Precompiled Shader loaden

Verfasst: 15.04.2015, 01:17
von Andi
Mein Fehler hab mich wieder vertippt, war und ist &pVertexShader. Muss auf jeden fall (de)referenziert werden. Sollte künftig wieder copy & past-en anstatt alles abzutippen.
Der Wurm muss wo anders drin gewesen sein, beim portieren vom "Test" zum eigentlichen Projekt hat sich das Problem erledigt. Danke für eure Zeit/Hilfe.

Glaube zwar nicht dass das jemandem hier wirklich hilft/braucht, der Richtigkeit halber alles nochmal:

Code: Alles auswählen

std::ifstream s("datei.hlsl", std::ios::in | std::ios::binary);
char* data;
size_t size

s.seekg(0, std::ios::end);

size = s.tellg();
data = new char[size];

s.seekg(0, std::ios::beg);
s.read(data, size);
s.close();

d3ddevice->CreateVertexShader(data, size, 0, &pVertexShader);

......

delete data;

Re: [C++ / D3D] Precompiled Shader loaden

Verfasst: 15.04.2015, 02:14
von Krishty
Ein Dateizugriff, Seeking, dynamische Speicherallokation, Kopie, und zwei möglicherweise nicht verfügbare und später wieder freizugebende Ressourcen … für den Bytecode eines Shaders? Das ist doch ein statisches Problem; kompilier den Header direkt rein, dann reduziert sich das zu Null und Nix ;)

Aber schön, dass es funktioniert.

Re: [C++ / D3D] Precompiled Shader loaden

Verfasst: 19.04.2015, 04:41
von Andi
Hast schon recht Krishty, wieso kompliziert wenns auch einfach geht ;) Der Hintergedanke ist der ganze Resource-Kram mit einer GUI zu verwalten und damit entsprechen Packages zu erstellen. Mit dem Packagekram würde zumindest das Seeking wegfallen.
Ertser Test sieht so aus:Bild
Edit:
Kein Seeking ist natürlich so nicht ganz richtig, sofern man nicht den gesamten Content aus dem Package exportiert.