首页 > 编程知识 正文

unity渲染基本流程,unity的渲染机制

时间:2023-05-06 04:16:11 阅读:241531 作者:3994

一.LOD

1:LOD Level of Detail, 根据LOD来设置使用不同版本的Shader,官方链接见:Shader Level of Detail

2:着色器中给SubShader一个LOD值,程序来设置这个shader的LOD值,只有从上往下第一个小于等于LOD值subShader才会被执行;

3: 每个shader最多只会有一个SubShader被使用;

4: 通过Shader maximumLOD来设置最大的LOD值;

5: 设置全局的LOD值,Shader.globalMaximumLOD;

6: Unity内置着色器分LOD等级:    

(1)VertexLit kind of shaders 100      

(2) Decal, Reflective VertexLit 150      

(3)Diffuse 200      

(4)Difuse Detail  250      

(5) Bumped, Specular   300      

(6) BumpedSpecular  400      

(7) Parallax   500      

(8) Parallax Specular 600

例子:

Shader "Custom/LODShader" {Properties {_Color ("Color", Color) = (1,1,1,1)_MainTex ("Albedo (RGB)", 2D) = "white" {}_Glossiness ("Smoothness", Range(0,1)) = 0.5_Metallic ("Metallic", Range(0,1)) = 0.0}// 每次只会根据情况来选择一个可执行的SubShader// 找到第一个<= Shader.maximumLOD 这个subShader执行;SubShader {Tags { "RenderType"="Opaque" }LOD 600 // LODCGPROGRAM// Physically based Standard lighting model, and enable shadows on all light types#pragma surface surf Standard fullforwardshadows// Use shader model 3.0 target, to get nicer looking lighting#pragma target 3.0sampler2D _MainTex;struct Input {float2 uv_MainTex;};half _Glossiness;half _Metallic;fixed4 _Color;void surf (Input IN, inout SurfaceOutputStandard o) {o.Albedo = fixed3(1.0, 0.0, 0.0);}ENDCG}SubShader {Tags { "RenderType"="Opaque" }LOD 500 // LODCGPROGRAM// Physically based Standard lighting model, and enable shadows on all light types#pragma surface surf Standard fullforwardshadows// Use shader model 3.0 target, to get nicer looking lighting#pragma target 3.0sampler2D _MainTex;struct Input {float2 uv_MainTex;};half _Glossiness;half _Metallic;fixed4 _Color;void surf (Input IN, inout SurfaceOutputStandard o) {o.Albedo = fixed3(0.0, 1.0, 0.0);}ENDCG}SubShader {Tags { "RenderType"="Opaque" }LOD 400 // LODCGPROGRAM// Physically based Standard lighting model, and enable shadows on all light types#pragma surface surf Standard fullforwardshadows// Use shader model 3.0 target, to get nicer looking lighting#pragma target 3.0sampler2D _MainTex;struct Input {float2 uv_MainTex;};half _Glossiness;half _Metallic;fixed4 _Color;void surf (Input IN, inout SurfaceOutputStandard o) {o.Albedo = fixed3(0.0, 0.0, 1.0);}ENDCG}FallBack "Diffuse"}

1.此shader包含3个SunShader,LOD值分别为600,500,400

2.在运行时,可以使用下面方法动态设置maximumLOD值,从而决定哪一个SubShader起作用,如果是600则是红色,500是绿色,400是蓝色,小于400是fallback白色,如果小于100将不显示任何东西。:

public void SetLOD(Shader shader,int LOD_value){if(LOD_value<100){Debug.LogError("LOD值不能小于100!");return ;}shader.maximumLOD=LOD_value;} 二.渲染队列(Queue)

1:渲染队列标签可选值,官方链接:ShaderLab: SubShader Tags:      

(1)Background 背景,对应的值为1000,最早渲染;      

(2) Geometry(default) 几何体对应的值为2000, 这个队列是默认的渲染队列,大多数不透明的物体。数值不同时,先渲染数值大的物体;数值相同时,从前向后渲染(靠近摄像机的先渲染);后渲染的被遮挡部分不再渲染;      

(3)AlphaTest Alpha测试,对应值为2450, alpha测试的几何体使用这种队列,它是独立于 Geometry的队列,它可以在所有固体对象绘制后更有效的渲染采用Alpha测试的对象;      

(4)Transparent:透明,对应值3000,一般是不写深度的物体 ,采用从后向前的次序; 任何有alpha混合的对象都在这个队列里面渲染;      

(5) Overlay 覆盖对应值为4000, 这个渲染队列是最后渲染的物体,一般是覆盖效果,比如镜头光晕,屏幕贴片之类的;

2: Unity 渲染模式: 普通物体从前向后, Alpha从后向前; 2:渲染队列的数值决定了Unity在渲染场景物体时的先后顺序,关闭深度测试的情况下。

例子:

Shader "Custom/RenderQueue" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Glossiness ("Smoothness", Range(0,1)) = 0.5 _Metallic ("Metallic", Range(0,1)) = 0.0 } SubShader { Tags { "RenderType"="Opaque" "Queue"="Geometry+100" }//设置渲染队列的值,+左右不能用空格,多个tag,不能用逗号; LOD 200 ZTest off//关闭深度测试,默认是开启的 CGPROGRAM // Physically based Standard lighting model, and enable shadows on all light types #pragma surface surf Standard fullforwardshadows // Use shader model 3.0 target, to get nicer looking lighting #pragma target 3.0 sampler2D _MainTex; struct Input { float2 uv_MainTex; }; half _Glossiness; half _Metallic; fixed4 _Color; void surf (Input IN, inout SurfaceOutputStandard o) { // Albedo comes from a texture tinted by color o.Albedo = _Color.rgb; } ENDCG } FallBack "Diffuse"}

如果我们在场景中放置一红一绿两个球体,红色的球距离摄像机更近,使用StandardShader,绿色的使用上面自定义的Shader。本来红色球会把绿色球挡住,但是因为我们修改了绿球渲染队列的值,又关闭了深度测试,使得绿色球渲染顺序在前,所以绿球显示在红色球前面。

三.混合模式(Blend)

1:在所有计算完成后,决定当前的计算结果输出到帧缓冲区时,如何混合源和目标,通常用来绘制半透明的物体;

2: Blend Off 关闭混合

3: Blend 源因子,目标因子: 配置并开启混合,产生的颜色和因子相乘,然后两个颜色相加

4: Blend 源因子,目标因子, 源因子A,目标因子A: 源因子与目标因子用户混合颜色值,源因子A,与目标因子A,用于混合alpha 5: BlendOp操作命令: 不是将颜色混合在一起,而是对他们进行操作,主要有: Min, Max, Sub, RevSub

6:混合因子的类型:

One 使用源或目标色完全显示出来;                

OneMinusSrcColor 阶段值 * (1-源颜色的值) Zero 删除源颜色或目标颜色;                            

OneMinusSrcAlpha 阶段值 * (1-源颜色的Alpha值) SrcColor 这个阶段的值*源颜色值;                    

OneMinusDstColor 阶段值 * (1-目标颜色的值); DstColor 这个阶段的值* 帧缓冲颜色值;        

OneMinusDstAlha 阶段值 * (1-目标颜色Alpha值) DstAlpha这个阶段的值 * 帧缓冲源Alpha值  

SrcAlpha这个阶段的值 * 源颜色Alpha值

7:一般放在放在Pass通道里面,必须在CG代码段的外面

例子:

Shader "Custom/BlendShader"{Properties{_MainTex ("Texture", 2D) = "white" {}_Color ("Color", Color) = (1.0, 0.0, 0.0, 1.0)}SubShader{//设置渲染通道为透明,这样就可以看见后面的物体了,因为混合模式针对半透明模式有效 //注意加号后面不能有空格Tags { "RenderType"="Opaque" "Queue"="Transparent +10" }LOD 100Pass{//默认关闭状态(Blend Off)设置混合模式,SrcAlpha是源因子,源因子和本物体颜色相乘,OneMinusSrcAlpha是目标因子,目标因子和已缓存的颜色相乘,然后两个值相加//一般放在渲染通道的里面,必须在CG代码段的外面Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"fixed4 _Color;struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};sampler2D _MainTex;float4 _MainTex_ST;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}fixed4 frag (v2f i) : SV_Target{ fixed4 col = _Color;return col;}ENDCG}}}

效果如下:

四.Alpha测试(AlphaTest)

1:Alpha测试: 阻止片元被写到屏幕的最后机会, 最终渲染出来的颜色计算出来后可通过透明度和最后一个固定值比较,如果通过测试则绘制此片元,否则丢弃此片元;

2: AlphaTest Off/On: 开启/关闭Alpha测试,默认是关闭的;

3:比较测试值的模式:     Greater >,  GEqual >=, Less <, LEqual <=, Equal ==, NotEqual !=,    Always (永远渲染), Never(从不渲染);

4: AlphaTest 条件 [变量] / 常数,  一般放在放在Pass通道里面,必须在CG代码段的外面;

5:见官方文档:ShaderLab: Legacy Alpha Testing

五.深度测试(ZTest)

1:为了使近距离的物体挡住远距离的物体,当片元写入到缓冲的时候,需要将片元的深度值与缓冲区的深度值进行比较,测试成功写入帧缓冲区;

2: ZWrite  深度写开关, 控制是否将深度Z的片元写入缓冲区中,如果不绘制透明物体设置为On, 否则的话设置为Off,默认为On; 3: ZTest 深度测试模式: 设置深度测试的执行方式,默认为LEqual,深度测试的模式:     Less <, Greater >, LEqual <= , GEqual >=, Equal ==, NotEqual !=, Always 总是绘制,关闭深度测试;

4: ZTest 条件

5: 一般放在放在Pass通道里面;

6:见官方文档:ShaderLab: Legacy Alpha Testing

六.通道遮罩(ColorMask )

1:通道遮罩可以是开发人员指定渲染结果输出的通道,而不是通常情况下的RGBA四个通道;

2:可选的是RGBA的任意组合以及0,如果为0意味着不会写入到任何通道;

3: ColorMask RG ... ColorMask 0

例子:

Shader "Custom/ColorMaskShader" {SubShader {pass {ColorMask RGBAColor(1.0, 1.0, 1.0, 1.0)}}// FallBack "Diffuse"} 七.面剔除(Cull)

1:通过不渲染背对摄像机的几何体的面来提高性能优化错误,所有的几何体都包含正面和反面

2: 面剔除操作,大多数都是封闭的物体,所以不需要绘制背面;

3: 面剔除操作:        

Cull Back: 不绘制背对摄像机的面,默认项        

Cull Front,  不绘制面向摄像机的面,        

Cull Off, 关闭面剔除操作

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。