[Unity]摘录笔记UnityShader(重写SurfaceShader)

本文详细介绍了Unity中的SurfaceShader,它是一个光照Shader的简化语法,减少了重复代码。由于性能考虑,手游开发中通常避免使用。Shader由Properties定义属性,SubShader包含CGPROGRAM和ENDCG块。SurfaceShader使用Lambert光照模型,代码中展示了如何处理纹理贴图、凹凸贴图以及边缘光效果。在理解SurfaceShader的基础上,作者通过实例增强了对Shader结构的理解,并提出在自定义逻辑中遇到的困难——查看内置方法如UnpackNormal的源码。

前言:

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

磨刀不误砍柴工:

【自我总结】
①SL-SurfaceShaderExamples中的几个案例代码放UNITIY看效果后对于整体代码结构的理解更清除了
②比着葫芦画葫芦,修改参数改效果
③Cull 的位置在子着色器里边,不在CG程序代码中

  • 待解决的问题//如何处理自己想要的逻辑,无法看到UnpackNormal方法的源码的定位。
    UnpackNormal方法的源码 为UnityCG.cginc的内置 CG方法
    UnityCG.cginc文件地址:UnityHub\untiy版本号\Editor\Data\CGIncludes
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值