【问题标题】:Making position buffer for deferred rendering - noise in the generated textures为延迟渲染制作位置缓冲区 - 生成纹理中的噪声
【发布时间】:2018-12-25 12:12:56
【问题描述】:

我第一次尝试实现延迟着色,但无法生成缓冲区。我已经开始尝试只制作位置缓冲区,所以这里是相关代码:

glGenFramebuffers(1, &gBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, gBuffer);

glGenTextures(1, &gPosition);
glBindTexture(GL_TEXTURE_2D, gPosition);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, 1024, 1024, 0, GL_RGB, GL_FLOAT,
    NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gPosition, 0);
unsigned int rbo;
glGenRenderbuffers(1, &rbo);
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 1024, 1024);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
    std::cout << "ERROR::FRAMEBUFFER:: Framebuffer is not complete!" << std::endl;


glBindFramebuffer(GL_FRAMEBUFFER, 0);

帧缓冲成功完成,我们进入主循环:

glBindFramebuffer(GL_FRAMEBUFFER, gBuffer);
glActiveTexture(gPosition);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0, 0, 1024, 1024);
mat4 modelMatrix = mat4(1);
glUseProgram(gShader);
glUniformMatrix4fv(mgLoc, 1, GL_FALSE, &modelMatrix[0][0]);
glUniformMatrix4fv(pgLoc, 1, GL_FALSE, &projectionMatrix[0][0]);
glUniformMatrix4fv(vgLoc, 1, GL_FALSE, &viewMatrix[0][0]);
glBindVertexArray(objVAO);
glDrawArrays(GL_TRIANGLES, 0, objVertices.size());
glBindFramebuffer(GL_FRAMEBUFFER, 0);

这是片段着色器:

layout (location=0) out vec3 gPosition;
in vec3 vertex_world;
out vec4 FragColor;

void main()
    {

     FragColor=vec4(vertex_world,1.0);


    }

位置缓冲区看起来不错:

但是,如果您查看我的着色器,我并没有给 gPosition 赋值。似乎缓冲区只是在输出 fragColor。

这是我打算做的,但它给了我错误的结果:

layout (location=0) out vec3 gPosition;
in vec3 vertex_world;


void main()
{

     gPosition=vertex_world;


}` 

它确实向位置缓冲区传递了一些东西,但你会发现它很奇怪:

可能出了什么问题?

编辑/解决

事实证明,我必须在片段着色器中将 gPosition 定义为 vec4。它现在完美运行。所以新的问题是为什么它现在起作用了?

【问题讨论】:

  • 附带说明:将位置存储在 g 缓冲区中完全浪费了内存带宽。所需要的只是一个深度缓冲区(无论如何您都想使用它),您可以稍后根据深度和 2D 屏幕空间位置重建任何相关空间中的 3D 位置。

标签: opengl framebuffer deferred-rendering deferred-shading


【解决方案1】:

glActiveTexture 不采用纹理名称,而是选择活动纹理 unit (GL_TEXTURE0 + n) – 是的,名称具有误导性。

无论如何,您似乎想在渲染之前绑定位置缓冲区纹理。为什么?如果你真的这样做了,你可能会得到一个反馈循环——请参阅https://www.khronos.org/opengl/wiki/Framebuffer_Object#Feedback_Loops。只要您不从中采样就可以了,但是仅仅存在反馈循环的可能性可能会使您陷入较慢的代码路径。所以尽量不要那样做。您已经将纹理作为附件绑定到 FBO,这就足够了。

就渲染实际位置缓冲区而言:首先为什么要这样做?只需使用深度缓冲区纹理(而不是渲染缓冲区)并根据单个深度值重建位置并取消投影。

【讨论】:

  • 您可能已经注意到我不知道自己在做什么。或者至少我第一次写这篇文章时没有。我精确地按照教程进行操作,在某些时候我开始四处移动,希望它能奏效。您的 cmets 非常有帮助。我想我找到了造成麻烦的原因,但我不明白为什么会这样。事实证明,在第二种情况下,我必须将输出定义为 vec4。你知道为什么会有这么大的不同吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多