OpenGL 3.3延迟着色不起作用

时间:2014-04-10 09:56:47

标签: c++ opengl glsl

我在this教程之后设置了一个带延迟着色的OpenGL环境,但我无法在最终缓冲区上创建第二个着色器输出。

我可以看到第一个着色器(不使用灯光的那个)正常工作,因为使用gDEBugger我可以看到输出缓冲区是正确的,但第二个着色器实际上无法显示任何内容。我还试图让第二个着色器为所有场景输出一种颜色,只是为了看它是否显示某些东西,机器人什么都看不见(屏幕应该是完全红色但不是)。

第一个着色器(我用来为GBuffer创建缓冲区的那个)正在工作,所以我没有添加它的代码或我如何创建和实现我的GBuffer,但如果你需要我会添加它们,只是告诉我。

我认为问题是当我告诉OpenGL在FrameBuffer 0(我的视频)上输出时。

这就是我将OpenGL写入FrameBuffer 0的方式:

glEnable(GL_BLEND);
m_MotoreGrafico->glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_ONE, GL_ONE);

// Abilito la scrittura sul buffer finale
m_MotoreGrafico->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);

m_gBuffer.BindForReading();
glClear(GL_COLOR_BUFFER_BIT);

// Imposto le matrici dello shader
SetUpOGLProjectionViewMatrix(1);

// Passo le texture del GBuffer allo shader
pActiveShader->setUniform1i(_T("gPositionMap"), m_gBuffer.GetPositionTexture());
pActiveShader->setUniform1i(_T("gColorMap"), m_gBuffer.GetDiffuseTexture());
pActiveShader->setUniform1i(_T("gNormalMap"), m_gBuffer.GetNormalTexture());

// Passo variabili necessarie allo shader
float dimensioneFinestra[2], posizioneCamera[3];

dimensioneFinestra[0] = m_nLarghezzaFinestra;
dimensioneFinestra[1] = m_nAltezzaFinestra;

m_MotoreGrafico->GetActiveCameraPosition(posizioneCamera);

pActiveShader->setUniform2f(_T("gScreenSize"), dimensioneFinestra);
pActiveShader->setUniform3f(_T("gCameraPos"), posizioneCamera);
pActiveShader->setUniform1i(_T("gUsaLuci"), 0);

// Disegno le luci
float coloreLuce[3], posizioneLuce[3], direzioneLuce[3], vUpLuce[3], vRightLuce[3], intensita;

for(int i = 0; i < GetDocument()->m_RTL.GetNLights(); i++)
{
    CRTLuce* pRTLuce = GetDocument()->m_RTL.GetRTLightAt(i);

            ...

    m_MotoreGrafico->glBindVertexArray(pRTLuce->GetRTLuce()->GetVBO()->getVBAIndex());
    glDrawArrays(GL_TRIANGLES, 0, pRTLuce->GetRTLuce()->GetNVertPerShader());
}

函数m_gBuffer.BindForReading()是这样的(我觉得它对我的问题无关紧要):

for (unsigned int i = 0 ; i < ARRAY_SIZE_IN_ELEMENTS(m_textures); i++) 
{
    m_pMotoreGrafico->glActiveTexture(GL_TEXTURE0 + i);
    glBindTexture(GL_TEXTURE_2D, m_textures[GBUFFER_TEXTURE_TYPE_POSITION + i]);
}

到目前为止,我的GBuffer正在工作(它会创建纹理),我的第一个着色器也在工作(它正在绘制我的GBuffer的纹理)。 问题是我无法重置OpenGL来绘制我的视频。

前4个纹理是使用第一遍着色器创建的纹理。

这是我的后台缓冲区(在第二遍着色器之后)

这是我的前缓冲区(在第二遍着色器之后)

这是我的第二遍片段着色器代码(它只输出红色)

out vec4 outputColor; 

void main()
{
    outputColor = vec4(1.0, 0.0, 0.0, 1.0);
}

有没有人知道我做错了什么?


第二遍顶点着色器代码:

#version 330

uniform struct Matrici
{
    mat4 projectionMatrix;
    mat4 modelMatrix;
    mat4 viewMatrix;
} matrices;

layout (location = 0) in vec3 inPosition;

void main()
{
    vec4 vEyeSpacePosVertex = matrices.viewMatrix * matrices.modelMatrix * vec4(inPosition, 1.0);
    gl_Position = matrices.projectionMatrix * vEyeSpacePosVertex;
}

第二遍片段着色器代码:

#version 330

uniform struct MDLight
{
    vec3 vColor;
    vec3 vPosition;
    vec3 vDirection;  

    float fAmbientIntensity;
    float fStrength;

    int bOn;

    float fConeCosine;

    float fAltezza;
    float fLarghezza;

    vec3 vUp;
    vec3 vRight;
} gLuce;

uniform float gSpecularIntensity;
uniform float gSpecularPower;

uniform sampler2D gPositionMap;
uniform sampler2D gColorMap;
uniform sampler2D gNormalMap;
uniform vec3 gCameraPos;

uniform vec2 gScreenSize;
uniform int gLightType;

uniform int gUsaLuci;

vec2 CalcTexCoord()
{
    return gl_FragCoord.xy / gScreenSize;
}

out vec4 outputColor; 

void main()
{
    vec2 TexCoord = CalcTexCoord();
    vec4 Color = texture(gColorMap, TexCoord);

    outputColor = vec4(1.0, 0.0, 0.0, 1.0);
}

0 个答案:

没有答案