Shader学习的基础知识( 三十四)表面着色器上
表面着色器是什么
表面着色器实际上是在顶点/片元着色器之上又添加了一个层抽象。表面着色器让我们关注的细节就更少了,自由度也就更底。但是好处里代码量也是少得惊人。而且性能上也不如顶点/片元着色器。
- 如果你需要和各种光打交到,尤其是想要使用全局光源,你可能更喜欢表面着色器,但你要小心它的性能。
- 如果光源少,那可以使用顶点片元着色器。
- 如果有很多自定义的效果,则使用顶点/片元着色器
一个表面着色器的例子:
这里只有30几行代码,如果使用顶点/片元着色器则需要150多行。
Shader "Unity Shaders Book/Chapter 17/Bumped Diffuse" { Properties { _Color ("Main Color", Color) = (1,1,1,1) //主图 _MainTex ("Base (RGB)", 2D) = "white" {} //法线纹理 _BumpMap ("Normalmap", 2D) = "bump" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 300 CGPROGRAM #pragma surface surf Lambert #pragma target 3.0 sampler2D _MainTex; sampler2D _BumpMap; fixed4 _Color; struct Input { float2 uv_MainTex; float2 uv_BumpMap; }; void surf (Input IN, inout SurfaceOutput o) { fixed4 tex = tex2D(_MainTex, IN.uv_MainTex); o.Albedo = tex.rgb * _Color.rgb; o.Alpha = tex.a * _Color.a; o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap)); } ENDCG } FallBack "Legacy Shaders/Diffuse" }
编译指令
编译指令最重要的作用是指明该表面着色器使用的“表面函数”和"光照函数",格式如下:
#pragma surface surfaceFunction lightModel [optionalparams]
#pragma指明该编译指令是个表面着色器,在它后面是表面函数和光照模型,还有一些可选参数。
表面函数
表面着色器的优点在于抽像出了“表面”这一概念。和顶点/片元着色器不同的是,一个对象的表面属性定义了它的反射率、光滑度、透明度等。而surfaceFunction用于定义这些表面属性。sunfaceFunction通常名为surf的函数它的函数格式是固定的:
void surf(Input IN,inout SurfaceOutput o) void surf(Input IN,inout SurfaceOutputStandard o) void surf(Input IN,inout SurfaceOutputStandardSpecular o)
光照函数
指定物体表面模拟的光照效果,内置的有基于物理光照的Standard和StandardSpecular,简单光照的Lambert和BlinnPhong,也可以自己定义光照。
其他可选
例如是否开启透明度混合/测试、自定义修改顶点(vertex:VertexFunction)、最后颜色修改(finalcolor:ColorFunciton),例如我们可以修改顶点位置来实现顶点动画等。
阴影 :例如可以使用addshadow或fullforwardshadows等
光照:例如使用noambient告诉Unity不要响应任何逐顶点光照,novertexlight不要应用任何顶点光照等…
控制代码生成:默认会使用前向渲染、延迟渲染路径这些导致文件较大。可以使用exclude_path:deferred、exclude_path:forward等不要为后写路径生成代码。
表面着色器的指令参数很多,慢慢探讨吧。
- Shader学习的基础知识(四)法线贴图
- [Unity3d]Shader 着色器 学习前了解知识
- [Shader 着色器] 学习前了解知识
- Shader学习的基础知识(五)渐变纹理
- Unity Shader 学习笔记(十三)表面着色器的顶点动画
- [Unity3d]Shader 着色器 学习前了解知识
- [Unity3d]Shader 着色器 学习前了解知识
- Unity Shader 学习笔记(29) 表面着色器(Surface Shader)
- [Shader 着色器] 学习前了解知识
- [Shader 着色器] 学习前了解知识
- C++ Primer 学习笔记-基础知识(二)
- 学习C#基础知识(四)
- 今天学习了分布式服务框架的基础理论知识(一)
- Java基础知识学习之路-04-第三章-数据类型和运算符
- 学习Java基础的一些知识(3)Java的一些数据类型
- 四、oc中分类的基础知识学习
- C++学习笔记(一)--基础知识sizeof用法
- 音频视频基础知识学习——音、视频技术
- java学习笔记(计算机基础知识)
- MATLAB 学习(一)指令窗等基础准备知识