Unity3D for VR 学习(8): Unity Shader概述
2016-04-07 18:51
239 查看
从西安到北京高铁上,一位VR老外团队的华人leader对VR技术做了画龙点睛:
“3D游戏的核心部分在Render, 国内很多团队美术、程序中间缺失严重。所以3d游戏做不好。 VR这块更是至关重要。”
故,欲VR,先Shader吧。
CGPROGRAM…ENDCG这样一个代码块中,这是一段CG程序,它会帮助程序发布Unity3D到Android、Windows、IOS时候,转换为不同渲染底层功能的。
片段着色器(Fragment Shader) – 更偏向底层一些,也比较难写。
固定管线着色器(Fixed Function Shader) – 目前废弃不用,仅针对老显卡。Vr时代用不着。
从上面看到Unity实际上在主推Standard Surface Shader,在Unity5下,提供了如下4中Shader模板。
渲染管线:从数据到最终成像的过程。
如果物体是不透明的,则物体表面呈现的颜色仅有其反射光决定,通常把反射光考虑成环境反射光(Ambient Light)、漫反射光(DIffuse Light)和镜面反射光(Specular Light)三个分量的组合。
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
表面Shader代码片段
CG语法,可参看《GPU 编程与CG 语言之阳春白雪下里巴人.pdf》
“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 学习(7): 360°全景照片
- Unity3D for VR 学习(6): 再次温故知新-3D数学
- Unity3D for VR 学习(4): 自绘摄像机的视口区域锥体
- Unity3D for VR 学习(3): 暴风魔镜PC Input小改造–自己动手、丰衣足食
- Unity3D for VR 学习(2): 暴风魔镜框架探索
- Unity3D for VR 学习(1): 又一个新玩具 暴风魔镜 4(Android)
- [Unity游戏开发]向量在游戏开发中的应用(三)
- Unity3D shader 人物被选中光环/技能范围光环
- 3dsMax导入Unity3d要注意的问题
- unity3d创建材质时,无法添加材质贴图的解决方法
- Unity后期处理-抗锯齿
- Unity Drawcall 优化
- 【unity小技巧之三】添加自定义拓展,动态向某个类注入静态函数
- Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条(三十一)
- unity中使用usafe代码的设置
- [置顶] Unity开发规范(个人习惯,仅供参考)
- 使用Unity5.1进行VR开发的配置(最新的未必是最好的!!!)
- Unity脚本获取内存和FPS
- Unity脚本获取内存和FPS
- Unity3d 读写文本