zoukankan      html  css  js  c++  java
  • 【Unity Shaders】学习笔记——SurfaceShader(二)两个结构体和CG类型

    【Unity Shaders】学习笔记——SurfaceShader(二)两个结构体和CG类型


    转载请注明出处:http://www.cnblogs.com/-867259206/p/5596698.html

    写作本系列文章时使用的是Unity5.3。
    写代码之前:

    1. 当然啦,如果Unity都没安装的话肯定不会来学Unity Shaders吧?

    2. 阅读本系列文章之前你需要有一些编程的概念。

    3. 在VS里面,Unity Shaders是没有语法高亮显示和智能提示的,VS党可以参考一下这篇文章使代码高亮显示,也可以下载shaderlabvsNShader之类的插件使代码高亮显示。

    4. 这是针对小白的Unity Shaders的基础知识,如果你已经有了基础或者你是大神,那么这些文章不适合你。

    5. 由于作者水平的局限,文中或许会有谬误之处,恳请指出。


    上一篇文章里我们已经见过了一个简单的surface shader程序了,这是Unity自动生成的。
    上一篇,我们还没有讲解CG的类型。
    我们在程序里看到了Sampler2Dfloat2halffixed4几个类型,是不是觉得有些眼熟?C语言里有float这个类型,那这个float2是什么类型?听我详细道来:
    CG支持7种数据类型:

    float 32位浮点数
    half  16位浮点数
    int   32位整型数
    fixed 12位定点数
    bool  布尔数据
    sampler 纹理对象的句柄,公有sampler, sampler1D, sampler2D, sampler3D, samplerCUBE, 和 samplerRECT 六种
    string 字符,其实没有必要在CG中用到字符
    向量类型 float2就是2元的float类型的向量,fixed4就是4元的fixed类型的向量
    向量最长不超过4元
    

    此外,CG还支持矩阵数据类型,比如:

    float2×4 matrix;  // 表示2×4阶矩阵,包含8个float类型数据
    

    那么定义变量的时候怎么知道该用哪种类型呢?有个简单的记忆原则:

    • 精度够用就好

    • 颜色和单位向量,使用fixed

    • 其他情况,尽量使用half(即范围在[-6万, +6万]内、精确到小数点后3.3位);否则才使用float。


    下面介绍surface shader的输入输出结构:
    输入结构就是存储输入的信息,输出结构就是存储要输出的信息,也就是我们的眼睛会看见的效果。
    输入结构通常是这样的:

    struct Input
    {
        float2 uv_MainTex;
    }
    

    里面保存着纹理坐标。纹理坐标必须命名为“uv”+"纹理名称",uv_MainTex就是名为_MainTex的纹理的uv坐标。

    Input中还可以放入额外的变量,比如下面几种:
    float3 viewDir - will contain view direction, for computing Parallax effects, rim lighting etc.
    为了计算视差、边缘光照等效果,Input需要包含视图方向。
    
    float4 screenPos - will contain screen space position for reflection effects. Used by WetStreet shader in Dark Unity for example.
    屏幕坐标。 为了获得反射效果,需要包含屏幕坐标。比如在Dark Unity例子中所使用的 WetStreet着色器。
    
    float3 worldPos - will contain world space position.
    世界坐标。
    
    float3 worldRefl - will contain world reflection vector if surface shader does not write to o.Normal. See Reflect-Diffuse shader for example.
    世界中的反射向量。如果表面着色不写入o.Normal, 将包含世界反射向量。 
    
    float3 worldNormal - will contain world normal vector if surface shader does not write to o.Normal.
    世界中的法线向量。如果表面着色器不写入法线(o.Normal)参数,将包含这个参数。
    
    float3 worldRefl - will contain world reflection vector if surface shader writes to o.Normal. To get the reflection vector based on per-pixel 
    normal map, use WorldReflectionVector (IN, o.Normal). 世界反射向量。如果表面着色写入到o.Normal,将包含世界反射向量 。为了得到基于每个像素的法线贴图的反射向量, 使用WorldReflectionVector的(IN输入, o.Normal)。 float3 worldNormal
    - will contain world normal vector if surface shader writes to o.Normal. To get the normal vector based on per-pixel normal
    map, use WorldNormalVector (IN, o.Normal). 世界法线向量。如果表面着色写入到o.Normal, 将包含世界法线向量。为了得到基于每个像素的法线贴图的法线向量,请使用世界法线向量((IN输入, o.Normal)

    surface shader的默认的几种输出结构如下,输出结构也是可以自定义的。

    struct SurfaceOutput
    {
        fixed3 Albedo;  // 漫反射颜色
        fixed3 Normal;  // 切线空间法线,如果赋值的话
        fixed3 Emission; // 自发光颜色
        half Specular;  // 高光强度,范围是0-1
        fixed Gloss;    // specular intensity
        fixed Alpha;    // 透明度
    };
    
    struct SurfaceOutputStandard
    {
        fixed3 Albedo;      // 基础 (漫反射或镜面反射) 颜色
        fixed3 Normal;      // 切线空间法线,如果赋值的话
        half3 Emission;     // 自发光颜色
        half Metallic;      // 0=非金属, 1=金属
        half Smoothness;    // 0=粗糙, 1=光滑
        half Occlusion;     // 遮挡(默认1)
        fixed Alpha;        // 透明度
    };
    
    struct SurfaceOutputStandardSpecular
    {
        fixed3 Albedo;      // 漫反射颜色
        fixed3 Specular;    // 镜面反射颜色
        fixed3 Normal;      // 切线空间法线,如果赋值的话
        half3 Emission;     // 自发光颜色
        half Smoothness;    // 0=粗糙, 1=光滑
        half Occlusion;     // 遮挡(默认1)
        fixed Alpha;        // 透明度
    };
    

    下一篇就要开始写Shader了。


    感觉这篇有点像reference……

  • 相关阅读:
    基于Dubbo的压测调优实例
    R语言之Apriori算法应用
    Linux中的用户和组
    R语言中的循环及其扩展:iter和foreach
    R在Windows下连接Oracle数据库
    R语言之机器学习程序包(更新)
    R语言之数据结构
    windows环境下node安装教程(超详细)
    windows环境下elasticsearch安装教程(超详细)
    MongoDB分片介绍
  • 原文地址:https://www.cnblogs.com/-867259206/p/5596698.html
Copyright © 2011-2022 走看看