目录:
学习网站+工具:
1、函数可视化网站:Domita Graphtoy
使用链接1:5.WebGL+Shader常用函数_shader 整除-CSDN博客
使用链接2:2.着色器基础_graphtoy-CSDN博客
1.1、函数可视化网站:www.desmos.com/calculator
2、官方HLSL 的API查询网站:
链接: 着色器Shader (HLSL)的API查询:cross - Win32 apps | Microsoft Learn
一、工程搭建示范:
项目布局排布。2 by 3
安装shader Forge:
下载链接:
新建shader forge:
二、眼力:根据效果 分析案例 技术构成:
黑话:
- 结构(struct):
举例:可以把学生证理解为,相关学生信息的组织方式,
学生证:...
姓名:...
学号:...
班级:...
- 标量(Scalar):只有大小,没有方向的量。例:年龄,体重等。
- 向量(Vector):既有大小,也有方向的量。例:力,速度等。
- 点乘/点积/Dot:
- 两向量间的一种运算方式,结果为1标量,具有良好的几何含义。
- 结果的几何意义为:一个向量在另一个向量上的投影长度;
3、 结果的图形学表现为:两向量,方向同时结果=1(白色)。方向相反结果:=-1(黑色),垂直 结果: =0(黑色);
4、映射:
两个集合,元素间相互对应的关系。
三、渲染 发生了什么?
渲染过程:
渲染过程中经历了那些环节
1、模型:
获取模型的顶点信息。
2、输入结构:
获取模型的 UV,法线,顶点色,和 后续渲染将用到的相关信息,("学生证信息结构")。
信息结构在这里(1-1)进行列举。 (1-1)
struct VertexInput{
//输入结构中的,学生证信息.
float4 vertex : POSITION;
float3 normal : Normal;
}
(1-2)
3、顶点shader:(模型顶点-换算为-屏幕位置)
将学生证结构信息,告知,并提交到 <顶点 shader>中去。
- 将模型每个顶点位置信息,换算为每个顶点应在 屏幕当中的位置。
- 计算和赋值其他逐个 顶点信息,如:UV,顶点颜色,顶点法线。
4、输出结构:
- 将获取到的"学生证数据结构",在此结构中,转换到屏幕顶点位置。
//确立 顶点的 输出结构
struct VertexOutput{
//将获取到的学生证数据结构,在此结构中,转换到屏幕顶点位置。
float4 pos: SV_POSITION;
float4 posWorld : TEXCOORD0;
float4 normalDir: TEXCOORD1;
LIGHTING_COORDDS(2,3)
}
//顶点Shader输出
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0; //新建一个输出结构==初始为零
o.pos = UnityObjectToClipPos( v.vertex ); //变换顶点信息 并将其塞给输出结构
o.nDirWS = UnityObjectToWorldNormal(v.normal); //变换法线信息 并将其塞给输出结构
return o; //输出
}
4.1、空白模板
Shader "Unlit/Sc01Lambert01"
{
Properties
{
//_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass {
Name "FORWARD"
Tags {
"LightMode"="ForwardBase"
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma target 3.0
UNITY_INSTANCING_BUFFER_START( Props )
// UNITY_DEFINE_INSTANCED_PROP( float4, _Color)
UNITY_INSTANCING_BUFFER_END( Props )
//输入结构
struct VertexInput
{
};
//顶点输出结构
struct VertexOutput
{
};
//输出结构>>>顶点shader>>>输出结构
VertexOutput vert (VertexInput v)
{
}
//色彩输出结构
float4 frag(VertexOutput i) : COLOR
{
return float4(1,1,1,1.0f);//输出最终颜色
}
ENDCG
}
}
}
基础Lambert模板
Shader "Unlit/Sc07_SL_Lambert02"
{
Properties
{
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass {
Name "FORWARD"
Tags {
"LightMode"="ForwardBase"
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#include "UnityCG.cginc"
#include "AutoLight.cginc"
#include "Lighting.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma target 3.0
UNITY_INSTANCING_BUFFER_START( Props )
// UNITY_DEFINE_INSTANCED_PROP( float4, _Color)
UNITY_INSTANCING_BUFFER_END( Props )
//输入结构
struct VertexInput
{
float4 vertex : POSITION;
float4 normal : NORMAL;
};
//顶点输出结构
struct VertexOutput
{
float4 posCS : SV_POSITION;
float3 nDirWS : TEXCOORD0;
};
//输出结构>>>顶点shader>>>输出结构
VertexOutput vert (VertexInput v)
{
VertexOutput o = (VertexOutput)0;
o.posCS = UnityObjectToClipPos(v.vertex);
o.nDirWS = UnityObjectToWorldNormal(v.normal);
return o;
}
//色彩输出结构
float4 frag(VertexOutput i) : COLOR
{
//准备向量
float3 ndir = i.nDirWS;
float3 ldir = _WorldSpaceLightPos0.xyz;
//点积结果
float ndotl = dot(ndir,ldir);
//光照模型公式
float Lambert = max(0,ndotl *0.5+0.5);
//返回结果
return float4(Lambert,Lambert,Lambert,1.0f);//输出最终颜色
}
ENDCG
}
}
}
5、像素shader:
- 项目设置全局光照
- 输入色彩Color信息
- 平行光,等其他光源头
综合以上数据源,算出最终>>>渲染结果。
6、渲染结果:
展示窗口结束。
四、shader Lab 点积 实现 lambert 着色效果 / 光照模型:
点积:
物体表面法线方向 * 灯光方向
半Lambert着色公式:
物体表面法线方向 * 灯光方向 *0.5 + 0.5
五、映射:
UV映射
得到的UV坐标对,RampTex(贴图)采样。
图像 材质球 有黑斑的 可以选中图片,并设置图片,Warp mode 为,Clamp.
六、总结回顾:
1、向量
2、点乘/点积。==>>图形学性质:
两个方向越 接近,点乘结果,越接近1,越反,越-1,90°,为0.
3、Lambert案例
4、Half Lambert案例
5、0-1区间UV渐变 映射 到 lambert上。
6、Append节点是什么意思呢?
U坐标与V坐标,摊平。