2011-12-16 3 views
8

Specificare la versione GLSL fornisce un errore di sintassi quando si utilizza LWJGL. Non ho provato a riprodurre questo problema al di fuori di LWJGL. Questo sta accadendo su più Mac con Lion.GLSL #version dà errore di sintassi (LWJGL su Mac)

Ho ottenuto il vertex e il framment shader per funzionare senza utilizzare #version. Ma sto per utilizzare la funzione texture, che sembra richiedere una direttiva #version.

Ecco l'esempio non riuscendo più semplice:

#version 120 

void main() { 
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); 
} 

Compilazione questo frammento shader e chiamando glGetShaderInfoLog dà questo errore:

ERROR: 0:1: '' : syntax error #version 

Sostituzione 120 con qualsiasi altra cosa, come ad esempio 110, dà anche un errore. Curiosamente, però, se uso 130 o più, dà lo stesso errore più un reclamo sulla versione non supportata da beig. (So ​​che il mio sistema non ha GLSL 1.3, ma è ancora strano che questo errore venga visualizzato quando il compilatore agisce come se non comprendesse il tag della versione.)

Sono su un Mac con un ATI Radeon HD 4670. GL_VERSION è 2.1 ATI-7.12.9 e GL_SHADING_LANGUAGE_VERSION è 1.20.

Dato che, non vedo alcuna ragione per cui GLSL 1.20 non dovrebbe essere disponibile. Ed è davvero strano per me che stia dicendo che #version è un errore di sintassi, al contrario di dire qualcosa su una versione GLSL non supportata.

+0

Dov'è il codice di caricamento dello shader? –

+0

Posso incollarlo una volta che ho internet. (Usando il mio telefono adesso). Il codice sorgente di Thab sarebbe utile? – rlkw1024

risposta

17

Risolto! Non aveva nulla a che fare con OpenGL. Il mio codice di lettore di file stava perdendo tutte le interruzioni di riga. Questo andava bene nel corpo dello shader, che aveva dei punti e virgola. Ma la direttiva del preprocessore non aveva punto e virgola per proteggerlo da questo errore.

Quindi, per chiunque abbia questo problema, assicurati che il codice che stai effettivamente passando a glShaderSource abbia ancora interruzioni di riga.

+1

Grazie mille, mi hai salvato la notte! Sono su Mac con SDL e C++, ma con questo oscuro messaggio di errore OpenGL stava cercando di dirmi la stessa cosa. – zubko

+0

Un modo per avvicinarsi a questo può essere trovato [qui] (http://schabby.de/opengl-shader-example/).BufferedReader estrae la sorgente dello shader riga per riga, scartando i caratteri CR/LF. Quindi si applica esplicitamente un carattere di nuova riga a ciascuna riga utilizzando StringBuilder (vedere circa 2/3 della pagina in basso). –

+0

Grazie mille pure. Questo era il problema esatto che stavo avendo. Pessime operazioni di eliminazione delle interruzioni di riga in Java! – Textfield

1

Sia il vertice che lo shader di frammenti devono avere la stessa versione. Pertanto, se si aggiunge uno #version 120 allo shader di frammenti, è necessario aggiungerlo anche al vertex shader. Ma è un po 'strano che questo sia segnalato come errore di sintassi. Forse c'è un altro errore, ma entrambi devono sicuramente avere lo stesso tag di versione.

EDIT: Ricorda inoltre che il tag di versione deve essere la prima riga nel codice sorgente dello shader (newlines e commenti devono essere Ok per specifica, ma chissà cosa pensano i piloti).

+0

Ho provato ad usare la stessa versione in entrambi, ma senza fortuna. Dato che questo accade nella compilazione e non nel collegamento, non penso che gli shader sappiano l'uno dell'altro. – rlkw1024

+0

@Jarrett Considerando l'inquietante venditore della tua scheda grafica, potrebbe anche essere un bug del driver. Anche se questa è davvero una caratteristica molto semplice e non dovrebbe essere un problema da supportare, ma poi ancora, è ancora ATI. –

+0

Ho giustamente verificato lo stesso problema con una GeForce 320M. Quindi sto iniziando a dubitare che entrambi i venditori abbiano lo stesso identico bug in una caratteristica base. – rlkw1024