3

问题说明

我目前正在为延迟渲染器实现点光源,并且无法确定仅在灯光边界附近明显的重像素化/三角剖分来自何处。

问题似乎是由于某处的精度损失引起的,但我一直无法找到确切的来源。法线是一种明显的可能性,但我有一个同学正在使用directx,并且以类似的方式处理他的法线,没有任何问题。

距离我们游戏单位约 2 米(64 单位/米):

deferred_full_scene

几厘米远。请注意,当我接近它时,“像素化”不会改变世界的大小。但是,如果我改变相机的方向,它似乎会游泳:

deferred_closeup

与我的前向渲染器的特写进行比较,它演示了使用 RGBA8 渲染目标所期望的球形条纹(每种颜色只有 0-255 个可能的值)。请注意,在我的延迟图片中,后墙显示出正常的球形条带:

closeup_forward

光量在此处显示为绿色线框:

light_volume_and_scene

可以看出,除非您靠近表面(在我们的游戏单位中大约一米),否则效果是不可见的。


位置重建

首先,我应该提到我正在使用一个球形网格,我只使用它来渲染屏幕中光线重叠的部分。如果深度大于或等于此处建议的深度缓冲区,我只渲染背面。

为了重建片段的相机空间位置,我从光体积上的相机空间片段中获取矢量,对其进行归一化,并按我的 gbuffer 中的线性深度对其进行缩放。这是此处讨论的方法(使用线性深度)此处(球形光量)的混合。

位置重建


几何缓冲区

我的 gBuffer 设置是:

enum render_targets { e_dist_32f = 0, e_diffuse_rgb8, e_norm_xyz8_specpow_a8, e_light_rgb8_specintes_a8, num_rt };
//...
GLint internal_formats[num_rt] = {  GL_R32F, GL_RGBA8, GL_RGBA8, GL_RGBA8 };
GLint formats[num_rt]          = {   GL_RED,  GL_RGBA,  GL_RGBA,  GL_RGBA };
GLint types[num_rt]            = { GL_FLOAT, GL_FLOAT, GL_FLOAT, GL_FLOAT };
for(uint i = 0; i < num_rt; ++i)
{
  glBindTexture(GL_TEXTURE_2D, _render_targets[i]);
  glTexImage2D(GL_TEXTURE_2D, 0, internal_formats[i], _width, _height, 0, formats[i], types[i], nullptr);
}
// Separate non-linear depth buffer used for depth testing
glBindTexture(GL_TEXTURE_2D, _depth_tex_id);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, _width, _height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr);

4

1 回答 1

3

正常精度

问题是我的法线没有足够的精度。每个组件 8 位,这意味着 255 个离散的可能值。检查覆盖在照明顶部的 gbuffer 中的法线显示与正常值与照明“像素”值的 1-1 对应关系。

我不确定为什么我的同学没有遇到同样的问题(他将进一步调查)。

正常精度

经过更多研究后,我发现一个术语是量化。另一个例子可以在这里看到,第 19 页有一个镜面高光。


解决方案

将我的正常渲染目标更改为RG16F后,问题得到解决。

使用此处建议的方法存储和检索法线,我得到以下结果:

无量化

我现在需要更紧凑地存储我的法线(我只有 2 个组件的空间)。如果有人发现自己处于相同的情况,这是对技术的一个很好的调查。


[编辑 1]

正如 Andon 和 GuyRT 在评论中指出的那样,16 位对于我的需要来说有点过分了。我已经按照他们的建议切换到 RGB10_A2,它给出了非常令人满意的结果,即使在圆形表面上也是如此。额外的 2 位有很大帮助(256 对 1024 离散值)。

这是它现在的样子。

在此处输入图像描述

还应注意(对于将来引用此帖子的任何人),我为 RG16F 发布的图像与我用来压缩/解压缩法线的方法存在一些不良条纹(涉及一些错误)。


[编辑 2]

在和一个同学(他用的是RGB8,没有任何不良影响)讨论了更多之后,我认为值得一提的是,我可能只是有完美的元素组合才能让它出现。我正在为其构建此渲染器的游戏是一款恐怖游戏,它将您置于漆黑的环境中,并具有类似声纳的能力。通常在一个场景中,您会有许多不同角度的灯光(我同学的环境都非常明亮 - 他们正在制作户外赛车游戏)。再加上它只出现在相对较近的非常圆形的物体上,这可能是我挑起这个的原因。这只是我的一个(受过教育的)猜测。

于 2014-03-10T08:19:22.397 回答