2016-10-26 2 views
1

Ich verwende indexiertes Rendering und einen Geometrieshader. Wenn ich gl_VertexID an den Geometrieshader übergebe, funktioniert es gut, solange ich keine Eckpunkte aussende; Wenn ich einen oder mehrere Scheitelpunkte austausche, ist gl_VertexID (als beliebiger Name übergeben) gleich Null. Warum?gl_VertexID immer Null in jedem nützlichen Geometrieshader

Mit den unten beschriebenen Shadern fügt der Geometrieshader die richtigen Indizes in meinen Feedback-Puffer ein, wenn und nur wenn ich beide EmitVertex-Aufrufe auskommentiere. Was vermisse ich?

(Ich kann es umgehen, aber es ist die Hölle aus nervt mich!)

VERTEX SHADER

#version 440 

in vec4 position; 

out VSOUT{ 
    vec4 gl_Position; 
    int index; 
} vsout; 

uniform mat4 gl_ModelViewMatrix; 

void main(){ 
    gl_Position = gl_ModelViewMatrix * position; 
    vsout.index = gl_VertexID; 
    vsout.gl_Position = gl_Position; 
} 

GEOMETRIE SHADER

#version 440 
#extension GL_ARB_shader_storage_buffer_object : enable 

layout (lines) in; 
layout (line_strip) out; 

in VSOUT{ 
    vec4 gl_Position; 
    int index; 
} vdata[]; 

layout (std430, binding=0) buffer FeedbackBuffer{ 
    vec2 fb[]; 
}; 

void main(){ 
    int i = vdata[0].index; 
    int j = vdata[1].index; 

    fb[gl_PrimitiveIDIn][0] = vdata[0].index; 
    fb[gl_PrimitiveIDIn][1] = vdata[1].index; 

    gl_Position = gl_in[0].gl_Position; 
    EmitVertex(); 
    gl_Position = gl_in[1].gl_Position; 
    EmitVertex(); 
} 

FRAGMENT SHADER

#version 430 

out vec4 outputColor; 

void main(){ 
    outputColor = vec4(.5,.5,.5,.5); 
} 

Antwort

0

Das sieht also wie eine nVidia Implementierung Sache. Wenn ich diese Shader auf einer GeForce GTX580 starte, verhält sich das Verhalten wie oben beschrieben. Mit einem AMD FirePro V5900 verhält es sich wie erwartet mit den richtigen Werten im Feedback-Puffer, ob ich nun Eckpunkte aussende oder nicht.

+1

Ich denke, dass Ihr Problem möglicherweise das ist, was Sie erwarten, ist falsch? Pro-Vertex-Ausgaben werden nach dem Ausgeben eines Eckpunkts in der Geometrieshader-Stufe undefiniert. Sie können nichts erwarten, wenn Sie die Werte nicht explizit schreiben oder ein undefiniertes Verhalten erwarten. Schreibe jede Ausgabe pro Vertex nach jeder Ausgabe, dann kannst du Dinge erwarten :) –

+0

Yep - Ich habe darüber nachgedacht, aber weder der Index noch der Feedback-Puffer sind per-Vertex-Ausgaben. Der Puffer funktioniert unabhängig davon, ob ich emitVertex aufruft (ich kann es überprüfen, indem ich andere Werte darauf schreibe). Der Index ist eine ** Vertex-Eingabe **, und es scheint, dass diese durch emitVertex unterbrochen wird. – Mick

+0

Vertex-Streams für Transformations-Feedback erfassen ist Vertex-Ausgabe. Die GS läuft nach dem VS, nicht umgekehrt. Es ist auch nicht garantiert, dass die Kohärenz für alle Scheitelpunkte, die von einem Geometrieshader ausgegeben werden, gewährleistet ist, es sei denn, Sie schreiben die Werte für jeden generierten Scheitelpunkt. –