帧缓冲纹理出现白色(片段着色器不影响它)

Posted

技术标签:

【中文标题】帧缓冲纹理出现白色(片段着色器不影响它)【英文标题】:Framebuffer texture coming out white (fragment shader doesn't affect it) 【发布时间】:2018-09-12 02:56:25 【问题描述】:

所以我有一个 fbo 并尝试从光源角度输出深度纹理。不幸的是,即使我在片段着色器中硬编码为黑色,深度纹理也会变成纯白色。

这是我的帧缓冲区初始化

//Render frame to a texture
m_FrameBuffer = 0;
glGenFramebuffers(1, &m_FrameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, m_FrameBuffer); // once frame buffer is bound, must draw to it or black screen
glEnable(GL_TEXTURE_2D);

glGenTextures(1, &m_depthTexture);
glBindTexture(GL_TEXTURE_2D, m_depthTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, 1024, 1024, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);

glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_depthTexture, 0);
    glDrawBuffer(GL_NONE);
//Always check that our framebuffer is ok
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
    printf("frame buffer binding error");

glBindTexture(GL_TEXTURE_2D, 0);

这是我对帧缓冲区的渲染

glBindFramebuffer(GL_FRAMEBUFFER, m_FrameBuffer);
glViewport(0, 0, 1024, 1024);

glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glBindVertexArray(m_VAO);

glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

glDrawArrays(GL_TRIANGLES, 0, vertices.size());
glDisableVertexAttribArray(0);
glBindVertexArray(0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

这是我的片段着色器

#version 330 core
// Ouput data
layout(location = 0) out float fragmentdepth;
void main()

//fragmentdepth = gl_FragCoord.z;
fragmentdepth = 0;

这是我的主循环

while (!window.closed())

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    glDepthFunc(GL_LESS);
    window.clear();

    CameraControls();
    depth.enable();

    //depthMVP = depthProjectionMatrix * depthViewMatrix * depthModelMatrix;
    depth.setUniformMat4("projection", projection);
    depth.setUniformMat4("view", camera);
    depth.setUniformMat4("model", shape1->modelMatrix);     

    shape1->RenderToTexture();
    depth.disable();
    window.clear();
    basic.enable();
    basic.setUniformMat4("proj", projection);
    //basic.setUniform3f("light_Pos", lightPos);
    basic.setUniformMat4("view", camera);
    basic.setUniformMat4("model", shape1->modelMatrix);
    basic.setUniformMat4("DepthBiasMVP", biasMatrix); 

    //NEED TO CHANGE THIS TO BIAS MATRIX X DEPTHMVP
    //MVP = projection * camera * shape1->modelMatrix;
    //basic.setUniformMat4("MVP", MVP);
    shape1->Render(basic);
    basic.disable();
    window.update();

我正在关注这个教程http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/

【问题讨论】:

按照-khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/… 上的规范,我最好的猜测是你的两行,glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);导致渲染到纹理的结果为 0 或 1 很难调试opengl代码,因为它可能出错的地方很多。在opengl中设置状态机的每一步都必须是正确的。您可能会错误地渲染帧缓冲区,以错误的方式面对相机,由于透视投影的指数性质而具有无法区分的深度值,在程序的其他部分中错误地设置渲染状态,渲染对象太小......清单还在继续,但你明白我的意思。 【参考方案1】:

在查看我未解决的旧问题后回答我自己的问题。如果有人想知道,我的问题是我将两个教程融合为一个,其中一个具有不同的截锥体的近距和远距值。帧缓冲区是黑色的,因为对象离相机太远了。

【讨论】:

以上是关于帧缓冲纹理出现白色(片段着色器不影响它)的主要内容,如果未能解决你的问题,请参考以下文章

在着色器中使用 glTexture

从片段着色器中的地形高程数据计算法线

OpenGL 片段着色器未写入 fbo 颜色缓冲区

为啥我的 Ray March 片段着色器反射纹理查找会减慢我的帧速率?

帧缓冲区和在opengl中使用着色器

片段着色器中未使用纹理数据 - OpenGL