2015-10-15 15 views
5

Questa è una specie di domanda filosofica.Dove devo conservare il mio codice dello shader?

Mi stavo chiedendo, se ci sono modi eleganti per includere il codice shader in un progetto QtCreator standard. Gli unici due modi di cui sono a conoscenza sono:

  1. Il codice dello shader si trova in un file separato, ad es. "fragmentshader.frag", questo file viene letto in runtime e il codice shader viene compilato e collegato.

  2. Il codice dello shader è una stringa codificata in uno dei file di origine inclusi nel progetto.

Entrambi i modi mi sembrano un po 'fastidiosi. La prima possibilità richiede che i file sull'harddrive debbano essere nella stessa directory dell'eseguibile (quindi dovrei metterli in ciascuna directory di debug/release e finire con diversi duplicati del mio file shader) o in uno specifico hardcoded directory sul mio disco, che sembra male per la portabilità.

La seconda possibilità mi infastidisce, perché devi includere elementi come \n nel codice dello shader, il che rende la formattazione di brutto.

Come è il modo "giusto" per farlo? Se è di qualche importanza, sto codificando in c/C++, OpenGL e GLSL.

EDIT: Ho continuato a utilizzare Google su questo ... Ho notato che ad esempio un file di icona può essere conservato in una cartella di risorse speciali nel progetto. In questo modo è un file e può essere modificato come tale, ma non deve ancora essere caricato in runtime. C'è un modo per farlo con gli shader?

risposta

5

Un'altra cosa che puoi fare è utilizzare stringhe letterali prime, se si dispone di C++ 11:

const char shaderSource[] = R"glsl(
#version 450 core 

...  

void main() { 
    ... 
} 
)glsl"; 

No \n in vista :)

+0

questo è interisting! Lo proverò sicuramente! –

+0

Potrebbe essere, che devi aggiungere '" 'all'inizio di ogni riga? Ho appena configurato il mio file pro per usare C++ 11 e all'interno del char array, se premo invio automaticamente mi dà un segno di virgolette. anche lo shader test non ha funzionato come hai postato qui) –

+0

Ha funzionato comunque, senza il 'glsl()' e con le virgolette prima e dopo ogni riga. –

1

Penso che non sia una risposta adeguata, ma è anche troppo lunga per un commento.

In parole povere, hai ragione - o hai i tuoi shader disponibili in fase di compilazione e hardcoded, o caricati in runtime. Ho intenzione di approfondire i vari modi in cui è possibile ottenere questo. Tieni presente che tutto ciò che viene detto può essere applicato a qualsiasi altro tipo di risorsa dati che il tuo programma deve eseguire.

Hard-codifica può essere fatto in un po 'maniera più elegante: mantenere le risorse in file separati, ma impostare il sistema di compilazione in modo che genera automaticamente file di origine con risorse hard-coded (come un array statico o dinamico di std::uint8_t o char, ad esempio) e compila quei file generati nel programma. Qui probabilmente avrai bisogno di un programma di utilità che generi file sorgenti C++ da dati binari. Non sono a conoscenza di programmi di buona qualità come questo; quando ne avevo bisogno, ho scritto il mio, dato che è piuttosto semplice.

Per rendere più runtime il caricamento più portatile, è possibile utilizzare un sacco di opzioni, ma sembra che il più importante sia rendere configurabile la posizione delle risorse nel file system; a tempo di esecuzione o di compilazione, dipende da te. Può essere un flag di compilazione (ad esempio una macro RUNTIME_RESOURCE_PATH, configurata dal sistema di generazione). Può essere un'opzione della riga di comando con qualche ragionevole valore predefinito.

Non ho risposta su quale modo è right. Uno dovrebbe essere scelto considerando il caso d'uso.

I dati hardcoded semplificano l'implementazione (meno file, meno espliciti io, meno errori), mentre le risorse in file separati consentono di aggiornarli senza toccare il programma stesso, inclusa la modifica degli utenti.

Problemi correlati