2012-04-15 2 views
2

Zusammenfassend, mein Vollbild-Shader gibt nichts aus,Warum gibt OpenGL + GLSL Shader nichts aus?

Ich schreibe einen verzögerten Shader in GLSL und ich habe zu der Stufe, wo ich Lichter im Bildschirm Raum anwenden. Ich habe einen Ambient-Pass, bei dem ich im Grunde die diffuse Intensität vom GBuffer zum Standard-FBO schreibe, das funktioniert gut. Ich wende dann ein anderes Vollbildquadrat an, um das gerichtete Licht in der Szene zu berechnen, wieder dieses Muster von dem GBUffer und sollte mit dem Standard-FBO gemischt werden.

Das Problem, das ich habe, ist, dass der gerichtete Lichtshader nichts ausgibt. Ich benutze die gleichen Matrizen und Transformationen wie beim Ambient Pass, aber nichts ändert sich.

Ich habe Folgendes versucht;

  1. Geben Sie die gleiche Farbe an jedem Fragment im Umgebungsdurchlauf aus, um sicherzustellen, dass es überhaupt ausgegeben wird. (Werke)
  2. Ausgabe der gleichen Farbe an jedem Fragment im gerichteten Lichtdurchgang. (Immer noch nichts)
  3. Verwenden Sie die Bildschirmauflösung für XY-Eckpunktkoordinaten im Gegensatz zu normalisierten Koordinaten;
    • Dies funktioniert für den Ambient Pass, da ich die Ergebnisse wie erwartet sehen kann.
    • Es ändert nichts für den gerichteten Lichtdurchgang und ich bekomme die gleiche Ausgabe.
  4. Veränderung der Umgebungs Shader von den normalen oder Position Puffer zur Probe die Texturen zu gewährleisten, können aus (Arbeits) abgetastet werden

Hier ist der Anwendungscode;

glBindFramebuffer(GL_READ_FRAMEBUFFER, m_GeometryBuffer->m_Name); 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); 
glDrawBuffers(1,draw_buffers); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

m_AmbientShader->Begin(); 
    m_AmbientShader->SetUniformInt1("Diffuse",m_DiffuseTexture->m_TextureUnit); 
    // Draw full screen quad 
    glBegin(GL_QUADS); 
     glMultiTexCoord2i(GL_TEXTURE0,0,0); 
     glVertex2i(-1,-1); 
     glMultiTexCoord2i(GL_TEXTURE0,1,0); 
     glVertex2i(1,-1); 
     glMultiTexCoord2i(GL_TEXTURE0,1,1); 
     glVertex2i(1,1); 
     glMultiTexCoord2i(GL_TEXTURE0,0,1); 
     glVertex2i(-1,1); 
    glEnd(); 
m_AmbientShader->End(); 

const DirectionalLight& dl = scene.GetDirectionalLight(); 

glDrawBuffers(1, draw_buffers); 
m_DirectionalLightShader->Begin(); 
m_DirectionalLightShader->SetUniformInt1("Diffuse",m_DiffuseTexture->m_TextureUnit); 
m_DirectionalLightShader->SetUniformInt1("Position",m_PositionTexture->m_TextureUnit); 
m_DirectionalLightShader->SetUniformInt1("Normal",m_NormalTexture->m_TextureUnit); 
m_DirectionalLightShader->SetUniformFloat3("LightDir",dl.GetDirection()); 
m_DirectionalLightShader->SetUniformFloat3("LightAmb",dl.GetAmb()); 
m_DirectionalLightShader->SetUniformFloat3("LightDiff",dl.GetDiff()); 
m_DirectionalLightShader->SetUniformFloat3("LightSpec",dl.GetSpec()); 
m_DirectionalLightShader->SetUniformFloat3("LightAtt",dl.GetAtt()); 
m_DirectionalLightShader->SetUniformFloat1("LightIntensity",dl.GetIntensity()); 
    // Draw full screen quad 
    glBegin(GL_QUADS); 
     glMultiTexCoord2i(GL_TEXTURE0,0,0); 
     glVertex2i(-1,-1); 
     glMultiTexCoord2i(GL_TEXTURE0,1,0); 
     glVertex2i(1,-1); 
     glMultiTexCoord2i(GL_TEXTURE0,1,1); 
     glVertex2i(1,1); 
     glMultiTexCoord2i(GL_TEXTURE0,0,1); 
     glVertex2i(-1,1); 
    glEnd(); 
