2013-02-27 6 views
6

Sto lavorando su un motore di gioco e si è evoluto notevolmente. Perché il motore ha bisogno di lavorare su Mac anche, sto ancora utilizzando OpenGL 3.2 e 1.2 GLSL :-( Io uso GLEW che ho assunto avrebbe risolto problemi di estensione per meEstensioni OpenGL, come usarli correttamente in C e glsl

EDIT:.. Nel frattempo, parte della domanda è rispose - leggi alla successiva EDIT:

sono sempre stato in grado di fare shaders funzionano su Windows e Mac, a volte avrei dovuto aggiungere una riga nel codice GLSL come #extension GL_EXT_gpu_shader4: consentire per renderlo funziona su Mac. Sembra quindi che la mia versione di Windows darà un avvertimento quando si compila lo stesso shader, ma funzionerà.

Ma da allora Ho iniziato a usare gli shaders geometrici, il mio incubo è iniziato. Per qualche ragione, mac si aspetta che io usi #extension GL_EXT_gpu_shader4: abilita mentre Windows si aspetta che io usi #extension GL_EXT_geometry_shader4: abilita. Ciò rende meno ovvio creare uno shader indipendente dalla piattaforma.

Inoltre, e questo è ancora più fastidioso: versione per Windows vuole che io uso: glTransformFeedbackVaryings e Vorrei pensare che GLEW avrebbe renderlo disponibile per il mac, ma ci ho esplicitamente bisogno di usare glTransformFeedbackVaryingsEXT quali no lavoro sulla versione di Windows. Quindi ho bisogno di #ifdef per APPLE per utilizzare ciò che è necessario. Stesso problema con glBeginTransformFeedback e glBeginTransformFeedbackEXT.

Ma entrambi accettano glProgramParameteriEXT, c'è non ho bisogno del distiction ...

ho capito che è solo con le valutazioni di trasformare che sto avendo il problema, ma ... che cosa è questo tutto di?

Ho pensato di capire come funzionavano le estensioni OpenGL, ma sto iniziando a perdere questa comprensione.

Sta arrivando a un punto in cui penso che quando eseguo il codice su un altro sistema Windows o su un altro sistema Mac o su un altro sistema Linux, avrò nuovi problemi perché ci sono diversi adattatori grafici o qualcosa del genere.

Qualcuno può aiutarmi a capire questo? Ho letto il manuale OpenGL sulle estensioni, quindi mi manca qualcosa di ovvio. Come posso assicurarmi che il mio codice funzioni sempre?

EDIT: Rimuovendo GLEW completamente dalla versione per Mac e completamente utilizzando propria implementazione OpenGL 3.2 del Mac, tutti i namings sono normali e posso completamente rimuovere il #extension GL_EXT_gpu_shader4: abilitare dai miei shaders. L'unica cosa che mi fa preoccupare ora è che per gli shader geometrici, ho bisogno della funzione glProgramParameteri che non sembra esistere, ma lo è glProgramParameteriEXT. Per qualche ragione, questa funzione funziona anche su Windows. Perché? Posso essere sicuro che funzionerà su tutti i sistemi/hardware?

+0

di Apple di solito è un po 'indietro, quindi potresti semplicemente voler controllare la versione supportata ufficialmente. [this] (http://stackoverflow.com/questions/15101939/glsl-vertex-shader-crashes-computer) è stato pubblicato prima della tua domanda. –

+0

Hm, non penso che il post mi aiuti. Sto sviluppando su OSX Lion 10.7.5 ed è un adattatore grafico AMD. Ma se ti capisco bene, i problemi sono legati alla cattiva implementazione di Apple? In che modo tutti quei giochi a vapore vengono portati e funzionano? – scippie

+0

Perché non stai usando il core OpenGL 3.2 disponibile su MacOSX. –

risposta

3

EXT indica che si sta utilizzando un'estensione per lo shader della geometria. Questo dovrebbe funzionare anche su Windows. Lo shader di geometria dovrebbe essere la funzionalità di base in OpenGL 3.2, ma al momento stai usando l'estensione (fondamentalmente stai usando la funzionalità di versioni precedenti di OpenGL non attuali 3.2). Per usare il core geometry shader devi passare a GLSL 1.5.

Non sono molto esperto in OpenGL, ma la mia ipotesi è che glProgramParameteri() non sia più necessario in realtà se si inizia a utilizzare la funzionalità di base, motivo per cui manca nelle intestazioni della libreria.

+0

Grazie, questa è una risposta molto interessante. Lo assorbirò e prenderò del tempo per scoprire se risponde completamente alla mia domanda. – scippie

+0

Hai ragione che glProgramParameteri() non è più necessario nelle funzionalità di base. Lì quei parametri sono impostati all'interno del codice dello shader stesso. – scippie

+0

E penso che tu abbia pienamente risposto alla mia domanda. La contrassegnerò come la risposta corretta. – scippie

2

La tua vita sarà più facile se segui le versioni OpenGL/GLSL corrispondenti.

http://en.wikipedia.org/wiki/OpenGL_Shading_Language

ritiro da:

  • OpenGL 2.1, con GLSL 120 + GL_EXT_gpu_shader4 + GL_EXT_geometry_shader4
  • OpenGL 3.2, con GLSL 150
  • OpenGL 3.3, con GLSL 330

Se sei già soddisfatto con OpenGL 3.2, passa a GLSL 1 50, poiché è più vicino al moderno GLSL 330+. Se vuoi la massima compatibilità, usa OpenGL 2.1, GLSL 120, più le estensioni shader geometriche. (anche se non sono sicuro di quanta più compatibilità acquisti)

SOLO quando si utilizzano le estensioni GLSL 120 plus, è necessario utilizzare glProgramParameteriEXT() per specificare il tipo primitivo in/out di prim'ordine e il conteggio dei vertici. Per esempio:

glUseProgram(prog); 
glProgramParameteriEXT(prog, GL_GEOMETRY_INPUT_TYPE_EXT, GL_TRIANGLES); 
glProgramParameteriEXT(prog, GL_GEOMETRY_OUTPUT_TYPE_EXT, GL_TRIANGLE_STRIP); 
glProgramParameteriEXT(prog, GL_GEOMETRY_VERTICES_OUT_EXT, max_output_verticies); 

https://wiki.engr.illinois.edu/display/graphics/Geometry+Shader+Hello+World

In OpenGL 3.2, GLSL 150+, si specificare queste informazioni nel vostro degli shader, utilizzando una dichiarazione del tipo:

#version 150 
layout (triangles) in; 
layout (triangle_strip, max_vertices = 3) out; 

http://www.lighthouse3d.com/tutorials/glsl-core-tutorial/geometry-shader/

+0

Bene David, grazie, e sarei totalmente d'accordo su questo, ma ecco la cosa: quando provo a creare i miei shader per essere compatibile con Mac, devo usare 120 + le estensioni. Funziona bene, ma non funzionerà sul mio PC desktop in cui il driver nvidia fallirà sulla linea di estensione per essere inesistente. In questo momento ho appena abbandonato il supporto mac, posso sempre scrivere codice extra per il Mac più tardi. Mi sta solo trattenendo. Sono molto contento di 3.3 + 330 ora. – scippie