总结
本ke复盘之前学习内容
总结
本ke复盘之前学习内容
Shader Target
unity 支持的Shader Target
#pragma target 2.0 - 5.0
Shader Model 1 、2、3、.... 可以理解为是C#语言的不同版本。
CG 数据类型
CG通常采用动态编译的方式(也支持静态编译)
动态编译可以理解为,我们在游戏运行时,把Shader代码修改了,在回到引擎中我们发现挂载该Shader的物体效果会发生变化。
Cg 数据类型(共7种)
float 32位
half 16位
int 32位
fixed 12位
bool 布尔数据
sampler 纹理 (共6种)
(sampler,sampler1D,sampler2D,sampler3D,samplerCUBE,samplerRECT)
*DirectX profiles 不支持samplerRECT
pc端 float / half / fixed 无差异。
因为pc端都把 half / fixed 都换算成float来计算。
手机端 float / half / fixed 还是有区别的。
Shader平台差异
宏的讲解。(坐标是否翻转)
OpenGL (写法更随意)
平台会自动补全
例:float4 v = float4(0);
DX(写法更严谨)
例:float4 v = float4(0,0,0,0);
调试工具
2种方法。
1:将颜色在顶点着色器 或 片元着色器 中 输出出去,来验证效果。
2: 使用 Frame Debug
(Window-Analysis-Frame Debugger)
Enable:理解为截屏
顶点色在Shader中的体现
例子:
o.color = v.color;
顶点着色器输出语义 + 片元着色器输出语义
顶点着色器输出结构体中常用语义
SV_POSITION (裁剪空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量。等同于DX9中的POSITION)
COLOR0 (通常用于输出第一组顶点颜色,不是必须。)
COLOR1 (通常用于输出第二组顶点颜色, 不是必须。 )
TEXCOORD0 - TEXCOORD7 (通常用于输出纹理坐标,不是必须。 )
片元着色器输出时常用语义
SV_Target (输出值将会储存到渲染目标(render target)中。等同于DX9中COLOR语义。)
顶点着色器输入语义
语义:
可以理解为是一个标记。
最终也就是让Shader知道在哪里读数据,并且把数据输出到哪里。
例如:
struct a2v
{
float4 texcoord : TEXCOORD0
}
上面a2v输入结构体中的语义 :TEXCOORD0
就是将第一套uv存储在变量 texcoord 中
如果在输出结构体v2f中我们仍然可以用
:TEXCOORD0 (即使输入结构体a2v中已经有:TEXCOORD0了我们仍然可以使用)这是因为
语义的另一个功能就是寄存器。
:SV_POSITION
(顶点着色器后使用)
例:float4 vert ( float4 v : POSITION ) : SV_POSITION
:SV_TARGET
(片元着色器后使用)
例:fixed4 frag ( ) :SV_TARGET
以上2种语义是特殊语义,不能乱用。
有时候我们能看见 SV_POSITION & SV_TARGETSV 被写成了 POSITION & TARGET 这是因为在DX10 之后引入了一个叫系统数值的语义。 这时候POSITION & TARGET 就有了他自己的目的需要去做的事情。所以我们就用SV_POSITION & SV_TARGETSV
如果不使用 SV_POSITION & SV_TARGETSV 而用 POSITION & TARGET 我们会发现在PS4上会出错。
我们理解为在DX10 之后为了兼容某些硬件,我们引入了新的语义 SV_POSITION & SV_TARGETSV 而 SV_POSITION & SV_TARGETSV 是包含 POSITION & TARGET。
顶点着色器输入结构体种的语义笔记
:POSITION
(模型空间中的顶点位置,通常是float4类型)
: NORMAL
(顶点法线,通常是float3类型)
:TANGENT
(顶点切线,通常是float4类型)
TEXCOORDn
( 顶点的纹理坐标,TEXCOOD0表示第一组uv坐标纹理通常是float2 , float4类型 )
(Shader Model2 & 3 可以支持最多 8 个TEXCOORD)
(Shader Model4 & 5 可以支持最多 16 个TEXCOORD)
COLOR
(顶点颜色,通常是fixed4类型)
Shader库中的输入输出结构体
1/
.cginc文件 可以被加载进我们的Shader中
例如
写如下代码在CGPROGRAM中,加载UnityCG.cginc文件
#iclude "UnityCG.cginc"
这样我们就可以直接使用“Unity CG.cginc”文件内的变量和方法了。
2/
UnityShaderUtiilities.cginc
UnityShaderVariables.cginc
以上俩个.cginc文件是默认被加载进Shader中的。
属性控制
内容概要
1/属性快
Properties
{
_MainTex("Texture",2D) = "white"{ }
_Color("Color",Color) = (1,1,1,1)
}
定义的属性块需要在CGPROGRAM中再次进行定义
.xyzw 和 .rgba 是一样的。
当我们的一个变量是3维的(例如:float3 color)
那么我们需要用一个3维的去与他相乘,(例如:color *= _Color.rgb),如果用非3维的向量去与之相乘会报错。
输出结构体
构造函数a2v的命名
a: application 应用
2:to 到
v: vert 顶点着色器
构造函数v2f的命名
v: vert 顶点着色器
2:to 到
f:frag 片元着色器
本节概要
Shader中2个构造函数名字的含义。
2个构造函数中各个成员语义的意义。
顶点着色器返回值和写法讲解。
如何将区间(-1,1)转变为(0,1)。
Shader 输入结构体
:SV_TARGET(是渲染到RenderTarget中,RenderTarget是默认的缓存叫做帧缓存)
:POSITION(语义:输入的模型顶点信息)
:SV_POSOTION(语义:顶点输出之后的裁剪空间的顶点信息)
以上三种都是CG,HLSL中的语义,语义是告诉程序,我们输入的是什么。
例如:顶点着色器的参数(float4 v:POSITION)
float4告诉我们这是一个4维的变量。
:POSITION告诉我们这是输入的模型顶点信息。
理解a2v结构体,这个a2v名字可以随便命名,但是要确保和地下顶点着色器中的参数名字保持一直。
结构体中的每一个成员,都需要有一个语义去标注。
理解 vert( ) 方法 的结构:
1/返回值float4是被 :SV_POSITION语义标注的
代表裁剪空间顶线信息。
2/参数a2v 是一个结构体,考虑到可能要输入大量的模型空间的信息。例如,顶点信息,法线信息,uv信息等,固使用结构体来作为方法参数。
ab = x1x2 + y1y2
ab = |a||b|cos&
几何意义:用于求两个向量的夹角
cos&
正为锐角
0为垂直
负为钝角
Pass中Tags独有属性
LightMode 定义该pass通道在Unity渲染流水中的角色
RequireOptions 满足某些条件时才渲染该Pass通道
Render设置
Cull off/back/front 选择渲染哪个面
ZTest Always/Less Greater/LEqual/GEqual/NotEqual 深度测试
ZWrite off/on深度写入
Blend SrcFactor DstFactor 混合
LOD //不同情况下使用bu
Tags 标签
Queue //渲染顺序
RenderType //着色器替换功能
DisableBatching //是否进行合批
ForceNoShadowCasting //是否投射阴影
IgnoreProjector //受不受Projector的影响,通常用于透明物体
CanUseSpriteAltas //是否用于图片的shader,通常用于UI
PreviewType //用作shader面板预览的类型
subshader语义块
Tags
unity属性类型
Int
float
Range(x,y):范围值
Color
Vector (x,y,z,w)
2D
Cube
3D
应用阶段-几何阶段-光栅化阶段
cpu应用阶段:
https://blog.csdn.net/qq_42461824/article/details/107672111
这一节没有阴影是因为没有定义_Color 属性
导致无法计算阴影