m_DirectionalLightShader->End(); 

Bitte entschuldigen Sie mich, wenn mein Mathe ist falsch, ich habe mit den Shadern Herumspielen zu versuchen, und jede Art von Ausgabe zu erhalten, aber hier sind die Shader-Quelldateien;

< - directional_light.vert ->

varying out vec2 ScreenPos; 

varying out vec3 VSLightDir; 

uniform vec3 LightDir; 
uniform vec3 LightAmb; 
uniform vec3 LightDiff; 
uniform vec3 LightSpec; 
uniform float LightIntensity; 

void main() 
{ 
    gl_Position = gl_Vertex; 
    ScreenPos = gl_MultiTexCoord0.st; 
    VSLightDir = normalize((gl_ModelViewMatrix * vec4(LightDir,0.0)).xyz); 
} 

< - directional_light.frag ->

// Gbuffer textures 
uniform sampler2D Diffuse; 
uniform sampler2D Position; 
uniform sampler2D Normal; 

in vec2 ScreenPos; 
uniform vec3 LightDir; 
uniform vec3 LightAmb; 
uniform vec3 LightDiff; 
uniform vec3 LightSpec; 
uniform float LightIntensity; 

in vec3 VSLightDir; 
out vec4 OutColour; 

void main() 
{ 
    // Sample from the GBuffer 
    vec4 Diffuse = texture2D(Diffuse, ScreenPos); 
    vec4 VSPos = texture2D(Position, ScreenPos); 
    vec4 MRT2 = texture2D(Normal, ScreenPos); 
    vec3 VSNormal = normalize(MRT2.xyz); 
    float Shininess = MRT2.w; 

    float LDotN = dot(VSNormal, VSLightDir); 

    vec3 View = -normalize(VSPos.xyz); 

    // Compute ambient contribution 
    vec3 ambient = LightIntensity * LightAmb * Diffuse.xyz; 

    // Compute diffuse contribution 
    vec3 diffuse = LightIntensity * LightDiff * Diffuse.xyz * max(0.0, LDotN); 

    // Compute specular contribution 
    vec3 HalfWay = normalize(LightDir + View); 
    vec3 specular = (LDotN <= 0.0) 
       ? vec3(0.0) 
       : LightIntensity * LightSpec * Diffuse.xyz * pow(max(0.0, dot(VSNormal,HalfWay)), Shininess); 

    OutColour = vec4(ambient + diffuse + specular, Diffuse.a); 
    //OutColour = vec4(0.0,0.0,1.0,1.0); //Debug line 
} 

< - ambient.vert ->

varying out vec2 ScreenPos; 

void main() 
{ 
    gl_Position = gl_Vertex; 

    // Used for the position to sample from GBuffer 
    ScreenPos = gl_MultiTexCoord0.st; 
} 

< - ambient.frag ->

// Gbuffer textures 
uniform sampler2D Diffuse; 

in vec2 ScreenPos; 

out vec4 OutColour; 

void main() 
{ 
    OutColour = texture2D(Diffuse, ScreenPos); 
    //OutColour = vec4(0.0,0.0,1.0,1.0); 
} 

Antwort

3

Haben Sie den Tiefen-Test aktiviert? Ich sehe, dass du den Tiefenpuffer löschst, also vermute ich vielleicht, aber du zeichnest die zweite Textur genau so tief wie die erste. Mit dem glDepthFunc Standard von GL_LESS würde dies dazu führen, dass die zweite Auslosung vollständig zurückgewiesen wird.

Oder sonst wie möchten Sie die beiden Ziehungen kombiniert werden? Sollte es etwas Mischen geben?

+0

Vielen Dank für die Antwort, nur deaktiviert Tiefenprüfung und es funktioniert definitiv.Ich versuche, sie als Lichtbeiträge zu mischen, also einfach bis zur Sättigung hinzuzufügen. Wird glBlendFunc (GL_ONE, GL_ONE) dies erreichen? Ich habe eine feste Funktion alternative Pipeline, um zu testen, ob ich die gleichen Ergebnisse erziele, aber sie sind etwas anders. –

+0

@RDay: Ja, das blendfunc sollte tun, was Sie wollen. Vergiss nicht, glEnable (GL_BLEND) – Tim

+0

Super, danke nochmal! –