2017-06-20 3 views
0

Ich bekomme einen merkwürdigen Fehler, wenn ich versuche, einen Float von meinem Vertex zum Fragment-Shader zu übergeben.GLSL-Variable wird nicht vom Vertex zum Fragment-Shader übergeben

Vertex-Shader:

#version 450 

out float someFloat; 

void main() { 
someFloat = 1.0; 
// some code ... 
} 

Fragment-Shader:

#version 450 

in float someFloat; 

void main() { 

// some code using someFloat ... 
} 

Das wird nicht funktionieren und immer Null passieren, während dies funktioniert:

Vertex-Shader:

#version 450 

layout (location = 0) out float someFloat; 

void main() { 

    someFloat = 1.0; 

    // some code ... 
} 

Fragment sha der:

#version 450 

layout (location = 0) in float someFloat; 

void main() { 

// Some code using someFloat ... 
} 

Aber wie kann ich das tun, ohne Standorte zu verwenden?

+0

Sind die zusammen in das gleiche Programm verknüpft Shadern oder verwenden Sie mehrere Programme über eine Pipeline-Objekt? –

+0

Ich verwende die Grafik-Pipeline von Vulkans. Ich habe auch ein vec3-Array, das ohne Probleme mit hinein und heraus übergeben werden kann. – Shedex

+1

"* Ich benutze die Grafikpipeline von Vulkans *" Dann müssen Sie das sagen, weil das sehr wichtig ist, warum Ihr Code nicht funktioniert. –

Antwort

5

Nach KHR_vulkan_glsl, die die Zusammenstellung von GLSL in SPIR-V für Vulkan regelt:

Beim Erzeugen SPIR-V, alle in und out qualifizierte Benutzer deklariert (nicht eingebaute) Variablen und blockiert (oder alle ihre Mitglieder) müssen einen Shader-spezifizierten location haben. Andernfalls wird ein Kompilierungsfehler generiert.

Hervorhebung hinzugefügt. GLSL ist nicht identisch zwischen OpenGL und Vulkan.

Dies ist natürlich, weil SPIR-V nicht erlaubt GLSL-Ressourcen-Matching zwischen den Stufen nach Namen (da SPIR-V-Variablen müssen nicht Namen haben). Es funktioniert nur nach Ort. Und anstatt den Compiler zum Generieren von Speicherorten zu veranlassen, die mit den in anderen Phasen durch Namen angegebenen Speicherorten übereinstimmen, müssen Benutzer lediglich die Speicherorte direkt im Shader angeben.

Sie sollten einen Fehler von Ihrem GLSL-Compiler erhalten haben.

+0

Wusste nicht, dass OpenGL und Vulkan GLSL anders waren, danke für die Klärung und Hilfe – Shedex

0

Sie müssen eine variierende Variable verwenden.

Vertex-Shader:

varying float someFloat; 

void main() { 
    someFloat = 1.0; 
    // some code ... 
} 

Fragment-Shader:

varying float someFloat; 

void main() { 
    // some code using someFloat ... 
} 
+0

Varianten sind ab GLSL 4.20 veraltet, also wenn Sie Vulkan (und moderne GLSL) tun, sollten Sie sich von ihnen fernhalten und mit hinein/heraus gehen Qualifikanten mit Locations, wie Nical Bolas darauf hingewiesen hat. –

+0

Tut mir leid, ich bin zu alt. Danke für den Termin. –

Verwandte Themen