码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-06-18 19:54:24      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

【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,视线方向。更多的知识等以后会用到的时候再来详细说明。
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;        // 透明度
};

呼,终于讲完了surface shader语法方面的基础,为了让大家看程序的时候不会为一些类型、变量所困惑,下一篇就要开始写代码啦,终于要开始写shader啦。


感觉这篇有点像reference……

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

标签:

原文地址:http://www.cnblogs.com/-867259206/p/5596698.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!