Il problema:
Sto imparando OpenGL da http://www.arcsynthesis.org/gltut/index.html tutorial, e ho avuto il tempo davvero difficile ottenere Tutorial 13: Impostors geometria lavoro (6+ ore), ed è ora lavorando dopo un cambiamento davvero minimo nel codice che dovrebbe essere in realtà no-op, e ho bisogno del tuo aiuto per scoprire perché cambia qualcosa.GLSL, blocco di interfaccia
Spiegazione - a cura:
Il problema era che con il codice inalterato lo shader frammento non ha ottenuto corretto input dal geometry shader, ma sia con la sostituzione geometry shader di fuori blocco dell'interfaccia per separare le variabili o dare il blocco un nome di istanza fa funzionare bene il programma. Ma questi cambiamenti dovrebbero essere vietati.
Il problema è probabilmente una collisione di nome.
Ti piace questa non funziona:
in VertexData
{
vec3 cameraSpherePos;
float sphereRadius;
} vert[];
out FragData
{
flat vec3 cameraSpherePos;
flat float sphereRadius;
smooth vec2 mapping;
};
void main()
{
mapping =
cameraSpherePos =
sphereRadius =
EmitVertex();
/* mapping's value doesn't get to the fragment shader correctly */
}
Ma in entrambi dando FragData un nome di istanza come la frammentazione, e l'utilizzo di frag.mappaing instad di mappatura, o utilizzando 3 variabili separate risolve il problema.
Perché non funziona senza un nome di istanza?
Modifica: sembra essere un problema di driver.
Quale hardware è in esecuzione? –
Il programma è in esecuzione #verison 330 su: Geforce GTS 360M - "3.30 NVIDIA tramite compilatore Cg" – IceCool
Hm, più shader e codice C++ potrebbero aiutare a fornire una risposta più accurata. Nel tuo gs shader stai inizializzando/impostando ogni membro di FragData corretto per ogni iterazione del vertice, prima di chiamare EmitVertex(). Inoltre, se hai più invocazioni, assicurati di aver impostato correttamente FragData. – dinony