1. 渲染平台差异
考虑到Unity 其极强的跨平台性,大多时候Unity为我们隐藏实现了很多细节,
但是有时候还是需要我们自己处理他们。
因为OpenGL 和DirectX 的屏幕空间坐标的差异。在水平方向上,两者的数值变化方向是相同的,但是在竖直方向上,两者是相反的。在OpenGL 中,原点(0,0)对应了屏幕的左下角,而在DirectX 中,原点(0,0)对应了屏幕的左上角。
需要注意的是,我们不仅可以吧渲染结果输出到屏幕上,还可以输出到不同的渲染目标中。这时,我们需要使用渲染纹理来保存这些渲染结果。
大多情况下,这样的差异并不会对我们造成任何影响,但当我们需要使用渲染纹理技术,把屏幕图像渲染到一张渲染纹理中时,如果不采取任何措施的话,就会出现纹理翻转的情况。好在Unity在背后为我们处理了这种翻转问题——当在DirectX平台上使用渲染到纹理技术时,Unity会为我们翻转屏幕图像纹理,以便在不同平台上达到一致。
但在一种特殊情况下,Unity是不会为我们进行翻转操作,这种请求就是我们开启了抗锯齿,并在此时使用了渲染到纹理技术。这种情况下,Unity 首先渲染得到的图像,再由硬件进行抗锯齿后,得到一张渲染纹理来供我们进行后续处理。此时,在DirectX 平台规定的。如果我们的屏幕特效只需要处理一张渲染图像,我们仍然不需要在意纹理的旋转问题,这是因为在我们调用Graphics.Blit函数时,Unity 已经为我们对屏幕图像的采样坐标进行了处理,我们只需要按照正常的采样过长处理平面图像即可。但如果我们需要同时处理多张渲染图像(前提是开启抗锯齿),例如需要同事处理屏幕图像和法线纹理,这些图像在竖直方向的朝向就可能是不同的(只有在DirectX这样的平台上才有这样的问题)。这种时候,我们需要自己在顶点着色器中翻转某些渲染纹理的纵坐标,使其符合DirectX平台的规则。
//开启 抗锯齿 ,且同时处理多张渲染图像时,DX平台需要翻转