当前位置: 首页 > 知识库问答 >
问题:

为什么OpenGL+GLSL着色器不输出任何东西?

闻人浩波
2023-03-14

总之,我的全屏着色器没有输出任何东西,

  • 在环境传递中的每个片段输出相同的颜色,以确保它是输出的。(作品)
  • 在定向光路中的每个片段输出相同的颜色。(仍然一无所获)
  • 将屏幕分辨率用于XY顶点坐标,而不是归一化坐标;
    • 这适用于环境传递,因为我可以看到结果如预期的那样变化。
    • 方向光通过时没有变化,我得到的输出也是一样的。

    这是申请代码;

    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();
    

    请原谅,如果我的数学是错误的,我一直在乱搞着色器,试图得到任何类型的输出,但这里是着色器源文件;

    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);
    }
    
    // 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
    }
    
    varying out vec2 ScreenPos;
    
    void main()
    {
        gl_Position = gl_Vertex;
    
        // Used for the position to sample from GBuffer
        ScreenPos = gl_MultiTexCoord0.st;
    }
    
    // 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);
    }
    

共有1个答案

魏松
2023-03-14

你启用深度测试了吗?我看到你正在清除深度缓冲区,所以我怀疑可能,但你绘制的第二个纹理的深度与第一个纹理完全相同。gldepthfunc默认值为gl_less,这将导致第二次抽签完全被拒绝。

否则,您希望如何将这两个平局结合起来?应该有一些勾兑吗?

 类似资料:
  • 假设我遇到这样的问题:现在我有一个帧缓冲区,一个纹理只包含一个颜色组件(例如,GL_RED)已经绑定到它。碎片着色器会是什么样子?我想答案是: ...浮出ex_color; 颜色=。。。; 我的问题来了:着色器会自动检测帧缓冲区的格式并向其写入值吗?如果片段着色器输出浮点值但帧缓冲区格式GL_RGBA怎么办? 顺便问一下,创建只有一个组件的纹理的正确方法是什么?我阅读了g-truc的示例,其示例如

  • 我希望在2D OpenGL应用程序上实现着色器。我的计划是将场景渲染到帧缓冲区对象,然后使用着色器将该帧缓冲区对象渲染到屏幕。 这是我绘制到帧缓冲区对象的场景,然后从那里绘制到屏幕。使用箭头键可以让月亮四处移动(我很自豪!) 但是,当我尝试使用着色器程序将帧缓冲区对象渲染到屏幕上时,我得到以下结果: 这是非常可悲的。这个片段着色器是我从一个教程中得到的,我相信问题一定是统一变量。 以下是片段着色器

  • OpenGL的渲染管线分为几个步骤。一个简单的OpenGL渲染管线将包含一个顶点着色器和一个片段着色器。 顶点着色器接收顶点数据,并且在程序最后赋值给gl_Position。然后,顶点将会被裁剪,转换和栅格化后作为像素输出。 片段(像素)进入片段着色器,进一步对片段操作并将结果的颜色赋值给gl_FragColor。顶点着色器调用多边形每个角的点(顶点=3D中的点),负责这些点的3D处理。片段(片度

  • 我正在做一个游戏,我现在正在写一个着色器来反射光从一个物体,我不断得到错误消息: 任何帮助都将不胜感激。

  • 下面代码中的两个字符串 vertexShaderSource和fragShaderSource 是 WebGL 的着色器代码,着色器代码通过着色器语言GLSL ES编写,对于前端工程来说学习 WebGL,还需要学习一门新的语言着色器语言GLSL ES。关于着色器语言的学习,可以跟着课程一边写案例,一边去学习,这样更容易理解。 着色器语言用于计算机图形编程,运行在GPU中,平时所说的大多数语言编写的