写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) = (,,,)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(,)) = 0.5
_Metallic ("Metallic", Range(,)) = 0.0
} SubShader {
Tags { "RenderType"="Opaque" }
LOD 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.调节鱼材质的属性,里面有滑动条可以调着色器的效果,

关于Unity中表面着色器的使用的更多相关文章

  1. Unity Shader入门精要学习笔记 - 第17章 Unity的表面着色器探秘

    转自 冯乐乐的<Unity Shader 入门精要> 2010年的Unity 3 中,Surface Shader 出现了. 表面着色器的一个例子. 我们先做如下准备工作. 1)新建一个场 ...

  2. UnityShader 表面着色器简单例程集合

    0.前言 这些简单的shader程序都是写于2015年的暑假.当时实验室空调坏了,30多个人在实验室中挥汗如雨,闷热中学习shader的日子还历历在目.这些文章闲置在我个人博客中,一年将过,师弟也到了 ...

  3. unity中使用的着色器语言

    在unity中,着色器编程使用了一列列的HLSL语言变种(也叫作Cg,但是大部分实际上两者都是一样的). 目前,为了在不同平台下保持最好的跨平台性, 取样贴图时,最好使用DX9风格 的HLSL. 着色 ...

  4. Unity中的定时器与延时器

    JavaScript中的定时器与延时器,分别是 setInterval.setTimeout,对应的清理函数是:clearInterval.clearTimeout. 而在Unity中,则分别是:In ...

  5. 关于Unity中的刚体和碰撞器的相关用法(二)

    在关于Unity中的刚体和碰撞器的相关用法(一)的基础上 有一个plane平面,一个ball球体,都挂了碰撞器,ball挂了刚体Rigidbody,写了一个脚本ball挂载在球体上,球体从空中落下装机 ...

  6. Unity表面着色器

    表面着色器和之前无光照着色器不同,其中没有顶点着色器和片元着色器,而增加了光照函数: 接下写了一个求两个贴图的光照效果 两个贴图做插值运算: Shader "Custom/SurfaceSh ...

  7. [Unity] Shader(着色器)输入输出和语义

    在Unity5.x后, 已经支持了基于物理的光照模型,也就是常说的次时代引擎所必须具备的功能. 如果在Properties使用2D,CG里要用sampler2D,代表使用的是2维纹理 如果在Prope ...

  8. 【unity shaders】:Unity中的Shader及其基本框架

    shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...

  9. 深入了解Unity中LineRenderer与TrailRenderer

    LineRender和TrailRender是两个好东西,很多Unity拖尾特效都会使用到它们.一些简单的介绍可以参见官方的API文档.在这里探讨一下它们具体的渲染方式,而后给出一些Shader以便更 ...

随机推荐

  1. ios block一定会犯的几个错误

    贴几段斯坦福大学关于gcd的代码,这段代码逐步演示了如何修正错误,其中用到的既是串行队列   1.这个是原始代码 - (void)viewWillAppear:(BOOL)animated { NSD ...

  2. html5自定义数字键盘

    原理:使用div模拟输入框,避免手机原生键盘弹出,键盘使用div模拟,点击事件使用js控制,光标闪烁使用css模拟,具体代码如下: <!doctype html> <html lan ...

  3. linux命令(41):文件和文件夹的颜色

    各个颜色的文件分别代表的是:蓝色表示目录:绿色表示可执行文件:红色表示压缩文件:浅蓝色表示链接文件:灰色表示其它文件:红色闪烁表示链接的文件有问题了:黄色是设备文件,包括block, char, fi ...

  4. iOS-图片浏览器

    // //  ViewController.m //  19-图片浏览器 // //  Created by hongqiangli on 2017/7/31. //  Copyright © 201 ...

  5. Python3回文相关算法小结

    [本文出自天外归云的博客园] 总结一下关于回文相关的算法: 判断字符串本身是否是回文 返回字符串中的所有子串 找到字符串中包含的所有回文 判断字符串中是否包含回文 将字符串变成一个不包含回文的字符串 ...

  6. 无刷新文件上传 利用iframe实现

    效果如图: 示例是基于asp.net mvc实现的 html代码: <form id="form2" name="form2" class="f ...

  7. 遍历目录下的所有文件-os.walk

    #coding:utf-8 import os for root,dirs,files in os.walk("D:"): for fileItem in files: print ...

  8. web开发经验

    图片显示不全 网站进行了迁移,更换了新框架,结果出现了图片显示不全的问题,后来发现是nginx权限问题 curl 无报错,无返回 有可能是url错误,而无服务器对错误的url返回空,没返回错误

  9. hashCode()方法与equals()方法的说明

    1,一般我们自己用时,只使用equals()方法,用于判断两个对象是否是业务上等价的.2,在重写equals()方法时,强烈推荐也要重写hashCode()方法,因为有的集合用到了hashCode() ...

  10. PHP——大话PHP设计模式——基本设计模式(工厂模式、单例模式、注册器模式)