轻量级预先处理(或延迟)管线错误

8

我和一些人正在使用XNA 4.0创建一个简单的游戏(是的,我知道它不再得到微软的支持,但这是我们导师给出的要求)。最近,我根据J. Coluna的方法编写了基于光预通渲染器。在添加了一些具有凸凹贴图和反照率贴图的网格后,它突然出现了奇怪的错误。以下是一些示例:

Renderer bug Renderer bug Renderer bug

我不知道是什么原因导致这些伪影(绿色/紫色)的出现。有时候地板上也会出现类似的黑色伪影。您有任何想法,渲染器可能出了什么问题吗?

如果我的帖子不够清晰,请让我知道,我会尝试澄清。


没有代码很难说。我猜你的漫反射贴图完全是灰色的吗?那么很可能是一个光照问题。试着关闭一些光源组件(环境光、漫反射光、高光)看看问题出在哪里。 - Nico Schertler
可见缓冲区(在左上角)分别是:普通、深度和光照缓冲区。我回家后会尝试调整光照组件。谢谢你的建议 :) - Shot
关闭灯光组件没有帮助。仍然出现相同的伪影。我注意到这些伪影是在我的一个同事更换相机后开始出现的,但他只是调整了它的位置,没有做其他任何操作... - Shot
请问您能添加像素着色器代码吗? - Nico Schertler
当然,这里有两个着色器:着色器代码。LightingLPP负责计算光照,而LPPMain负责创建G缓冲区,重建阴影和应用阴影。 - Shot
1
你的方法似乎与通常的延迟光照有些不同。不幸的是,我无法确定可能导致问题的原因(也许是阴影,也许不是)。我的建议是逐一关闭功能,直到问题消失,然后进一步调查。如果你有图形调试器(如PIX或VS 2012调试器),你可以检查颜色计算的过程。 - Nico Schertler
1个回答

2
您没有提供任何代码,因此我只能根据观察来回答您的问题。我认为这个问题与对象几何图形中的翻转法线有关。
如果您仔细观察第3张图片,您会注意到紫色伪影也出现在对象的左侧,但范围更窄。基于这一点,我提出以下理论:
您的动画师创建了该对象,但不喜欢其锐利的边缘。因此,为了消除它们,他或她旋转了边缘顶点,并将它们向内移动,重叠到形状外部。
如果我试图以某种方式进行说明,它看起来可能像这样:
原始对象:
+-------+ |=====| |=====| |=====| +-------+
调整后的对象:
------- |x===x| |=====| |x===x|   -------
其中'+'被转换为'x',表示已旋转并将顶点向形状内部移动。这可能导致法线反转,从而影响从对象反射回来的光线。
我们之所以在图像#3中看到一个狭窄的区域有伪影是因为艺术家同时旋转了所有角落。如果是这种情况,我相信,如果您旋转形状,现象将是对称的,这意味着您将再次在对象右侧看到更宽的伪影,而在左侧看到较窄的伪影。但是,如果您翻转形状(在Y轴上旋转180度),现象将随之翻转。
测试这一点的另一个选择是将一个新的简单框形状放入场景中,并检查是否消除了伪影。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接