【Unity3D Shader编程】之三 光之城堡篇 子着色器 通道与标签的写法 纹理混合

本文详细介绍了Unity3D中子着色器(SubShader)的标签使用,包括渲染次序、忽略投影等,以及通道(Pass)的Name和Tags,讲解了光照模式、条件选项标签等内容。同时,文章探讨了纹理的设置和混合,如纹理合并、颜色常量和矩阵命令,以及如何在Shader中实现不同的纹理混合效果。通过多个Shader实战示例,展示了如何将理论知识应用于实际场景,如光之城堡的渲染效果展示。
摘要由CSDN通过智能技术生成
               



 本系列文章由@浅墨_毛星云 出品,转载请注明出处。  

 文章链接: http://blog.csdn.net/poem_qianmo/article/details/41175585

 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442

 邮箱: happylifemxy@163.com


 

 

本文介绍了Unity中子着色器、通道和标签相关的详细概念与写法,以及纹理的设置方法,基本的纹理混合写法,写了5个Shader作为本文Shader讲解的实战内容,最后创建了一个梦幻的光之城堡场景进行了Shader的测试。依旧是国际惯例,先上本文配套程序的截图。


光之城堡:


 

 

山坡上远眺:

 


通向森林的路:



古墓:


 

雾气氤氲的森林:

 

 

来一张上帝视角:



OK,图先就上这么多。文章末尾有更多的运行截图,并提供了原工程的下载。可运行的exe下载在这里:

 

【游戏场景可运行的exe请点击这里下载试玩】

 

 

 我们正式开始。

 

 



 

 

一、子着色器(SubShader)相关内容讲解






话不多说,我们接着上篇文章继续讲。

Unity中的每一个着色器都包含一个subshader的列表,当Unity需要显示一个网格时,它能发现使用的着色器,并提取第一个能运行在当前用户的显示卡上的子着色器。

 

我们知道,子着色器定义了一个渲染通道的列表,并可选是否为所有通道初始化所需要的通用状态。子着色器的写法如下:

 

Subshader{ [Tags] [CommonState] Passdef [Passdef ...] }

 

也就是通过可选标签,通用状态 和 一个Pass 定义的列表构成了子着色器。

当Unity选择用于渲染的子着色器时,它为每一个被定义的通道渲染一次对象(可能会更多,这取决于光线的交互作用)。当对象的每一次渲染都是很费资源之时,我们便使用尽量少的通道来定义一个着色器。当然,有时在一些显示硬件上需要的效果不能通过单次通道来完成。自然就得使用多通道的子着色器了。

另外,通道定义的类型包括a regular Pass, a Use Pass or aGrab Pass。

任何出现在通道定义的状态同时也能整个子着色器块中可见。这将使得所有通道共享状态。

 

 



1.1 关于子着色器标签(SubShader Tags)

 

 

 

子着色器使用标签来告诉渲染引擎期望何时和如何渲染对象。其语法如下:

 

Tags { "TagName1" ="Value1" "TagName2" = "Value2" }

 

也就是,为标签"TagName1"指定值"Value1"。为标签"TagName2"指定值"Value2"。我们可以设定任意多的标签。

标签是标准的键值对,也就是可以根据一个键值获得对应的一个值的。SubShader 中的标签是用来决定渲染的次序和子着色器中的其他变量的。

 

 

 


1.1.1  决定渲染次序——队列标签(Queue tag)

 


 

我们可以使用 Queue 标签来决定对象被渲染的次序。着色器决定它所归属的对象的渲染队列,任何透明渲染器可以通过这个办法保证在所有不透明对象渲染完毕后再进行渲染。


有四种预定义(predefined)的渲染队列,在预定义队列之间还可以定义更多的队列。这四种预定义的标签如下:

 

  • 后台(Background) - 这个渲染队列在所有队列之前被渲染,被用于渲染天空盒之类的对象。
  • 几何体(Geometry,默认值)- 这个队列被用于大多数对象。 不透明的几何体使用这个队列。
  • 透明(Transparent) - 这个渲染队列在几何体队列之后被渲染,采用由后到前的次序。任何采用alpha混合的对象(也就是不对深度缓冲产生写操作的着色器)应该在这里渲染(如玻璃,粒子效果等)
  • 覆盖(Overlay) - 这个渲染队列被用于实现叠加效果。任何需要最后渲染的对象应该放置在此处。(如镜头光晕等)

 

一个使用Tags的示例如下:


Shader "Transparent QueueExample"{    SubShader{
    //写上Tags标签       Tags {
    "Queue" = "Transparent" }              //开始一个通道       Pass{           // 写Shader实体内容       }    }}


 




1.1.2 自定义中间队列




让我们来举例说明如何在透明队列中渲染对象。一般情况下,几何体渲染队列为了达到最优的性能优化了对象的绘制次序。而其他渲染队列依据举例排序对象,从最远的对象开始渲染到最近的对象。

而对于特殊的需要,可以使用中间队列来满足。在Unity实现中每一个队列都被一个整数的索引值所代表。后台为1000,几何体为2000,透明为3000,叠加层为4000. 着色器可以自定义一个队列,如:

 

Tags { "Queue" ="Geometry+1" }

 

因为渲染队列是从小到大来数的,这就会使对象在所有不透明的对象渲染之后但却在所有透明物体前被渲染,该渲染队列的索引值为2001。当我们希望某些对象总是在其他某些对象前被绘制的情况下,这用起来就很方便了。比如,在绝大多数时候,透明的水总是应该在所有不透明的物体之后并在透明对象前被渲染,这就可以通过中间队列来满足渲染需求。


 

1.1.3 关于忽略投影标签(IgnoreProjector tag)

 


后面我们会接触到,若设置IgnoreProjector(忽略投影)标签为"True",那么使用这个着色器的对象就不会被投影机制(Projectors)所影响。这对半透明的物体来说是一个福利,因为暂时没有对他们产生投影的比较合适的办法,那么直接忽略掉就行了。

 

 



二、 通道(Pass)相关内容讲解




Pass通道块控制被渲染的对象的几何体。其语法定义是这样的:

 

Pass { [Name and Tags] [RenderSetup][TextureSetup] }

 

基本通道命令包含一个可选的渲染设置命令的列表,和可选的被使用的纹理的列表。

 



 

2.1 通道中的名称与标签(Name and tags )

 



一个通道能定义它的Name 和任意数量的Tags。通过使用tags来告诉渲染引擎在什么时候该如何渲染他们所期望的效果。语法如下:

 

Tags { "TagName1" ="Value1" "TagName2" = "Value2" }<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值