zoukankan      html  css  js  c++  java
  • 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规范入手即可。

    image

    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模板。

    image

    渲染管线:从数据到最终成像的过程。

    image

    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 backfrontoff. 其中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

  • 相关阅读:
    Junit初级编码(一)第一个Junit测试程序
    关于健身与健美
    spring入门(一)
    HTTP状态301、404、200、304分别表示什么意思
    预处理prepareStatement是怎么防止sql注入漏洞的?
    详解SESSION与COOKIE的区别
    Form表单中method为get和post的区别
    tomcat服务器配置及使用
    ubuntu 14.04 安装mysql server初级教程
    《电路学习第三天》 之 线性稳压电源的设计
  • 原文地址:https://www.cnblogs.com/czaoth/p/5364901.html
Copyright © 2011-2022 走看看