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;
- Geben Sie die gleiche Farbe an jedem Fragment im Umgebungsdurchlauf aus, um sicherzustellen, dass es überhaupt ausgegeben wird. (Werke)
- Ausgabe der gleichen Farbe an jedem Fragment im gerichteten Lichtdurchgang. (Immer noch nichts)
- 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.
- 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);
}
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. –
@RDay: Ja, das blendfunc sollte tun, was Sie wollen. Vergiss nicht, glEnable (GL_BLEND) – Tim
Super, danke nochmal! –