多通效果的好例子吗?


9

在XNA(和一般AFAIK中为Direct3D)中,您可能没有创建单独的顶点和片段着色器,而是将许多相关的着色器捆绑到“效果”中。当您开始使用效果时,请选择“技术”(或遍历所有技术),然后每个“技术”都有许多“通过”。您遍历每遍,选择相关的顶点和片段着色器,然后绘制几何图形。

我很好奇的是,您需要多次通过吗?我知道在3d的早期,您只有一个纹理单位,然后只有2个纹理单位,但是如果您还想进行环境映射,那么通常仍然不够用。但是在现代设备上,即使在移动类中,您也可以在单个着色器中采样8个或更多纹理,并执行所需的任意多个光照计算。

这里经验丰富的人能否提供一些仍需要多遍渲染的实际示例,或者这只是XNA / Direct3d的过度设计?

Answers:


5

任何时候在一组捕获的缓冲区上进行后期处理效果时,都是使用多遍效果的合理时间,即卡通轮廓,运动模糊,SSAO,光晕。这个想法是,第一遍是将所有内容渲染到适当的缓冲区的位置,而每个后续遍将处理每个后处理效果。

就像Ranieri在XNACC示例中提到的那样,他们正在使用多次传递来渲染大量灯光。尽管在该示例中,他们正在执行相同的遍操作,但每个光源只执行一次。

请记住,Shader Model 2及其之前的版本无法处理每个着色器中与Shader Model 3或4一样多的指令,这是将效果分成多个遍的另一个原因-支持较旧的硬件。


您能否举一个示例,其中遍历EffectPasses的XNA Effect对象具有一次通过而不是使用不同效果的原因,为什么?
杰森·古玛

4

正如其他答复中指出的那样,如其他答复中所建议的那样,仍然仍然使用多遍渲染(使用不同的着色器/参数多次绘制单个网格),主要用于照明和特殊效果。

D3DX效果通道可以用于这种情况。但是也可以用多个着色器/效果来实现。

通过的最初目的是帮助在低端(pre-shader-2.0)硬件上实现复杂的着色器,其中每遍对纹理阶段和着色器指令数量的限制非常有限。

在多通道照明的示例中,通过使用通道而不是开关效果是否可以获得显着的性能提升?


3

除了每个人都提到的照明之外,此功能的另一个主要用途是 模糊。水平和垂直在单独的通道中完成(因此,要获得9x9的模糊,每个输出像素只需采样18个像素,而不是81个像素)。用于绽放/ HDR,景深,辉光等


可能,但是大多数我认为模糊实现将对水平和垂直遍历使用相同的着色器-只是传入采样偏移量(作为着色器常数或每个顶点数据)?
bluescrn

1
@bluescrn-Bloom通常被认为是一种四遍效果:一种用于提取明亮区域并缩小比例,一种用于水平模糊,一种用于垂直模糊,一种用于将模糊图像与原始图像合并/放大。虽然可以使用着色器参数来控制这些参数,但需要分支以区分除两次模糊处理之外的所有处理
Robert Fraser 2010年


1

正如Ranieri所说,您可以对多个光源使用多次通过,例如,对于一种材料,您可能具有“环境”通过,每个点光源进行一次附加通过,每个聚光灯进行另一次通过,然后进行贴花遍历以在漫反射中相乘纹理(我过去使用过这样的设置,这是处理我所看到的照明着色器而不涉及延迟着色的最灵活方式)。

此外,我相信大多数毛皮着色器会使用多次通过。


0

可以使用多次通过来创建用于创建阴影的阴影贴图。请注意,如果视频卡支持与通过次数相同数量的纹理单位,则可以在一次通过中完成一些多遍效果。因此,如果您没有足够的纹理单位,则必须使用多次通过。在一个固定的硬件平台(如游戏机)上,您可以仅使用多纹理进行编码,因为您知道纹理单元的数量。但是对于PC,有无数的硬件配置。如果您希望将影响范围扩大到消费者,则可能需要将一些较复杂的效果分解为多个遍,以便具有较低等级硬件的用户(即GPU上没有太多纹理单元)仍然可以见效果。简而言之,阴影贴图是通过首先从光的角度一次创建场景的阴影贴图来创建的。然后将阴影贴图纹理与场景的其他纹理混合到场景中。

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.