Unity Shader 学习笔记—图形基础/CG语法

图形编程历史

渲染流水线

目前最新的可编程图形硬件支持功能:

  • 支持顶点和片段的可编程能力
  • 支持IEEE32位的浮点运算(IEEE32是国际电工委员会置顶的浮点书表示方式,主要内容是用四个字节来表示浮点数,可以表示的数据的负数范围是(-22)128~-2127,2^-127~22^128)
  • 支持四元向量和四阶矩阵
  • 提供分支和循环的控制语句
  • 具有高带宽的内存处理能力
  • 支持1D,2D,3D的纹理查询和使用能力,而且速度非常快
  • 支持绘制到纹理功能

渲染流水线

  • 含义: 计算机需要从一系列的顶点数据、纹理等信息出发、生成(或者说渲染)一张二维图像的过程。
  • 渲染流程分为三个阶段
    • 应用程序阶段:(CPU)
      • 准备数据 eg.摄像机的位置、�视椎体、场景中的模型和光源等等
      • culling 粗粒度剔除 eg.将不可见的物体剔除
      • 输出 输出渲染所需的几何信息(点、线、三角面),即渲染图元
    • 几何阶段:(GPU)
      • 处理�渲染图元进行逐顶点、逐多边形的操作。顶点坐标转换到屏幕空间。
      • 输出屏幕空间的二维顶点坐标、每个顶点对应的深度值、着色等相关信息。
    • 光栅化阶段�:(GPU)
      • 对上阶段的数据进行插值,再进行逐像素的处理。

CPU与GPU之间的通信

  • CPU�流水线(即应用阶段)
    • 把数据加载到显存里
    • 设置渲染状态
    • 调用Draw Call(发起方是CPU,接收方是GPU)
  • GPU流水线(即几何阶段和光栅化阶段)
    [图片上传失败...(image-260204-1513936425700)]
  • 顶点着色器 : 必选,可编程,通常用于实现顶点坐标的变换,�计算顶点颜色。
  • 曲面细分着色器 :可选,用于细分图元。
  • 几何着色器 :可选,用于逐图元的着色操作,或者用于产生更多的图元。
  • 裁剪 : 可配置,将不是摄像机视野中的顶点裁剪掉。
  • 屏幕映射 : 不可编程,不可配置。把每个图元的坐标转换到屏幕坐标系。
  • 三角设置三角形遍历阶段都是固定函数的阶段。
  • 片元着色器 :可编程,用于�实现逐片元的着色操作。
  • 逐片元操作 : 可配置,eg.颜色修改,深度缓,冲进行混合等。

三种语言:

  • OpenGl的GLSL
  • Direct3D的HLSL
  • NVIDIA的CG(CG编写的可同时兼容�OpenGL和Direct平台)

GPU流水线的两个重要阶段

  • 顶点着色器
    • 输入: GPU前端模块提取图元信息(顶点位置,法线向量,纹理坐标(uv))等。
    • 操作: 顶点坐标空间转换,法向量空间转换,光照计算等(现在光照计算一般在片段着色器,比较细),然后将计算好的数据传入指定寄存器中。
  • 片元着色器
    • 输入:顶点着色器传入的数据。
    • 操作:光照计算,uv扰动,纹理采样等,最后输出当前片段的颜色给光栅化阶段(片段着色器是对每个独立的颜色进行操作的)。

数学基础

推荐《3D数学基础:图形与游戏开发》

CG语言基础

  • CG语言的特性:
    Cg是一种类C的语言,他沿用了大量的C语言特性,但是也有不同之处。Cg语言是脚本性语言,不能编译,调试和断点;并且Cg语言的主要用途是绘制像素颜色到屏幕上,他不能处理文字类的内容。Cg语言对单精度浮点的数据类型是非常敏感的;Cg语言因为GPU的并发特性所以导致Cg语言的所有执行过程是并发式的;
  • CG语法
    • 基础数据类型 :
      • float : 32位浮点数据
        float _Angle = 1.0
        
      • half : 16位浮点数据
        half _Angle = 1.0
        
      • int : 32位整形数据
        int _Angle = 1
        
      • fixed : 12位浮点数据
        fixed _Angle = 1
        
      • bool : �布尔数据,用于判断
        if(_Angle == 0)
        {
          colors = diffuses.rgb;
        }
        
      • Sampler 纹理对象,6类 : Sampler,sampler1D,sampler2D,sampler3D,samplerCUBE和samplerRECT
        sample2D _Diffuse;
        
    • 特殊的数据类型
      • 向量 : 一共拥有4种维度的向量,1-4之间
        float3 a = float3(0,1,2);
        
      • 矩阵 : 行和列都不得大于4和不得小于1
        float2*2 a = {sin@,0,1,3};
        
        矩阵在赋值的时候一定要人为的分开行与行之间的关系,但是程序只认识顺序的赋值
      • 数组 : 因为CG是显卡操作语,没有内存,所以声明的时候要制定大小
        float2 b[2];
        int arrayLen = b.length; // 结果是2
        float m[3][4];
        arrayLen = m.length;// 结果是3;
        arrayLen = m[1].length;// 结果是4;
        
      • 结构体 : 数据封装作用
        struct a2v {
          float4 vertex : POSITION;
          float3 normal : NORMAL;
          float4 texcoord : TEXCOORD0;
          };
        
      • 表达式和控制语句
        • 关系操作符 :<,>,<=,>=,!=,==,
        • 逻辑操作符 :&&,||,!
        • 数学操作符 :+,—,*,/,%
        • 移位操作符 :>>
          int2 a = int2(0.0,0.0); 
          int2 b = a>>1; 
          
        • Swizzle操作符:
          float4(a, b, c, d).xyz    等价于  float3(a, b, c) 
          
        • 控制流语句 :if ,if-else while ,for,break
          • 点操作�符:只针对向量和结构
            v2f o;
              o.pos = UnityObjectToClipPos(v.vertex);
            
      • 行参修饰词:
        • in: 表示当前行参是只能输入的;
        • out:表示当前行参用来输出数据的;
        • inout: 表示可以进行输入和输出;
      • 离散数据图元信息:uniform
        • 只读性,只要标有uniform标签的变量,这个变量我们就不能初始化也不能修改其内容;
        • 使用范围特性,只能存在于入口函数的行参上或者是全局的变量身上;
        • 他只能支持引擎向着色器传入的数据,不能向外提交数据;
    • 语义
      [图片上传失败...(image-525f9a-1513936425700)]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容