著录项信息
专利名称 | 一种基于Unity的软件线性渲染的方法 |
申请号 | CN201810436974.2 | 申请日期 | 2018-05-09 |
法律状态 | 授权 | 申报国家 | 中国 |
公开/公告日 | 2018-11-30 | 公开/公告号 | CN108921775A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06T3/00 | IPC分类号 | G;0;6;T;3;/;0;0查看分类表>
|
申请人 | 苏州蜗牛数字科技股份有限公司 | 申请人地址 | 江苏省苏州市工业园区中新大道西171号
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 苏州蜗牛数字科技股份有限公司 | 当前权利人 | 苏州蜗牛数字科技股份有限公司 |
发明人 | 陈童 |
代理机构 | 北京德崇智捷知识产权代理有限公司 | 代理人 | 暂无 |
摘要
一种基于Unity的软件线性渲染的方法,包括以下步骤(1)对线性渲染的环境进行判断;(2)如果环境为Gamma Space,则在Gamma Space环境下进行软件线性渲染;(3)如果环境为Linear Space,则在Linear Space环境下进行软件线性渲染。本发明可以在不支持硬件渲染的设备上,实现与硬件线性渲染相同的画面效果。
1.一种基于Unity的软件线性渲染的方法,包括以下步骤:
(1) 对线性渲染的环境进行判断;
(2) 如果环境为Gamma Space,则在Gamma Space环境下进行软件线性渲染;
(3) 如果环境为Linear Space,则在Linear Space环境下进行软件线性渲染;
所述步骤(2)进一步包括以下步骤:
S101:在脚本中定义开启线性渲染的宏_COLORSPACE_GAMMA;
S102:在Shader中执行tex2D()函数之后,并在将采样结果运用于计算之前,根据宏_COLORSPACE_GAMMA判断是否需要开启软件线性渲染,如果需要线性渲染,则进行一下步骤;
如果不需要线性渲染,则直接输出结果;
S103:对tex2D()函数的采样结果执行Pow(...,2.0)操作,以将采样结果的值从非线性转换到线性空间;
S104:执行tex2Dbias()和texCUBE()函数之后,对其采样结果重复S102‑S103步骤;
S105:对光照贴图、全局反射贴图和/或光照的采样结果,重复S102‑S103步骤,从非线性空间转换到线性空间;
S106:在主相机上添加继承MonoBehaviour的脚本,用于进行全屏后处理的操作;
S107:编写用于屏幕后处理的Shader,对RenderTexture中的颜色执行Pow(...,0.5)操作;
S108:在后处理脚本中,使用步骤S107中的Shader进行OnRenderImage的处理,将处理后的最终结果输出到屏幕上。
2.根据权利要求1所述的基于Unity的软件线性渲染的方法,其特征在于,在步骤S101中还包括,以#pragma multi_compile的方式定义开启线性渲染的宏_COLORSPACE_GAMMA。
3.根据权利要求1所述的基于Unity的软件线性渲染的方法,其特征在于,在步骤S106中还包括,脚本中包括对_COLORSPACE_GAMMA宏的开关。
4.根据权利要求3所述的基于Unity的软件线性渲染的方法,其特征在于,使用Shader.EnableKeyword或Shader.DisableKeyword对_COLORSPACE_GAMMA宏进行开关控制。
5.根据权利要求1所述的基于Unity的软件线性渲染的方法,其特征在于,所述步骤(3)进一步包括以下步骤:
S201:在脚本中定义开启线性渲染的宏_COLORSPACE_LINEAR;
S202:在Unity引擎的目录下,修改UnityCG.cginc和UnityStandardBRDF.cginc文件中的内容,加入对宏的判断,以判断是否需要开启软件线性渲染,如果需要线性渲染,则进行一下步骤;如果不需要线性渲染,则直接输出结果;
S203:将修改过后的UnityCG.cginc和UnityStandardBRDF.cginc文件放到Shader文件目录下,并在Shader中添加对上述两个cginc文件的引用;
S204:在主相机上添加继承MonoBehaviour的脚本,用于进行全屏后处理的操作;
S205:编写用于屏幕后处理的Shader,对RenderTexture中的颜色执行Pow(...,0.5)的操作;
S206:在后处理脚本中,使用步骤S205中的Shader进行OnRenderImage的处理,将处理后的最终结果输出到屏幕上。
6.根据权利要求1所述的基于Unity的软件线性渲染的方法,其特征在于,在步骤S201中,由以#pragma multi_compile的方式定义开启线性渲染的宏_COLORSPACE_LINEAR。
7.根据权利要求6所述的基于Unity的软件线性渲染的方法,其特征在于,在步骤S202中,对宏的判断包括:判断UNITY_COLORSPACE_GAMMA的未开启的部分,并且判断宏_COLORSPACE_LINEAR。
8.根据权利要求6所述的基于Unity的软件线性渲染的方法,其特征在于,当所述方法使用在IOS系统上时,步骤S205还包括:复制主相机,将该相机的深度缓冲和颜色缓冲写入到RenderTexture中,在应用运行时持续对RenderTexture进行更新,并将RenderTexture替换后处理脚本中OnRenderImage方法的输入源source。
9.根据权利要求6所述的基于Unity的软件线性渲染的方法,其特征在于,在步骤S204中还包括,脚本中包括对宏_COLORSPACE_LINEAR的开关。
10.根据权利要求9所述的基于Unity的软件线性渲染的方法,其特征在于,使用Shader.EnableKeyword或Shader.DisableKeyword对宏_COLORSPACE_LINEAR进行开关控制。
一种基于Unity的软件线性渲染的方法\n技术领域\n[0001] 本发明涉及线性渲染领域,特别是一种基于Unity软件进行线性渲染的方法。\n背景技术\n[0002] 线性渲染(Linear Rendering)就是渲染场景所有输入都是线性的。使用线性渲染相比于在伽玛空间(GammaSpace)进行非线性的渲染,更贴近真实世界的表现。如果在Unity中开启了线性渲染模式,Unity会将Default类型的纹理设置为sRGB模式,这种模式下硬件在对纹理进行采样时会自动将其转换到线性空间中(Linear Space);并且,也会设置一个sRGB格式的buffer,此时GPU会在shader写入color buffer前自动进行伽马校正(Gamma Correction)。\n[0003] 然而并非所有硬件都能支持sRGB格式的纹理采样技术,Unity引擎也并没有提供在硬件线性渲染不支持的情况下的解决方案。目前,在其他的一些引擎中,存在采用软件线性渲染的方式来解决该问题,但实现的方法过于简单,不能完全还原硬件线性渲染的效果。\n发明内容\n[0004] 为了解决现有技术存在的不足,本发明的目的在于提供一种基于Unity引擎的软件线性渲染的方案。本发明可以在不支持硬件渲染的设备上,实现与硬件线性渲染相同的画面效果。\n[0005] 为实现上述目的,本发明提出了基于Unity的软件线性渲染的方法,包括以下步骤:\n[0006] (1) 对线性渲染的环境进行判断;\n[0007] (2) 如果环境为Gamma Space,则在Gamma Space环境下进行软件线性渲染;\n[0008] (3) 如果环境为Linear Space,则在Linear Space环境下进行软件线性渲染。\n[0009] 对应Gamma Space和Linear Space两种环境,具体包括以下两种线性渲染方法。\n[0010] 方法一:一种在Gamma Space环境下实现软件线性渲染的方法,包括以下步骤:\n[0011] S101:在脚本中定义开启线性渲染的宏_COLORSPACE_GAMMA;\n[0012] S102:在Shader中执行tex2D()函数之后,并在将该采样结果运用于计算之前,根据宏_COLORSPACE_GAMMA判断是否需要开启软件线性渲染,如果需要线性渲染,则进行一下步骤;如果不需要线性渲染,则直接输出结果;\n[0013] S103:对tex2D()函数的采样结果执行Pow(...,2.0)操作,以将采样结果的值从非线性转换到线性空间;\n[0014] S104:执行tex2Dbias()和texCUBE()函数之后,对其采样结果重复S102‑S103步骤;\n[0015] S105:对光照贴图、全局反射贴图和/或光照的采样结果,重复S102‑S103步骤,从非线性空间转换到线性空间;\n[0016] S106:在主相机上添加继承MonoBehaviour的脚本,用于进行全屏后处理的操作;\n[0017] S107:编写用于屏幕后处理的Shader,对RenderTexture中的颜色执行Pow(...,\n0.5)操作;\n[0018] S108:在后处理脚本中,使用步骤S107中的Shader进行OnRenderImage的处理,将处理后的最终结果输出到屏幕上。\n[0019] 进一步地,在步骤S101中还包括,以#pragma multi_compile的方式定义开启线性渲染的宏_COLORSPACE_GAMMA。\n[0020] 进一步地,在步骤S106中还包括,脚本中包括对_COLORSPACE_GAMMA宏的开关。\n[0021] 更进一步地,使用Shader.EnableKeyword或Shader.DisableKeyword对_COLORSPACE_GAMMA宏进行开关控制。\n[0022] 方法二:一种在Linear Space环境下实现软件线性渲染的方法,包括以下步骤:\n[0023] S201:在脚本中定义开启线性渲染的宏_COLORSPACE_LINEAR;\n[0024] S202:在Unity引擎的目录下,修改UnityCG.cginc和UnityStandardBRDF.cginc文件中的内容,加入对宏的判断,以判断是否需要开启软件线性渲染,如果需要线性渲染,则进行一下步骤;如果不需要线性渲染,则直接输出结果;\n[0025] S203:将修改过后的UnityCG.cginc和UnityStandardBRDF.cginc文件放到Shader文件目录下,并在Shader中添加对上述两个cginc文件的引用;\n[0026] S204:在主相机上添加继承MonoBehaviour的脚本,用于进行全屏后处理的操作;\n[0027] S205:编写用于屏幕后处理的Shader,对RenderTexture中的颜色执行Pow(...,\n0.5)的操作;\n[0028] S206:在后处理脚本中,使用步骤S205中的Shader进行OnRenderImage的处理,将处理后的最终结果输出到屏幕上。\n[0029] 进一步地,在步骤S1中,由以#pragma multi_compile的方式定义开启线性渲染的宏_COLORSPACE_LINEAR。\n[0030] 进一步地,在步骤S202中,对宏的判断包括:判断UNITY_COLORSPACE_GAMMA的未开启的部分,并且判断宏_COLORSPACE_LINEAR。\n[0031] 进一步地,当所述方法使用在IOS系统上时,步骤S207还包括:复制主相机,将该相机的深度缓冲和颜色缓冲写入到RenderTexture中,在应用运行时持续对RenderTexture进行更新,并将RenderTexture替换后处理脚本中OnRenderImage方法的输入源source。\n[0032] 进一步地,在步骤S204中还包括,脚本中包括对宏_COLORSPACE_LINEAR的开关。\n[0033] 更进一步地,使用Shader.EnableKeyword或Shader.DisableKeyword对宏_COLORSPACE_LINEAR进行开关控制。\n[0034] 本发明提供的基于Unity的软件线性渲染方法,具有如下有益效果:现有技术中的线性渲染方法过于简单,无法完全还原渲染的效果,而本发明的方法能够完全还原硬件线性渲染的效果。\n[0035] 本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。\n附图说明\n[0036] 附图用来提供对本发明的进一步理解,并且构成说明书的一部分,并与本发明的实施例一起,用于解释本发明,并不构成对本发明的限制。在附图中:\n[0037] 图1为根据本发明的在Gamma Space环境下实现软件线性渲染的方法流程图;\n[0038] 图2为根据本发明的在Linear Space环境下实现软件线性渲染的方法流程图。\n具体实施方式\n[0039] 以下结合附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。\n[0040] 本发明的目的在于提供一种基于Unity引擎的软件线性渲染的方案,本发明包括两种软件线性渲染的实施例,对应了Unity引擎以不同的色彩空间发布应用时的情况。\n[0041] 实施例一\n[0042] 图1为根据本发明的在Gamma Space环境下实现软件线性渲染的方法流程图,下面将参考图1,对本发明的在Gamma Space环境下实现软件线性渲染的方法进行详细描述:\n[0043] 步骤101中,在脚本中定义开启线性渲染的宏_COLORSPACE_GAMMA;该宏_COLORSPACE_GAMMA以#pragma multi_compile的方式定义,若不以该方式定义,则可能无法在最终发布的应用程序中执行线性渲染的相关方法。\n[0044] 步骤102中,在Shader中执行tex2D()函数之后,并在将该采样结果运用于计算之前,根据宏_COLORSPACE_GAMMA判断是否需要开启软件线性渲染,如果需要线性渲染,则进行一下步骤;如果不需要线性渲染,则直接输出结果。\n[0045] 步骤103中,对tex2D()函数的采样结果执行Pow(...,2.0)的操作,以将采样结果的值从非线性转换到线性空间,再将其传递给后面的函数参与计算;\n[0046] 对于tex2Dbias()和texCUBE()函数,对其采样结果重复与tex2D()函数相同的操作步骤。\n[0047] 步骤104中,对Shader中的光照贴图、全局反射贴图和/或光照,重复102‑103步骤,将光照贴图的采样结果从非线性空间转换到线性空间。\n[0048] 步骤105中,在主相机上添加继承MonoBehaviour的脚本,用于进行全屏后处理的操作,并确保该脚本在所有其他后处理效果之后执行;该脚本中包括对_COLORSPACE_GAMMA宏的开关,使用Shader.EnableKeyword或Shader.DisableKeyword对_COLORSPACE_GAMMA宏进行开关控制。\n[0049] 步骤106中,编写用于屏幕后处理的Shader,对RenderTexture中的颜色执行Pow(...,0.5)的操作,将其从线性空间转换到非线性空间。\n[0050] 步骤107中,在后处理脚本中,使用步骤106中的Shader进行OnRenderImage的处理,将处理后的最终结果输出到屏幕上,这样得到结果和硬件线性渲染的结果基本等同。\n[0051] 实施例二\n[0052] 图2为根据本发明的在Linear Space环境下实现软件线性渲染的方法流程图,下面将参考图2,对本发明的在Linear Space环境下实现软件线性渲染的方法进行详细描述:\n[0053] 步骤201中,在脚本中定义开启线性渲染的宏_COLORSPACE_LINEAR;该宏_COLORSPACE_GAMMA以#pragma multi_compile的方式定义,若不以该方式定义,则可能无法在最终发布的应用程序中执行线性渲染的相关方法。\n[0054] 步骤202中,若Shader中使用了Unity Shader内置的变量,包括unity_ColorSpaceGrey、unity_ColorSpaceDouble、unity_ColorSpaceDielectricSpec、unity_ColorSpaceLuminance,或者使用了内置的方法,包括DecodeLightmap、DecodeHDR、BRDF1_Unity_PBS、BRDF2_Unity_PBS等,在Unity引擎的Editor\Data\CGIncludes目录下,修改UnityCG.cginc和UnityStandardBRDF.cginc文件中的内容,根据宏_COLORSPACE_LINEAR判断是否需要开启软件线性渲染,如果需要线性渲染,则进行一下步骤;如果不需要线性渲染,则直接输出结果;\n[0055] 通过在该文件中添加对宏_COLORSPACE_LINEAR的判断,可以将光照贴图的采样结果、全局光照贴图的采样结果、能量守恒的计算和光照相关计算,转换到线性空间进行计算。\n[0056] 步骤203中,将修改过后的UnityCG.cginc和UnityStandardBRDF.cginc文件放到Shader文件目录下,并在Shader中添加对上述两个cginc文件的引用;\n[0057] 步骤204中,在空间中的主相机上添加继承MonoBehaviour的脚本,用于进行全屏后处理的操作,并确保该脚本在所有其他后处理效果之后执行;\n[0058] 脚本中包括对宏_COLORSPACE_LINEAR的开关,并且使用Shader.EnableKeyword或Shader.DisableKeyword对宏_COLORSPACE_LINEAR进行开关控制。\n[0059] 步骤205中,编写用于屏幕后处理的Shader,对RenderTexture中的颜色执行Pow(...,0.5)的操作,将其从线性空间转换到非线性空间;\n[0060] 当该方法使用在IOS系统上时,还包括:复制主相机,将该相机的深度缓冲和颜色缓冲写入到RenderTexture中,在应用运行时持续对RenderTexture进行更新,并将RenderTexture替换后处理脚本中OnRenderImage方法的输入源source。\n[0061] 步骤206中,在后处理脚本中,使用步骤205中的Shader进行OnRenderImage的处理,将处理后的最终结果输出到屏幕上,这样得到结果和硬件线性渲染的结果基本等同。\n[0062] 本领域普通技术人员可以理解:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
法律信息
- 2022-07-15
- 2018-12-25
实质审查的生效
IPC(主分类): G06T 3/00
专利申请号: 201810436974.2
申请日: 2018.05.09
- 2018-11-30
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有引用任何外部专利数据! |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |