unity的优点之一是强大的跨平台性,本篇文章给出了一些常见的因为平台不同而造成的差异。

1.渲染纹理的坐标差异

之前提到过OPenGL和DirectX的屏幕空间坐标的差异。在水平方向上,两者的数值变化方向是相同的,但在竖直方向上,两者是相反的。在OpenGL中,(0,0)点对应了屏幕的左下角,而在DirectX中,(0,0)点对应了左上角。

需要注意的是,我们不仅可以把渲染结果输出到屏幕上,还可以输出到不同的渲染目标中,这时我们需要使用渲染纹理(Render Texture)来保存这些渲染结果。

大多数情况下,这样的差异并不会造成什么影响,但当需要使用渲染到纹理技术,把屏幕图像渲染到一张纹理中时,如果不采取任何措施,就会出现纹理翻转的情况。幸运的是unity在背后为我们处理了这种翻转问题——当在DirectX平台上使用渲染到纹理技术时,unity会为我们翻转屏幕图像纹理,以便在不同平台达到一致性。

在一种特殊的情况下unity不会为我们进行这个翻转操作,就是开启了抗锯齿(在Edit->Project Settings->Quality->Anti Aliasing中开启)并在此时使用了渲染到纹理技术。在这种情况下,unity首先渲染得到屏幕图像,再由硬件进行抗锯齿处理后,得到一张渲染纹理供我们进行后续处理。此时得到的输入屏幕图像并不会被unity翻转,也就是说此时对屏幕图像的采样坐标是需要符合DirectX平台规定的。如果我们的屏幕特效只需要处理一张渲染图像,我们仍然不需要在意纹理的翻转问题,这是因为我们调用Graphics.Blit函数时,unity已经为我们对屏幕图像的采样坐标进行了处理,我们只需要按正常的采样过程处理屏幕图像即可。但如果同时需要处理多张渲染图像(前提是开启了抗锯齿),例如需要同时处理屏幕图像和法线纹理,这些图像的竖直方向的朝向可能是不同的(只有在DirectX这样的平台上才有这样的问题)。这种时候,我们就需要在顶点着色器中翻转某些渲染纹理(例如深度纹理或其他由脚本传递过来的纹理)的纵坐标,使之都符合DirectX平台的规则。例如:

 其中UNITY_UV_STARTS_AT_TOP用于判断当前平台是否是DirectX类型的平台,而当在这样的平台下开启了抗锯齿后,主纹理的纹素大小在竖直方向上会变成负值,以方便我们对主纹理进行正常的采样。因此我们可以通过判断_MainTex_TexelSize是否小于0来检验是否开启了抗锯齿。如果是,我们就需要对除主纹理外的其他纹理的采样坐标进行竖直方向上的翻转。

2.shader的语法差异

我们在Windows平台下编译某些在Mac平台下工作良好的shader时,可能会看到类似下面的报错信息:

上面的报错信息都是因为DirectX9/11对shader的语义更加严格造成的。例如造成第一个报错信息的原因是,shader中可能存在下面这样的代码:

float4 v=float4(0.0);

在OpenGL平台上,上面的代码是合法的,他将得到一个4个分量都是0.0的float4类型的变量,但在DirectX 11平台式,我们必须提供和变量类型相匹配的参数数目。

面对第二个报错信息,往往出现在表面着色器中的顶点函数有一个使用了out修饰符的参数。如果出现这样的报错信息,可能因为在顶点函数中没有对这个参数的所有成员变量都进行初始化。应该使用类似下面的代码对这些参数进行初始化:

除了上述两点语义不同外,DirectX 9/11也不支持在顶点着色器使用tex2D函数。tex2D是一个对纹理进行采样的函数,之所以不支持,因为顶点着色器阶段shader无法得到uv偏导,而tex2D函数需要这样的偏导信息(和纹理采样时使用的数学运算有关)。如果我们的确需要在顶点着色器中访问纹理,需要使用tex2Dlod函数来代替,如:

tex2Dlod(tex,float4(uv,0,0));

而且还需要添加#pragma target 3.0,因为tex2Dlod是shader model 3.0中的特性。

3.shader的语义差异

前面说过一些语义在某些平台下是等价的,例如SV_POSITION和POSITION。但在另一些平台上,这些语义是不等价的。为了让shader能够在所有平台正常工作,应该尽可能使用下面的语义描述shader的输入输出变量。

使用SV_POSITION描述顶点着色器输出的顶点位置。一些shader使用了POSITION语义,而这些shader无法在索尼PS4平台上或使用了细分着色器的情况下正常工作。

使用SV_Target来描述片元着色器的输出颜色,一些shader使用了COLOR或者COLOR0语义,同样这些shader无法在索尼PS4正常工作。

4.平台上的差异

