零基础入门Unity Shader(七)

 转自:https://zhuanlan.zhihu.com/p/49165180

 前言

上一篇中我们讨论了变量的来胧去脉,这篇呢我们继续深入了解顶点片断着色器,但是在此之前我们还是需要大概了解下渲染管线的相关知识点。


大白话渲染管线

图形渲染管线之所以被叫做管线,就是因为它和一根管子的概念很像,我们可以理解为这根管子的末端连接的是我们最终的显示屏幕,管子的起始端连接的是我们的原始素材。

把我们想展示在屏幕上的素材从起始端放入,然后素材通过管子经过一系列操作最终展示在屏幕上。

而我们如果想加工一下素材最后的显示效果就可以在这根管子中做一些特殊的操作处理,以使素材经过我们所自定义的操作使其最终达到我们想要的效果。

这根管子从头到尾大致流程可以分为以下三个大阶段(概念上):

  • 应用程序阶段(The Application Stage)

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

  • 几何阶段(The Geometry Stage)

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

  • 光栅化阶段(The Rasterizer Stage)

经过几何阶段处理完后输送到光栅化阶段,从像素级别上对每个像素进行加工处理,最终显示于屏幕上。

这里仅仅只是以较通俗的说法来描述渲染管线,如果想了解更详细的内容可以查阅相关图形学书籍,推荐《OpenGL超级宝典》、《Render-Time Rendering,Third Edition》。

同时ShaderReference插件中也已更新添加了渲染管线中常用的名词解释,方便大家快速查阅理解。


结构体

几何阶段和光栅化阶段本身也是条管线,被细分为多个子阶段,那么对应到我们的Shader当中大概就是如下这个样子:

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

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

这个时候就该结构体(structure)出场了,结构体是什么呢?

结构体就像是一个组或者说是一个容器,我们可以在其中存放多个变量,然后在各个阶段传递时我们就传递这个结构体就好了,这样子就把结构体中我们定义的多个变量一同传递过去了。

于是,我们将原来的代码利用struct功能改进后如下:

注意,上一节我们讲的变量,也就是这里的fixed4 _Color;这条语句一定要定义在它用到的函数之前,否会报错。

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

struct具体语法:

  1. 结构体的声明以关键字 struct 开始,然后紧跟结构体的名字,结构体范围由{}定义,最后以分号结尾。
  2. 使用“.”引用结构体中的成员变量和成员函数。

现在我们在结构体中还没有使用到多个变量,现在让我们测试下,最后输出模型的UV做为颜色信息来显示:

这里属性中的_Color没有使用到,先不管它。

自定义函数

有的时候我们可能需要在顶点着色器或者片断着色器中写大量的代码,这样就会使得代码不够整洁,这个时候我们就可以使用自定义函数的方式,将部分代码整合进去,使其看起来直观易懂。

比如在上面的基础上,我们想实现一个利用模型自身UV来产生棋盘格的效果(不用贴图采用,而是程序生成的方式生成棋盘格),如下:

关键代码如下:

checker是我们自己定义的函数,内部就是利用模型自身UV来生成棋盘效果的方法,返回类型为fixed,然后在frag函数中,我们直接调用得到返回值,并最终输出即可。

注意,这里的checker函数同样也要在其用到之前进行声明,和上面的变量声明是一样的,这一点与脚本程序代码是有所不同的,ShaderLab中要先声明再调用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值