延期贴花正常问题


11

我一直在研究延迟贴花系统。到目前为止,我已经完成了投影部分,这意味着我可以单击场景中的某些东西,它将正确地将贴图投影到对象的表面上。

我希望添加到此系统中的其他几项内容:普通裁剪和普通映射贴花。正常剪裁是当我丢弃延伸锐角的片段时。在这里看到。解决此问题的一种方法是,丢弃G缓冲区中的法线与贴花法线之间存在较大差异的片段。这将需要读取G缓冲区的正常纹理。

为了进行贴图法线贴图,我需要将贴图的法线(来自法线贴图)与G缓冲区的法线混合。需要写入G缓冲区的常规纹理。

我希望很明显,为了支持这两个功能,我需要在同一着色器通道中读取和写入普通纹理。可悲的是,这是未定义的行为,所以我想知道是否还有其他方法可以实现这些功能。

Answers:


1

您使用哪种渲染系统?以下信息对所有渲染系统均应有效,但是在DX11或更高版本的OpenGL中,使用UAV可能是更好的解决方案。

-

您必须在每次通过之前复制普通缓冲区。只要您知道贴花不会修改相同的屏幕空间片段,就不必更新副本。

您还可以将所有贴花渲染到单独的缓冲区中,并且仅使用一个普通缓冲区拷贝将一次混合传递到普通缓冲区中。随着您拥有的贴花数量,这将更好地扩展。

只要您不编写普通缓冲区,例如只执行普通剪辑,就可以对其进行采样,但是您可以对原始普通缓冲区进行采样,但不能将其绑定为渲染目标。

在DX9中,我发现只要您只使用最近的点过滤并且从未读取与当前写入的像素不同的像素,就可以对相同的纹理进行读取和写入,从而获得预期的输出!由于这是未定义的行为,因此可能是驱动程序和图形卡没有这种行为。DX10将通过取消绑定当前绑定为渲染目标的纹理来阻止您执行此操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.