上面只给出一些最常见的平台差异造成的问题,如果发现shader在平台A下工作良好,在平台B下出现了问题,可以去unity官方文档找资料(http://docs.unity3d.com/Manual/SL-PlatformDifferences.html)中寻找更多资料。

(八)unity shader基础之——————渲染平台差异问题相关推荐

  1. Unity Shader入门精要——第3章 Unity Shader基础

    Unity Shader入门精要读书笔记系列 第1章 欢迎来到Shader的世界 第2章 渲染流水线 第3章 Unity Shader基础 文章目录 Unity Shader入门精要读书笔记系列 前言 ...

  2. 《 Unity Shader 入门精要》 第3章 Unity Shader 基础

    第3章 Unity Shader 基础 3.1 Unity Shader 概述 材质与 Unity Shader 在 Unity 中我们通常需要将材质(Material) 和 Unity Shader ...

  3. Unity Shader入门精要第3 章 Unity Shader 基础

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.Unity Shader 概述 二.使用步骤 1.3.1.2 Unity 中的材质 2.Unity 中的Shader 3.Unity ...

  4. (二)unity shader基础之——————shader一些专业术语的解释(OpenGL/DirectX、HLSL/GLSL/Cg、Draw Call、固定管线渲染等)

    一.什么是OpenGL/DirectX 我们直接访问GPU是一件非常麻烦的事情,可能需要各自寄存器.显存打交道而图像编程接口在这些硬件的基础上实现了一层抽象. OpenGL和DirectX就是这些图像 ...

  5. Unity Shader 基础教程

    Unity-Shader-基础教程 在Github上看到一篇关于Unity-Shader的教程,感觉还不错,作者写的很好,很适合Unity-Shader的基础入门,我在这里翻译一下,分享给大家,英文水 ...

  6. 学习Shader Unity Shader 基础

    1.如何充分利用 Unity Shader 来为我们的游戏增光添彩? 材质和 Unity Shader: 在Unity中,我们需要配合使用材质(Material)和 Unity Shader 才能达到 ...

  7. Unity Shader基础

    ShaderLab 在unity中,所有的unity shader都是使用shaderlab来编写的.Shaderlab是unity提供的编写unity shader的一种说明性的语言. Unity ...

  8. Unity | Shader基础知识(什么是shader)

    一.什么是Shader? Shader的中文名叫着色器. 二.什么是着色器? 着色器的作用:这个世界是3D的,包括在Unity的场景中,我们建的球球,方块块之类的,都是3D的,但是,屏幕是2D的,把3 ...

  9. Unity Shader 实现卡通渲染效果

    本文参考博客Unity Toon Shader 卡通着色器(一):卡通着色 这是我实现的最后效果 我们先一步一步来 最开始我们实现一个只有漫反射效果的Shader,效果和代码如下 Shader &qu ...

最新文章

  1. AI看电影看哭了...MIT科学家正在教AI感受电影中的喜怒哀乐
  2. 国民认证科技有限公司助力构建我国可信网络空间
  3. androidwakelock_Android音频播放时wakelock的实现
  4. CryEngine最新版发布,支持Vulkan API
  5. 关于AB包的释放与 Resources.UnloadUnusedAssets的关系
  6. flex实现水平居中和两栏布局
  7. ARKit:增强现实技术在美团到餐业务的实践
  8. php mysql while循环,PHP_MySQL教程-第二天while循环与数据库操作第2/2页
  9. 提高tomcat的并发能力
  10. 解决df -h卡死问题
  11. 基础知识—数据类型-第一个C++程序
  12. 神舟刷蓝天w650dbios_在DOS中给神舟蓝天刷EC和BIOS的通用方法【AMI】
  13. mysql查询结果输出到文件
  14. 【霸指拓客】抖音自动引流脚本源码终端开发
  15. svn里 is already locked
  16. A071_管理员登录
  17. 苹果新款MacBook Pro可能会有SD卡插槽
  18. ps基础入门2-图层样式
  19. 信号地与电源地、模拟地与信号地
  20. python socks代理_如何让任意python程序使用socks代理

热门文章

  1. 宿舍服务器延迟高解决方法(校园网)
  2. conda清华源即将关闭,用中科大源吧!设置方法
  3. 浏览器内核-Webkit
  4. (附源码)计算机毕业设计SSM智慧校园系统
  5. 2022-2027年中国减肥药行业市场全景评估及发展战略规划报告
  6. 电子礼品卡腐败必须重视
  7. tomcat 跑起项目报 JMX 连接器服务器通信错误:
  8. java 画笔 粗细_java中如何设置线条的粗细例题?
  9. 2022年12月10日(星期六):骑行樱花谷
  10. 2021.09.24—皮皮与帅帅的第二篇情话