0

(这实际上是来自 gamedev 的交叉帖子但我认为你们也可能会有所帮助!)

编辑:我详细说明了叠加的含义。经过一番睡眠后,我发现我对 glGenerateMipmaps 的调用毫无用处,因为我使用 null 作为指向 glTexImage2D 的指针。

在 OpenGL 3.3、Ubuntu 11.04、nVidia 驱动程序 280.13、GeForce GT240 上。

我正在制作一个延迟着色器,并希望在屏幕下部的小叠加层中显示我的 G 缓冲区。在这种情况下,叠加意味着没有 z 测试,纹理屏幕对齐四边形,最后渲染。

在全窗口渲染(一次一个)G 缓冲区(FBO 纹理)时,它们会正确显示。当渲染到这些叠加层时,我得到了垃圾(看似随机的 GPU 内存作为静态干扰,但在运行之间有所不同,有时是清晰的画面)。

如果我创建一个不同的纹理,比如从文件中,它会在叠加层中显示没有垃圾,所以代码应该没问题。谁能解释为什么?我已经为 G 缓冲区中的纹理使用了 glGenerateMipmap。

我知道这可能没有足够的信息,但从这个开始。请询问任何相关信息。问题是否与 FBO 渲染和 mipmapping 有关?当然我的代码想要显示未保留/未初始化的内存,但我不知道为什么。 下面的四个纹理中有垃圾数据。


全窗口绿色图片是我当前在光照阶段的结果,分辨率为 (256*256),以节省 GPU 内存,因为 G-buffer 很厚。此外,在材质着色器(生成 G 缓冲区)中,我使用“out vec4 fragment[3]”,并且纹理具有不同的内部格式。这会是个问题吗?

PS。灯光在 (-30,0,0) 和 (30,0,0) 处,但似乎“更近”。这可能是一个精度问题吗?我使用 GL_RGBA16F 作为法线,使用 GL_RGBA32F 作为位置,使用 GL_DEPTH_COMPONENT24 作为深度,使用 GL_RGBA 作为反照率(是的,非常浪费,但我稍后会优化)。

4

1 回答 1

1

好的,我发现了问题。在任何有意义的数据进入内存之前,我就生成了 mipmap。关闭相关纹理的 mipmapping 解决了这个问题。无论如何感谢您的关注! 在此处输入图像描述

于 2011-10-29T10:46:29.993 回答