1cpu把网格从硬盘加载到显存
2cpu设置网格的渲染状态,哪个网格用哪个shader
3cpu告诉gpu渲染这个drawcall
drawcall理解为cpu对gpu发起一个命令。此命令指向需要被渲染的图元列表,不包含任何材质信息
顶点数据->顶点着色器(模型坐标到投影坐标)->裁剪(摄像机外的扔掉,一半一半的构建新顶点)->屏幕映射
->三角形设置(计算边上对应的像素)->三角形遍历(插值生成包含的片元)->片元着色器->逐片元操作->输出
片元->模板测试->深度测试->混合->颜色缓存区
-----
透明测试
-----
模板缓存区,深度缓存区,透明缓存区,颜色缓存区
----
命令缓存区,cpu不断插入,gpu不断读取,cpu速度一般跟不上
===================
_mainTex("Main Tex"),2d) = "while" {}
========
sampler2D _MainTex //属性表的右边贴图
float4 _MainTex_ST //属性表的左边属性
====
o.uv = i.texcoord * _MainTex_ST.xy + _MainTex_ST.zw;
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex)
//i.texcoord 也是uv
写在顶点着色器
=====
fixed3 albedo = tex2D(_MainTex, i.uv)
写在片元着色器
====
mul(矩阵,向量)
(float3x3)矩阵
(向量).xyz
降纬度
==
升维度
fixed4(i.color,1)
==
逐个顶点进行计算
逐个片元进行计算 更加平滑的光照效果
====
物体渲染:
1先渲染所有不透明物体,并开启深度测试和深度写入
2半透明物体从远到近 排序,顺序渲染,开启深度测试,关闭深度写入
开深度测试是为了在不透明的物体后的 不需要渲染, 关闭深度写入是为了 透明物体之后的透明物体也渲染
====
透明度测试:
clip(texColor.a - _Cutoff)
相当于
if((texColor.a - _Cutoff) < 0)
discard;
要么完全显示,要么完全不显示
===
Blend SrcAlpha OneMinusSrcAlpha
正常混合
目标 = 源*源alpha + 目标*(1-源alpha)
===
cull back | front | off
默认是back不显示
一个平面2个面,back不显示的话,翻过平面会看穿
====
矩阵补充:
坐标轴c下的点a要转换到坐标轴p上
需要矩阵 []*a
矩阵的表现形式为 坐标轴c的x轴,y轴,z轴,原点在坐标p上的表示
以列排序 ,
第一行则为p的x轴在c下的表示
由于方向没位置,所以一般只需要3*3
//因此转置可以得到逆矩阵(前提正交矩阵)
//法线需要逆转置矩阵
//mul(m,v)
//mul(v,m)= mul(tran(M),v)
=====
??什么时候需要归一化
??什么时候float4,float3,什么时候.xyz
xyz为取 x,y,z坐标做成(x,y,z)
颜色什么时候+ 和*
====
fixed3 worldNormal = normalize(mul(v.normal, (float3x3)_World2Object))
逆转置
object2World 的逆是world2object,转置为交换2者顺序
=====
float3 binormal = cross( normalize(v.normal),normalize(v.tangent.xyz) ) * v.tangent.w;
float3x3 rotation = float3x3(v.tangent.xyz, binormal, v.normal);
//或者声明 TANGENT_SPACE_ROTATION;
o.view = mul(rotation, objSpaceviewdir(v.vertex)).xyz
====
fix3d3 tangentNormal;
tangentNormal.xy = (packedNormal.xy*2-1);
tangentNormal.z = sqrt(1.0= saturate(dot(tangentNormal.xy, tangentNormal.xy)));
//或者声明
tangentNormal = UnpackNormal(packedNormal);
===
float3 worldPos = mul(_object2world, v.vertex).xyz;
fixed3 worldNormal = unityobjecttoworldnormal(v.normal);
fixed3 worldtangent = unityobjecttoworlddirv.tangent.xyz);
fixed3 worldbinormal = corss(worldNormal. worldtangent) * v.tangent.w;
o.ttow0 = loat4(worldtangent.x, worldbinormal.x, worldnormal.x, worldpos.x);
o.ttow1 = loat4(worldtangent.y, worldbinormal.y, worldnormal.y, worldpos.y);
o.ttow2 = loat4(worldtangent.z, worldbinormal.z, worldnormal.z, worldpos.z);
bump = normalize(half3(dot(i.ttow0.xyz, bump),dot(i.ttow1.xyz,bump),dot(i.ttow2.xyz,bump) ));