1 three-dimensional model composed of those
mesh and texture
2 pipelines
1) vertex data
(2) Geometric stages:
a vertex shader tessellation shader → → → cutting → geometry shader screen map (→ data transfer to the rasterization stage)
(3) rasterizer stages: ( rasterization calculated : Display the actual display image is composed of pixels, we need to point and line pattern generated by the above certain algorithms converted to the corresponding pixel. converts a vector graphic as a series of pixels is called rasterization process For example, a mathematical representation of the diagonal lines, is ultimately converted into a stepped consecutive pixels.)
triangle set traversing triangle → → → fragment by fragment shader operations
(4) screen image
. 3 Shader semi transparency
Shader "Unlit/HalfTransparent" { Properties { _MainTex ("Texture", 2D) = "white" {} _Scale("Scale",Range(0,1))=1 } SubShader { Tags { "RenderType"="Transparent" "Queue" = "Transparent" } Pass { ZWrite Off Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag // make fog work #pragma multi_compile_fog #include "Lighting.cginc" #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; fixed _Scale; 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 { // sample the texture fixed4 col = tex2D(_MainTex, i.uv); // apply fog return fixed4(col.rgb,col.a*_Scale); } ENDCG } } }
核心点:
Tags(''RenderType''="Transparent" "Queue"="Transparent"}
ZWrite Off 关掉深度写入
Blend ScrAlpha OneMinusScrAlpha (Alpha混合 srcalpha:源透明值 oneminusalpha:1-源透明值 最终颜色 = 源颜色 * 源透明值 + 目标颜色*(1 - 源透明值)
)
4 前向渲染和后向渲染
在大多数情况下,我们可以通过Edit->Project Settings->Player->Other Settings->Rendering->Path中选择需要渲染的路径,默认是前向渲染路径。
但是我们也可以在Camera中单独设置这个摄像机的渲染路径。
在Shader中,通过指定Pass中的LightMode标签来实现:
Pass{
Tags { "LightMode" = "ForwardBase" }
前向渲染路径
传统且常见的渲染方式。
原理:
Unity将各种光照按逐顶点处理、逐像素处理、球谐函数SH等方法计算出并混合。至于怎么处理:
1. 最多有四个光源按逐顶点处理
2. 场景中最亮的平行光是逐像素处理的
3. 被设置成not important,会按逐顶点或SH处理
4. Important的会逐像素处理
5. 如果逐像素渲染的数量小于Quality Setting中的逐像素数量,则会有更多的光源进行逐像素处理
使用#pragma multi_compile_fwdbase这样的编译指令,可以让Pass生成所有需要的Shader变种。
延迟渲染路径
当场景之中包含大量光源的时候,前向渲染的性能会急速下降。所以需要延迟渲染。
延迟渲染使用了一个叫G-缓冲的缓冲区(G-Buffer)。
延迟渲染主要包含了两个Pass
一、在Pass1中,不进行任何光照计算,而仅仅计算哪些片元是可见的,通过深度缓冲技术,如果发现可见,则把它的相关信息存储到G-缓冲中。
二、在Pass2中,理由G-缓冲中的各种信息来进行真正的光照计算。
在Unity的延迟渲染中,每个光源都可以按照逐像素的方式进行处理,但也有缺点:
1. 不支持真正的抗锯齿功能
2. 不能处理半透明物体
3. 对显卡有一定要求
延迟渲染可以访问的内置变量:
_LightColor float4类型 光源的颜色
_LightMatrix0 float4x4类型 世界空间到光源空间的变换矩阵。可以用于采样cookie和光强衰减原理。
5.OpenGL中要用到哪几种Buffer?
(1)帧缓冲(Frame Buffer)
(2)颜色缓冲(Color Buffer)
(3)模板缓冲(Stencil Buffer)
(4)顶点缓冲(Vertice Buffer)
(5)深度缓冲(Depth Buffer)
7 Unity Shader 中的常用RenderType?
(1)Opaque: 用于大多数着色器(法线着色器、自发光着色器、反射着色器以及地形的着色器)。
(2)Transparent:用于半透明着色器(透明着色器、粒子着色器、字体着色器、地形额外通道的着色器)。
(3)TransparentCutout: 蒙皮透明着色器(Transparent Cutout,两个通道的植被着色器)。
(4)Background: Skybox shaders. 天空盒着色器。
(5)Overlay: GUITexture, Halo, Flare shaders. 光晕着色器、闪光着色器。
(6)TreeOpaque: terrain engine tree bark. 地形引擎中的树皮。
(7)TreeTransparentCutout: terrain engine tree leaves. 地形引擎中的树叶。
(8)TreeBillboard: terrain engine billboarded trees. 地形引擎中的广告牌树。
(9)Grass: terrain engine grass. 地形引擎中的草。
(10)GrassBillboard: terrain engine billboarded grass. 地形引擎何中的广告牌草。
8 MeshRender中material和sharedmaterial的区别
修改sharedMaterial将改变所有物体使用这个材质的外观,并且也改变储存在工程里的材质设置。不推荐修改由sharedMaterial返回的材质。如果你想修改渲染器的材质,使用material替代。
9 Unity of the Shader, Blend SrcAlpha OneMinusSrcAlpha What does it mean?
Alpha blending effect is. Formula: = final color of the source color values of x + target source color transparent x (1 - Source Transparent value)