【Unity Shaders】学习笔记——SurfaceShader(一)认识结构
来源:互联网 发布:unity3d圣典下载 编辑:程序博客网 时间:2024/05/04 16:37
【Unity Shaders】学习笔记——SurfaceShader(一)认识结构
写作本系列文章时使用的是Unity5.3。
写代码之前:
1. 当然啦,如果Unity都没安装的话肯定不会来学Unity Shaders吧?
2. 阅读本系列文章之前你需要有一些编程的概念。
1. 在VS里面,Unity Shaders是没有语法高亮显示和智能提示的,VS党可以参考一下这篇文章使代码高亮显示,也可以下载shaderlabvs
或NShader
之类的插件使代码高亮显示。
2. 这是针对小白的Unity Shaders的基础知识,如果你已经有了基础或者你是大神,那么这些文章不适合你。
3. 由于作者水平的局限,文中或许会有谬误之处,恳请指出。
现在我们就要正式开始写Unity Shaders了~
1. 新建Unity Project。2. 在Assets文件夹下新建三个文件夹:Materials、Shaders、Textures。3. 在Shaders文件夹下右键,Create-Shader-Standard Surface Shader,命名为MySurfaceShader。4. 在Materials文件夹下新建Material,命名为MySurfaceShader,将它的Shader改为新建的Shader。5. 新建一个Cube,将新建的材质赋给它。
如果你使用的是低于5.3的版本,你的右键菜单里不会有那么多种Shader,直接创建就好。直接创建的Shader代码和Standard Surface Shader不同,其实就是比Standard Surface Shader更为简化一点,听了解释你就会明白。
右键菜单里总共有四种Shader,分别是Standard Surface Shader、Unlit Shader、ImageEffect Shader、Compute Shader。
Unlit Shader和ImageEffect Shader都是Vertex&Fragment Shader,Compute Shader上一篇文章里讲过。
让我们打开MySurfaceShader看一看。
Shader "Custom/MySurfaceShader" { 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 // Physically based Standard lighting model, and enable shadows on all light types #pragma surface surf Standard fullforwardshadows // Use shader model 3.0 target, to get nicer looking lighting #pragma target 3.0 sampler2D _MainTex; struct Input { float2 uv_MainTex; }; half _Glossiness; half _Metallic; fixed4 _Color; void surf (Input IN, inout SurfaceOutputStandard o) { // Albedo comes from a texture tinted by color fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; o.Albedo = c.rgb; // Metallic and smoothness come from slider variables o.Metallic = _Metallic; o.Smoothness = _Glossiness; o.Alpha = c.a; } ENDCG } FallBack "Diffuse"}
- 第一行代码定义的是Shader在Unity里的路径,在Material的Shader选项的下拉列表里可以看到它,你随时都可以修改它。
- 最后一行表示前面的着色程序显卡不支持的时候就用默认的“Diffuse”。
- Properties括号里的东西就是Shader的属性,打开Material的Inspector,你可以看见他们。语法就是:
变量名 (“检视面板里显示的名称”, 变量类型)= 默认值
注意啦,没有分号的。
这是Unity官网对Properties的介绍。
Unity支持的Properties类型如下:
Color :颜色 Inspector面板里会有一个选取颜色的pickerRange :某范围内的浮点数 Inspector面板里会出现一个Slider2D :2D纹理Rect :创建非2次方边长的纹理Cube :创建Cube Map,也是一种纹理Float :浮点数,和Range的区别就是Range是一个范围内的数,Float是单个数Vector:向量 定义一个四元素的容器
- SubShader是子着色器。Tags{}是标签。LOD是Level of Detail的缩写,这部分会在后面讲到。
- CGPROGRAM和ENDCG里面是CG程序。
#pragma surface surf Standard fullforwardshadows
surface说明是surface shader,可以换成Vertex或Fragment,surf是表面处理函数,在代码段的下面就有一个surf函数。Standard fullforwardshadows是光照模型函数。#pragma target 3.0
设置编译目标Shader model的版本。
后面surf函数里的东西就是重点啦。
在surf函数的上面,将properties里的变量用相同的名称定义一遍。还有一个Input结构体,这是输入结构。
来看看surf函数里都做了什么吧。
先定义了一个4元的定点数c,tex2D是纹理采样函数,第一个参数是纹理,第二个参数是uv坐标,函数的返回值乘以颜色。o这个变量就是着色器会输出的变量,也就是存储着我们眼睛会看到的效果的变量。后面的语句的意思就是将各个值赋给o里的不同值。rgb就是RGB颜色,Albedo是反射值,Metalic是金属值,Smoothness是光滑值,Alpha是透明通道。其实英语好就能看懂这些变量的意思了。(原谅我的翻译)
如果是低于5.3的版本,o 变量的类型是SurfaceOutPut,这两种类型意思是一样的,只不过是不同的结构体。
如果是Standard fullforwardshadows光照模型,则对应用SurfaceOutputStandard,如果是Lambert光照模型(其他版本Unity默认的光照模型),则对应SurfaceOutput。
这就是一个surface shader程序的基本结构。
下一篇文章我会详细介绍CG的类型和Input、SurfaceOutPut这两个结构体。
- 【Unity Shaders】学习笔记——SurfaceShader(一)认识结构
- Unity学习笔记一 Shaders
- 【Unity Shaders】学习笔记——序
- 【Unity Shaders】学习笔记——Shader和渲染管线
- Shader学习笔记(一)认识Unity Shader,Unity Shader的基本结构
- Unity shader随笔记(一)SurfaceShader
- 【Unity Shaders】学习笔记之Shader简介(一)
- 【Unity Shaders】学习笔记之Shader简介(一)
- 小韵游戏开发学习笔记——第四期:认识Unity基本组件(一)
- Unity shader 官网文档全方位学习(一)————Surface Shaders基础及Examples详尽解析
- Unity shader 官网文档全方位学习(一)————Surface Shaders基础及Examples详尽解析
- unity shader 可编程管线(一) 表面着色器SurfaceShader
- 计算机图形学笔记(三),Unity中的surfaceShader
- Unity学习过程(一)——认识Unity游戏引擎
- Unity Shader学习笔记(一) shader的基础结构
- Unity Shaders——屏幕灰度效果(Screen Effect)
- 【Unity Shaders】学习笔记之固定着色器命令(二)
- 【Unity Shaders】学习笔记之固定着色器命令(二)
- sharesdk 登录facebook授权显示登陆错误解决
- Codeforces Round #358 (Div. 2) A
- 为什么我选择使用 Blocks(块)
- 如何给PPT加上页码?
- Codeforces Round #358 (Div. 2) B
- 【Unity Shaders】学习笔记——SurfaceShader(一)认识结构
- Codeforces Round #358 (Div. 2) D. Alyona and Strings
- zookeeper集群搭建
- HTTP协议的状态管理相关知识点
- jni的环境搭建
- 进程间通信之Messenger
- Oracle select case when 语法
- Android启动过程深入解析
- Codeforces Round #358 (Div. 2) C