Das Problem:
Ich lerne OpenGL von http://www.arcsynthesis.org/gltut/index.html Tutorial, und ich hatte wirklich harte Zeit, Tutorial 13: Geometrie Impostors Arbeits (6+ Stunden), und es ist jetzt arbeite nach einer wirklich kleinen Änderung im Code, der eigentlich kein Op sein sollte, und ich brauche deine Hilfe, um herauszufinden, warum es irgendetwas ändert.GLSL, Schnittstellenblock
Erklärung - bearbeitet:
Das Problem war, dass die Fragment-Shader mit dem unveränderten Code nicht korrekt Eingabe von den Geometrie-Shader bekommen haben, aber mit entweder Geometrie-Shader die aus Schnittstellenblock ersetzen Variablen zu trennen oder geben der Block ein Instanzname macht das Programm gut. Aber diese Änderungen sollten no-op sein.
Das Problem ist wahrscheinlich eine Namenskollision.
Wie dies funktioniert es nicht:
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 */
}
Aber entweder geben FragData einen Instanznamen wie frag, und mit frag.mappaing instad von Mapping oder mit 3 separaten Variablen löst das Problem.
Warum funktioniert es nicht ohne einen Instanznamen?
Edit: Es scheint ein Treiberproblem zu sein.
Mit welcher Hardware betreiben Sie das? –
Programm läuft #verison 330 on: Geforce GTS 360M - "3.30 NVIDIA via CG-Compiler" – IceCool
Hm, mehr Shader und C++ - Code würde helfen, eine genauere Antwort zu geben. In Ihrem gs-Shader initialisieren/setzen Sie jedes Member von FragData für jede Vertex-Iteration korrekt, bevor Sie EmitVertex() aufrufen. Wenn Sie mehrere Aufrufe haben, stellen Sie sicher, dass Sie die FragData korrekt eingestellt haben. – dinony