[C++ / D3D] Precompiled Shader loaden

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Andi
Beiträge: 81
Registriert: 12.03.2009, 00:19

[C++ / D3D] Precompiled Shader loaden

Beitrag 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?
Benutzeravatar
Krishty
Establishment
Beiträge: 8239
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Andi
Beiträge: 81
Registriert: 12.03.2009, 00:19

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

Beitrag 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.
Benutzeravatar
Krishty
Establishment
Beiträge: 8239
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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 :)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Andi
Beiträge: 81
Registriert: 12.03.2009, 00:19

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

Beitrag von Andi »

Danke Krishty

Das Kompilieren ist jetzt um eine Ecke einfacher, aber beim erstellen des Shader schmiert mir die Applikation immer noch ab.
Benutzeravatar
Krishty
Establishment
Beiträge: 8239
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag von Krishty »

Genauer? Zugriffsverletzung? Haltepunkt der Debug-Laufzeitbibliothek? Code?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Andi
Beiträge: 81
Registriert: 12.03.2009, 00:19

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

Beitrag von Andi »

Hab versucht wieder alle so zu machen wie vorhin. Bekomme jetzt einen Zugriffsverletzung beim Schrieben an Position 0x00000000, hmmm
Benutzeravatar
Krishty
Establishment
Beiträge: 8239
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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 …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Andi
Beiträge: 81
Registriert: 12.03.2009, 00:19

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

Beitrag 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);
Benutzeravatar
Schrompf
Moderator
Beiträge: 4855
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

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

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Jonathan
Establishment
Beiträge: 2369
Registriert: 04.08.2004, 20:06
Kontaktdaten:

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

Beitrag 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?
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Krishty
Establishment
Beiträge: 8239
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag von Krishty »

Den kompilierten Bytecode als Array of BYTE zur Verfügung stellen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Andi
Beiträge: 81
Registriert: 12.03.2009, 00:19

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

Beitrag 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;
Benutzeravatar
Krishty
Establishment
Beiträge: 8239
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag 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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Andi
Beiträge: 81
Registriert: 12.03.2009, 00:19

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

Beitrag 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.
Antworten