Unity Shader(深入了解顶点片断着色器)

什么是渲染流水线

大致可以分为以下三个大阶段:

  1. 应用阶段(Application Stage):

    就是我们的原始素材准备阶段,包括我们的模型、贴图、相机和光源等,经过这个阶段会将所有素材转换成渲染图元并提交到下一阶段中。这一阶段通常由CPU负责实现。

  2. 几何阶段(Geometry Stage):

    主要是对上一阶段中传过来的数据进行顶点上的加工处理,包括各种矩阵转换与顶点着色等,最终处理完后会输出屏幕空间的二维顶点坐标、顶点着色等信息,并再提交到下一阶段。这一阶段通常是在GPU上进行的。

  3. 光栅化阶段(Rasterizer Stage):

    这一阶段主要是决定每个渲染图元中的哪些像素应该被绘制到屏幕上,它需要对上一阶段得到的逐顶点数据(例如纹理坐标、顶点颜色等)进行插值,然后再进行逐像素处理。这一阶段也是在GPU上运行。

结构体

如上图所示代码,我们在应用阶段把模型的顶点位置信息(float4 vertex : POSITION)传输到了几何阶段,然后在顶点着色器中利用UnityObjectToClipPos矩阵转换把模型顶点坐标从本地转换到齐次剪裁坐标中,并输出转换后的坐标(SV_POSITION)到光栅化阶段中,最后在光栅化的片元着色器中我们给所有像素都返回了一个颜色值(_Color)。

但是仔细思索我们会发现有些局限,如果我想在应用程序阶段传递多个值呢?除了顶点位置还想传递顶点色、uv坐标等信息那要怎么办呢?同时现在从几何阶段的顶点着色器输出的只有顶点坐标(SV_POSITION),如果我也想传递其他值到片元着色器中又该怎么办呢?这个时候就该结构体出场了。

