Unity3D for VR 学习(8): Unity Shader概述
从西安到北京高铁上,一位VR老外团队的华人leader对VR技术做了画龙点睛:
“3D游戏的核心部分在Render, 国内很多团队美术、程序中间缺失严重。所以3d游戏做不好。 VR这块更是至关重要。”
故,欲VR,先Shader吧。
1 CG规范: 计算机图形学(英语:computer graphics)
在Windows下图像渲染是DirectX; 在Linux下图形渲染是OpenGL;在苹果下新出的Metal渲染。而作为Unity3D程序,跨平台的特性则无须对这些平台一一掌握,仅需要从CG规范入手即可。
![]()
CGPROGRAM…ENDCG这样一个代码块中,这是一段CG程序,它会帮助程序发布Unity3D到Android、Windows、IOS时候,转换为不同渲染底层功能的。
2 Unity3D Shader分类
- 表面着色器(Surface Shader) – Unity推荐的Shader,有光照需要的必须使用surface Shader。
- 片段着色器(Fragment Shader) – 更偏向底层一些,也比较难写。
- 固定管线着色器(Fixed Function Shader) – 目前废弃不用,仅针对老显卡。Vr时代用不着。
- 从上面看到Unity实际上在主推Standard Surface Shader,在Unity5下,提供了如下4中Shader模板。
![]()
渲染管线:从数据到最终成像的过程。
![]()
3 Unity3D 光照模型
光照模型想说明的事情是当光照到一个物体表面后,视角不同看到不同的光特效,如常规的漫反射、高光、镜面反射光等。 实际上也是在模拟真实情况下人看物体的视角效果,同样的3D模型,添加不同的光照模型效果会截然不同。
如果物体是不透明的,则物体表面呈现的颜色仅有其反射光决定,通常把反射光考虑成环境反射光(Ambient Light)、漫反射光(DIffuse Light)和镜面反射光(Specular Light)三个分量的组合。
4 Unity3D shader Tips
C#编码是在CPU角度;而Shader编码是在GPU角度。
看了几天书后,发现Shader真的很酷,可以做很多CPU下编程做不到(很难)的事情。
例如半透明、UV动画、遮挡剔除、色彩斑斓的blend等。
- uv动画:在shader中用uv缩放、uv偏转、uv旋转。如河流流水动画、UV精灵动画。
- 遮挡剔除:cull back\front\off. 其中VR 360就用到了《Unity3D for VR 学习(7): 360°全景照片》
- 半透明–ZTest:用在自己GameObject上
- 半透明—ZWriter:用在遮挡物GameObject上
- AlphaTest(DX 11不支持) 半透明的花草树木效果
- Blender混合:如透过有颜色的玻璃,可以实现色彩斑斓的透视效果
- Fog:全局fog、局部fog
5 Unity3D Shader 代码片段
SurfaceOutput结构体的定义如下
struct SurfaceOutput {
half3 Albedo;//像素的颜色
half3 Normal;//像素的法向值
half3 Emission;//像素的发散颜色
half Specular;//像素的镜面高光
half Gloss;//像素的发光强度
half Alpha;//像素的透明度
};
表面Shader代码片段
Shader"Custom/Diffuse Texture"{
Properties {
_MainTex ("Base (RGB)", 2D) ="white"{}
}
SubShader {
Tags {"RenderType"="Opaque"}
LOD 200
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack"Diffuse"
}
CG语法,可参看《GPU 编程与CG 语言之阳春白雪下里巴人.pdf》
Unity3D for VR 学习(8): Unity Shader概述的更多相关文章
- Unity3D for VR 学习(9): Unity Shader 光照模型 (illumination model)
关于光照模型 所谓模型,一般是由学术算法发起, 经过大量实际数据验证而成的可靠公式 现在还记得2009年做TD-SCDMA移动通信算法的时候,曾经看过自由空间传播模型(Free space propa ...
- Unity3D for VR 学习(10): Unity LOD Group 组件
LOD (Level of Detail), 远小近大思想. LOD,在Unity中是用到了空间换时间的优化方法:即程序加载2套模型,导致包会增大:在运行时刻,远处的用面数少的模型–模糊一些,近处用面 ...
- Unity3D for VR 学习(7): 360°全景照片
在VR应用中,有一个相对简单的虚拟现实体验,那就是360°全景照片浏览器, 他可以使得手机拍照的”全景”照片, 得以”恢复”当时拍照的场景全貌, 这个创意的确比单纯的2d图片更有震撼力一些,故本文 ...
- Unity3D for VR 学习(6): 再次温故知新-3D数学
一年前,系统学习过3D数学,并记录了一篇博客<C#程序员整理的Unity 3D笔记(十):Unity3D的位移.旋转的3D数学模型>. 一年后,再次温习之. 坐标系:Unity3D使用左手 ...
- Unity3D for VR 学习(2): 暴风魔镜框架探索
学习一个新技术,有三个法宝: 法宝1: 掌握厂家提供的用户API手册 法宝2: 掌握厂家提供的demo样例 法宝3:<每个研发人员都应树立的一个demo模式> 故,学习魔镜4技术,亦如是也 ...
- Unity3D for VR 学习(3): 暴风魔镜PC Input小改造–自己动手、丰衣足食
在做手游的时候,80%时间是在PC调试的,例如业务逻辑.AI算法.核心玩法等. 拿到魔镜提供的demo,晕了,必须得安装到Android机器上,才能调试,究其原因,有三: 需要用到手机陀螺仪 需要用到 ...
- Unity Shader概述
一.概述 在Unity中需要配合使用材质和Unity Shader才能达到需要的效果.常见的流程:(1)创建一个材质:(2)创建一个Unity Shader,并把它赋给创建的材质:(3)把材质赋给要渲 ...
- Unity3D for VR 学习(1): 又一个新玩具 暴风魔镜 4(Android)
2016年伊始,有了VR虚拟现实硬件设备: 暴风魔镜4–好奇者的新玩具 . 2015年下半年的朋友圈中各种VR.AR的新闻层次不穷,搞的我也心痒痒的:好歹咱也是职业的Unity3D程序员,高大上的O ...
- Unity3D for VR 学习(4): 自绘摄像机的视口区域锥体
在Unity Editor下,当选择Camera组件后,可呈现出Camera视口区域锥体,非常方便.但是当选择其他物体,如Cube后,就无法得知是否在Camera市口区内了,这里我找到了雨松MOMO的 ...
随机推荐
- C#之Lambda不得不说的用法
由于我才开始接触代码的时候遇到循环问题都是用foreach和for,慢慢就成了习惯,不愿意用其他简便的方式,偶然发现lambda能代替循环而且简便了很多.当然我用lambda也不是简便,更多是不用不行 ...
- 在Notepad++中为Python配置编译环境
方法1:按下F5 输入d:\Python25\python.exe "$(FULL_CURRENT_PATH)" 其中"d:\Python25\python.exe&qu ...
- nuget必备插件(待续)
DevLib.ExtensionMethods Extend Z.ExtensionMethods
- ideal快捷键
百度一搜索,发现很多快捷键说明,我但是有些说得不对的,我列出来的这些快捷键,有一部分是需要你百度好久,甚至百度一上午才能搜索出来的,并且戴着老花镜.这样的话,在实际工作者,对于初级程序员来说,成本太高 ...
- java.util.MissingResourceException: Can't find bundle for base name init, locale zh_CN问题的处理
一.问题描述 项目开发使用的是SSM框架,项目那个正常运行,开发一个新功能后,添加了一些配置文件,再重新运行项目抛出异常,找不到name为init的bean. 二.异常信息详细 六月 30, 2018 ...
- PHPCMS的产品筛选功能
如下图所示功能: 首先,用下面这些代码替换掉phpcms/libs/functions/extention.func.php的内容 <?php /** * extention.func.php ...
- Elasticsearch.Net 异常:[match] query doesn't support multiple fields, found [field] and [query]
用Elasticsearch.Net检索数据,报异常: )); ElasticLowLevelClient client = new ElasticLowLevelClient(settings); ...
- 高可用Kubernetes集群-8. 部署kube-scheduler
十.部署kube-scheduler kube-scheduler是Kube-Master相关的3个服务之一,是有状态的服务,会修改集群的状态信息. 如果多个master节点上的相关服务同时生效,则会 ...
- JAVA学习笔记--字符串概述
一.String类 String类代表字符串,是由字符构成的一个序列.创建String对象的方法很简单,有以下几种: 1)用new来创建: String s1 = new String("m ...
- Python基础灬列表&字典生成式
列表生成式 # 求1~10偶数的平方 # 1.常规写法 a_list = [] for i in range(1, 11): if i % 2 == 0: a_list.append(i * i) p ...