博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Unity中表面着色器的使用
阅读量:5239 次
发布时间:2019-06-14

本文共 3890 字,大约阅读时间需要 12 分钟。

写shader其实就是在两个工位顶点shader工位和着色shader工位插入代码,供GPU使用运行

 

表面着色器四个函数的入口

1:表面着色器包括4个函数:

(1): 顶点变换函数;
(2): 表面着色函数;
(3): 光照模型;
(4): 最终颜色修改函数;
2: 表面着色器最终会被编译为一个复杂的顶点着色程序;

 

定义入口函数

1:#pragma surface 入口函数名称 光照模型 [Options]

2: suface 后面跟 表面着色的入口函数 surf(Input IN, inout SurfaceOutput o);

input数据结构:

  Input:包含着色所需要的纹理坐标 uv纹理名字;使用第二张纹理是uv2纹理名字;

  附加数据:
  1:float3 viewDir 视图方向。
  2:float4 color 每个顶点的颜色插值
  3: float4 screenPos 屏幕空间中的位置。
  4: float3 worldPos 世界坐标空间;
  5: float3 worldRef1 世界空间中的反射向量;
  6: float3 worldNormal 世界空间中的法线向量;
  7: float3 worldRef1; INTERNAL_DATA 世界坐标反射向量, 但必须表面着色写入o.Normal参数;
  8: float3 worldNormal; INTERNAL_DATA 世界坐标法线向量, 但必须表面着色写入o.Normal参数;

 

SurfaceOutput 结构体:

  SurfaceOutput:

  1: half3 Albedo: 漫反射的颜色值;

  2: half3 Normal: 法线坐标;

  3: half3 Emission; 自发光颜色;

  4: half Specular;  镜面反射系数;

  5: half Gloss; 光泽系数;

  6: half Alpha; 透明度系数;

  SurfaceOutputStandard:

  7: half Smoothness;    // 0=粗糙, 1=光滑

  8: half Metallic;    // 0=非金属, 1=金属

  SurfaceOutputStandardSpecular:

      fixed3 Albedo;     

      fixed3 Specular;    

      fixed3 Normal;     

      half3 Emission;  

      half Smoothness;    // 0=粗糙, 1=光滑  

      half Occlusion;  // 遮挡(默认1)  

 

      fixed Alpha;  

 

3: 光照模型:

(1)系统内置 Lambert(漫反射光照) BlinnPhong (高光光照),要使用Lambert,就要搭配用SurfaceOutput,不能用SurfaceOutputStandard
(2)自定义光照: 名字为Name
half4 Lighting<Name>(SurfaceOutput s, half3 lightDir, half atten);//lightDir是当前顶点到光的光源的方位向量,atten是一个衰减值
half4 Lighting<Name>(SurfaceOutput s, half3 lightDir, half3 viewDir, half atten);
half4 Lighting<Name>(SurfaceOutput s, half4 light);
可选参数:
4: vertex: name vertex入口函数:
void <Name> (inout appdata_full v) 只需改顶点着色器中的输入顶点数据;
half4 <Name>(inout appdata_full v, out Input o) 修改输入顶点数据,以及为表面着色器传递数据;
5: finalcolor: name 最终颜色修改函数:
void <Name>(Input IN, SurfaceOutput o, inout fixed4 color);

 

 

其它可选参数

1:alpha: Alpha 混合模式,用户半透明着色器;

2: alphatest: varirableName Alpha测试模式,用户透明镂空着色器。
3: exclude_path:prepass 使用指定的渲染路径;
4: addshadow: 添加阴影投射器和集合通道;
5: dualforward: 将双重光照贴图用于正向渲染路径中;
6: fullforwardshadows 在正向渲染路径中支持的所有的阴影类型;
7: decal: add 附加印花着色器;
8: decal: blend 附加半透明印花着色器;
9: softvegetation 使用表面着色器,仅在Soft Vegetation 开启时被渲染;
10: noambient 不使用任何光照
11: novertexlights 在正向渲染中不适用球面调和光照或逐点光照;
12: nolightmap 在这个着色器上禁用光照贴图;
13: nodirlightmap 在这个着色器上禁用方向光照贴图;
14: noforwardadd 禁用正向渲染添加通道;
15: approxview: 对于有需要的着色器,逐顶点而不是逐像素计算规范化视线方向。
16: halfasview: 将半方向传递到光照函数中。

 

 

表面着色器实例

1.创建Unity工程目录

2.在resources文件夹下面创建一个shaders文件夹

3.在shaders里面创建一个create---->shader---->standard surface shader,重命名MyShader

4.把鱼的资源复制进resources,jinqiangyu.fbx,jinqiangyu.png

5.把鱼拖进场景,设置鱼的材质球的shader为custom---->MyShader

6.打开MyShader:

Shader "Custom/MyShader" {    // 绑定到我们的编辑器上;    Properties {        _Color ("Color", Color) = (1,1,1,1)        _MainTex ("Albedo (RGB)", 2D) = "white" {}        _Glossiness ("Smoothness", Range(0,1)) = 0.5        _Metallic ("Metallic", Range(0,1)) = 0.0    }    SubShader {        Tags { "RenderType"="Opaque" }        LOD 200                CGPROGRAM // Cg代码的开始        // Physically based Standard lighting model, and enable shadows on all light types        #pragma surface surf Standard fullforwardshadows  //表面着色器的入口函数的声明,如果要使用Lambert,后面就要搭配用SurfaceOutput,不能用SurfaceOutputStandard        // Use shader model 3.0 target, to get nicer looking lighting        #pragma target 3.0        sampler2D _MainTex;        struct Input {            float2 uv_MainTex; // uv纹理的名称,命名必须是uv_,因为是Input类型的,后面的名称也是已经定义好的纹理,不是随便写的        };        half _Glossiness;//要使用它就要重新声明一下        half _Metallic;        fixed4 _Color;// 表面着色的入口函数        void surf (Input IN, inout SurfaceOutputStandard o) {                        fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;//IN必须是大写的            o.Albedo = c.rgb;                        o.Metallic = _Metallic;            o.Smoothness = _Glossiness;            o.Alpha = c.a;        }        ENDCG   // Cg代码的结束    }    // 降级    FallBack "Diffuse"}

7.调节鱼材质的属性,里面有滑动条可以调着色器的效果,

转载于:https://www.cnblogs.com/HangZhe/p/7227766.html

你可能感兴趣的文章
Java内部类详解
查看>>
【hdu 1429】胜利大逃亡(续)
查看>>
图论-次短路求法
查看>>
What's New for Visual C# 6.0
查看>>
ExtJs学习笔记之ComboBox组件
查看>>
关于收费软件
查看>>
getopt_long
查看>>
TensorFlow MNIST CNN 代码
查看>>
javascript之Style物
查看>>
JSON跨域解决方案收集
查看>>
SSH框架整合总结
查看>>
图的深度优先遍历
查看>>
C# 之 提高WebService性能大数据量网络传输处理
查看>>
md5sum命令详解
查看>>
[bzoj1004] [HNOI2008] Cards
查看>>
应该是实例化对象的没有对属性赋值时,自动赋值为null,但不是空指针对象引用...
查看>>
原生HttpClient详细使用示例
查看>>
几道面试题
查看>>
Factory Design Pattern
查看>>
python中贪婪与非贪婪
查看>>