前言:
Shader形态部分:写Shader的总结与基础知识
SurfaceShader可以认为是一个光照Shader的语法糖、一个光照VS/FS的生成器。减少了开发者写重复代码的需要。
在手游,由于对性能要求比较高,所以不建议使用SurfaceShader。因为SurfaceShader是一个比较“通用”的功能,而通用往往导致性能不高。
特征是在SubShader里出现CGPROGRAM和ENDCG块。(而不是出现在Pass里。因为SurfaceShader自己会编译成多个Pass。)
注:自己尝试再添加Pass通道中发现不能实现(后期如果发现能添加会放链接)
- [ 复习SurfaceShader的代码构成]
//Shader 的路径与命名
Shader "Example/Rim" {
Properties{
//定义属性 主贴图,颜色白色,2D
_MainTex("纹理贴图", 2D) = "这里是描述" {}
_BumpMap("凹凸贴图", 2D) = "bump" {}
_RimColor("边缘的颜色", Color) = (0.26,0.19,0.16,0.0)
_RimPower("边缘颜色的强度", Range(0.5,8.0)) = 3.0
}
//子着色器
SubShader{
//渲染标签:不透明
Tags { "RenderType" = "Opaque" }
//Shader面的剔除Cull---详情连接https://www.cnblogs.com/jiahuafu/p/6667820.html
Cull OFF
//开始CG程序
CGPROGRAM
//surface - 声明的是一个表面着色器
//surf - 着色器代码的方法的名字
//Lambert - 使用的光照模型。问?光照模型有哪些?https://blog.csdn.net/qq_34552886/article/details/79089418
#pragma surface surf Lambert
//输入
struct Input {
float2 uv_MainTex;
float2 uv_BumpMap;
float3 viewDir;
};
//自我理解:这里是对属性的定义,即2D对应着sampler2D.Color对应着四个参数的float4,
sampler2D _MainTex;
sampler2D _BumpMap;
float4 _RimColor;
float _RimPower;
//输出环节,这这里处理渲染的逻辑
void surf(Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
half rim = 1.0 - saturate(dot(normalize(IN.viewDir), o.Normal));
o.Emission = _RimColor.rgb * pow(rim, _RimPower);
}
//结束CG程序
ENDCG
}
//回退 主要问题就是投射阴影问题①自己写投射阴影的Pass②用Fallback “Transparent/Cutout/VertexLit”或者Fallback “Diffuse”
//详情见上篇的链接
Fallback "Diffuse"
}
注:此代码段为官方文档的一段
做了部分的修改①UNITY面板显示的名称②Shader面的剔除Cull
磨刀不误砍柴工:
- 写shader的时候VS不给 高亮代码提示?
下载ShaderlabVS(此处提供的是vs2019版本)
【自我总结】
①SL-SurfaceShaderExamples中的几个案例代码放UNITIY看效果后对于整体代码结构的理解更清除了
②比着葫芦画葫芦,修改参数改效果
③Cull 的位置在子着色器里边,不在CG程序代码中
- 待解决的问题//如何处理自己想要的逻辑,无法看到UnpackNormal方法的源码的定位。
UnpackNormal方法的源码 为UnityCG.cginc的内置 CG方法
UnityCG.cginc文件地址:UnityHub\untiy版本号\Editor\Data\CGIncludes
本文详细介绍了Unity中的SurfaceShader,它是一个光照Shader的简化语法,减少了重复代码。由于性能考虑,手游开发中通常避免使用。Shader由Properties定义属性,SubShader包含CGPROGRAM和ENDCG块。SurfaceShader使用Lambert光照模型,代码中展示了如何处理纹理贴图、凹凸贴图以及边缘光效果。在理解SurfaceShader的基础上,作者通过实例增强了对Shader结构的理解,并提出在自定义逻辑中遇到的困难——查看内置方法如UnpackNormal的源码。
&spm=1001.2101.3001.5002&articleId=121979696&d=1&t=3&u=5f0cb1399c8f4ec09a77dfe4692bc301)
1236

被折叠的 条评论
为什么被折叠?



