本文最后更新于188 天前,其中的信息可能已经过时,如有错误请发送邮件到2939296129@qq.com
回顾-渲染流程
从美术的角度来形容渲染的过程(由于我不是美术,所以就不描述了哈哈),看图就行。

Shader代码(一)
关联编辑器
如何关联:
- 菜单栏
- Edit子菜单
- Preferences弹窗
- ExternalTools项
- ExternalScriptEditor子项
- 设置为:VS或者VS Code或者Rider

SF新建最简Shader模版
由于SF已经淘汰了,这里就省略了

最简Shader模版

主要需要修改的部分:
- shader路径名
- 材质面板参数
- 输入结构体
- 输出结构体
- 顶点着色器
- 片元着色器
Hello World

Shader代码(二)
代码Lambert

这里稍微用代码写一下:
//输入结构
struct VertexInput
{
float4 vertex : POSITION; //将模型顶点信息输入进来
float4 normal : NORMAL; //将模型法线信息输入进来
}
//输出结构
struct VertexOutput
{
float4 pos : SV_POSITION; //由模型顶点信息换算而来的顶点屏幕位置
float3 nDirWS : TEXCOORD0; //由模型法线信息换算过来的世界空间法线信息
}
//输入结构->顶点Shader->输出结构
VertexOutput vert(VertexInput v)
{
VertexOutput o = (VertexOutput)0; //新建一个输出结构
o.pos = UnityObjectToClipPos(v.vertex); //变换顶点信息 并将其塞给输出结构
o.nDirWS = UnityObjectToWorldNormal(v.normal); //变换法线信息 并将其塞给输出结构
return o; //将输出结构 输出
}
//输出结构->像素
float4 frag(VertexOutput i) : COLOR
{
float3 normalDir = i.nDirWS; //获取法线方向
float3 lightDir = _WorldSpaceLightPos0.xyz; //获取光线方向
float NdotL = dot(normalDir,lightDir); //法线方向 点积 光线方向
float lambert = max(0.0, NdotL); //截断负值
return float4(lambert,lambert,lambert,1.0); //输出最终颜色
}
注意:
- 要形成良好的代码规范,0.0和0虽然一样,0内部会转换为0.0(有些机型可能会导致转换错误)
- 片元着色器要返回float4格式的变量,返回float也可以,内部会转换为float4,但是可能会导致未知错误
与SF代码对比

连连看生成的代码会产生冗余,自己写的代码可以达到性能最优,可读性也高。
结点组-参数
参数结点常用全家桶

SF和ASE的差不多,这里就不多介绍了
值得一提的是FakeLight,伪造光,或者虚拟光
在Shader中光的计算依靠 光的方向、光的颜色、强度;我们可以自定义一系列参数在shader中实现伪造光