Shader "Unlit/NewUnlitShader"
{Properties{_Color("I am Color", Color) = (1,1,1,1)//依次为RGBA(0-1)}SubShader{pass{CGPROGRAM//#pragma是Unity内置的编绎指令用的命令,在Pass中我们就利用此命令来声明所需要的顶点着色器与片断着色器。#pragma vertex vert//定义顶点着色器,通常情况下会起名为vert。#pragma fragment frag//定义片断着色器,通常情况下会起名为frag  //应用阶段的结构体struct appdata{float4 vertex:POSITION; };//顶点着色器传递给片元着色器的结构体struct v2f{float4 pos:SV_POSITION;};fixed4 _Color;//几何阶段中的顶点着色器v2f vert(appdata v){v2f o;o.pos=UnityObjectToClipPos(v.vertex); return o; } //光栅化阶段中的片断着色器float4 frag():SV_TARGET0{return _Color;}ENDCG          }       }FallBack "DIFFUSE"
}

虽然相较之前的版本显示的代码多了不少,但是这样做更加灵活方便。

现在我们有点新想法了,在结构体中定义多个变量,例如传入顶点的uv坐标,然后根据这个信息我们画一个棋盘格。

Shader "Unlit/NewUnlitShader"
{Properties{_Size("the checker's size",int) = 10//结尾不要分号}SubShader{pass{CGPROGRAM//#pragma是Unity内置的编绎指令用的命令,在Pass中我们就利用此命令来声明所需要的顶点着色器与片断着色器。#pragma vertex vert//定义顶点着色器,通常情况下会起名为vert。#pragma fragment frag//定义片断着色器,通常情况下会起名为frag  int _Size;//应用阶段的结构体struct appdata{float4 vertex:POSITION; float2 uv:TEXCOORD;};//顶点着色器传递给片元着色器的结构体struct v2f{float4 pos:SV_POSITION;float2 uv:TEXCOORD;};//几何阶段中的顶点着色器v2f vert(appdata v){v2f o;o.pos=UnityObjectToClipPos(v.vertex); o.uv=v.uv;return o; } float4 checker(float2 uv){uv=floor(uv * _Size)/2;return frac(uv.x+uv.y)*2;//这个函数是内置的用于求小数部分}//光栅化阶段中的片断着色器float4 frag(v2f i):SV_TARGET0{return checker(i.uv);}ENDCG          }       }FallBack "DIFFUSE"
}

UnityShader内置函数

其实就是Cg库中的内置函数,官方地址为:Cg Standard Library Documentation (nvidia.cn),使用的时候可以再具体查看。

应用阶段传入顶点着色器的数据

当应用阶段的数据传过来时,顶点着色器怎么知道谁是模型的顶点数据谁又是模型的发现数据呢?所以我们需要一种方式来告诉计算机我们定义的变量代表着什么。

    struct appdata{float4 vertex : POSITION;};

这里我们声明了一个float4类型的变量vertex,并给予了他顶点数据的语义(在变量后加冒号并跟一个语义),也就是说vertex变量将代表着模型的顶点数据被我们使用与传递。那么都有哪些语义呢?如下:

 struct appdata{float4 vertex : POSITION;        //顶点float4 tangent : TANGENT;       //切线float3 normal : NORMAL;         //法线float4 texcoord : TEXCOORD0;            //UV1float4 texcoord1 : TEXCOORD1;          //UV2float4 texcoord2 : TEXCOORD2;          //UV3float4 texcoord3 : TEXCOORD3;          //UV4fixed4 color : COLOR;          //顶点色};

顶点着色器到片断着色器的数据

顶点着色器在处理完应用阶段传过来的数据后,会需要输出并传入片断着色器,这个时候我们同样需要定义一个结构来承载其中的数据,同样的,输出给片断着色器的值也需要语义来标识。

 struct v2f{float4 pos:SV_POSITION;};

这里申明了float4类型的变量pos,并指定为SV_POSITION语义,表示pos就是顶点着色器输出的屏幕裁剪空间下的顶点位置。这条语句是必须要有的,否则GPU无法进行接下来的光栅化处理。

Unity Shader(深入了解顶点片断着色器)相关推荐

  1. 【Unity Shader】学习顶点/片元着色器

    上一篇博客重点放在了Unity Shader的基本结构,分别介绍了它包含的三个语义块,最后简单介绍了Unity Shader的形式:表面着色器.顶点/片元着色器和固定函数着色器. 趁热打铁,今天接着上 ...

  2. Unity Polybrush与顶点色着色器

    今年年初,我们宣布了ProBuilder和Polybrush将正式成为Unity的一部分.我们已经详细介绍过使用ProBuilder快速关卡建模,而Polybrush可以帮助我们完成粗略的雕刻.纹理混 ...

  3. Shader学习_曲面细分着色器

    曲面细分 详细介绍 当然除了细分与简化之外,还有另外一种同属一类的操作叫做==曲面规则化(Mesh Regularization)==其所作的便是将三角面都变的尽可能相同,从而也达到提升模型效果的目的 ...

  4. OpenGL ES _ 着色器_片断着色器详解

    OpenGL ES _ 入门_01 OpenGL ES _ 入门_02 OpenGL ES _ 入门_03 OpenGL ES _ 入门_04 OpenGL ES _ 入门_05 OpenGL ES ...

  5. 着色器_片断着色器详解

    本节学习目标 输入值和输出值 如何渲染多个输出缓冲区 输入值和输出值 片段着色器内置变量 输入值:片段着色器接受顶点管线最终输出的迭代值,这些值包括片段的位置,已解析的主颜色和辅助颜色,一系列的纹理坐 ...

  6. OpenGL ES 2.0 for Android教程(二):定义顶点和着色器

    OpenGL ES 2 第二章:定义顶点和着色器 文章传送门 OpenGL ES 2.0 for Android教程(一) OpenGL ES 2.0 for Android教程(三) OpenGL ...

  7. Android OpenGl Es 学习(二):定义顶点和着色器

    概述 这是一个新的系列,学习OpengGl Es,其实是<OpenGl Es 应用开发实践指南 Android卷>的学习笔记,感兴趣的可以直接看这本书,当然这个会记录自己的理解,以下只作为 ...

  8. 【Unity Shader】自定义顶点片元着色器解析

    案例 Shader "Unlit/shader01" {Properties{_MyColor("color", Color) = (1,1,1,1)}SubS ...

  9. opengl相机通过shader修改片断着色器来实现换色,改色,肤色检测等特殊效果

    1.嘴唇检测并改掉色,不准确时可能和相同有关,关于嘴唇颜色检测参考文章 https://blog.csdn.net/Trent1985/article/details/46330847 private ...

最新文章

  1. AI之HCI:人机交互Human-Computer Interaction的简介、发展历史、案例应用之详细攻略
  2. 什么是MySQL,以及它的特性
  3. 网站bin目录下的不可以放配置文件或其他可写文件
  4. main函数执行前执行一个函数的写法
  5. Oracle中如何插入特殊字符: 和 ' (多种解决方案)
  6. Java 序列化的一些简 单总结
  7. 【置顶】方立勋JavaWeb学习地址
  8. python的序列包括字符串列表和什么_Python基础:03序列:字符串、列表和元组
  9. Python3实现从txt文件中读取指定行的方法
  10. 继三星之后 华为折叠屏手机Mate X发售日期或将延期至9月
  11. springcloud五大组件?注解_Spring Cloud学习
  12. 10.31课程.this指向
  13. 【Qt】arm-none-eabi-gdb-py.exe由于找不到python27.dll 无法继续执行代码
  14. 计算机设计大赛作品——冬奥可视化
  15. php fpm listen.owner,php-fpm配置详解
  16. 目前在读学生的Java学习之路
  17. Jpress的基本使用
  18. 从rman 备份中恢复表
  19. 【C语言编程】如何整蛊你的损友,让他的电脑一直关机?
  20. linux设备模型一(基础知识)

热门文章

  1. 自制预防校园暴力的智能监控系统:学习FrontEnd
  2. WPF的学习和使用二:WPF 与 Revit 的进阶交互
  3. HTML5网页设计练习
  4. 刷脸支付有效的风险监控和预防措施
  5. 可以学习的英语和日语字典
  6. C++ 单例设计模式
  7. js实现文件下载功能
  8. 【精品推荐】像极百度传课iOS版,非常赞的教育类应用
  9. 使用 ARChon 运行时环境在 Ubuntu 上运行 Android 应用
  10. MMC型APF,MMC型statcom,MMC型储能系统,MMC-HVDC