【Unity3D Shader编程】之二 雪山飞狐篇 Unity的基本Shader框架写法 颜色 光照与材质

【Unity3D Shader编程】之二 雪山飞狐篇 Unity的基本Shader框架写法 颜色 光照与材质
摘要由CSDN通过智能技术生成
               



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

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

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

 邮箱: happylifemxy@163.com


 

 

本篇文章中,我们学习了Unity Shader的基本写法框架,以及学习了Shader中Properties(属性)的详细写法,光照、材质与颜色的具体写法。写了6个Shader作为本文Shader讲解的实战内容,最后创建了一个逼真的暴风雪场景进行了Shader的测试。依旧是国际惯例先上本文配套程序的截图。

先是一张远眺图:


 

浅墨在场景中放置了一个自动旋转的剑阵,瞬间武侠气息爆棚:


 

来一张近距离:

 

 

 

看到银白色的世界漫天飞雪,剑阵列为圈旋转,有没有雪山飞狐的即视感呢?

 

需要说明的是,由于CSDN的图片上传限制2Mb,这样画质的场景做成GIF上传不了。而静态的图片没有动态的表现力,感受不到风雪吹到自己身上的那种刺骨的感觉,所以在这里贴出的图,表现力已经是大打则扣了,而音效和背景音乐更是听不了,表现力就更是不如亲自运行了,所以浅墨推荐感兴趣的同学可以下载此场景的exe自己运行玩耍,赏玩。且此场景有些庞大,徒步走估计5分钟才能走到场景边界。Please enjoy~

 

点击这里,下载此“雪山飞狐”场景的exe。

 

另外提醒,场景unity源文件和源代码在末尾提供下载。

OK,我们正式开始。

 

 

 




一、一些基本概念认知

 





1.1 Shader和Material的基本概念认知

 


先引用一段文字,阐述Shader和Material的基本关系:


Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的Shader,以及对Shader的特定的参数设置,将这些内容(Shader及输入参数)打包存储在一起,得到的就是一个Material(材质)。之后,我们便可以将材质赋予合适的renderer(渲染器)来进行渲染(输出)了。

所以说Shader并没有什么特别神奇的,它只是一段规定好输入(颜色,贴图等)和输出(渲染器能够读懂的点和颜色的对应关系)的程序。而Shader开发者要做的就是根据输入,进行计算变换,产生输出而已。“


这段文字出自猫都能学会的Unity3D Shader入门指南(一)》,是比较好的Unity Shader的入门文章,可惜只写了两篇,后面就没有继续了。浅墨在文章开头懒得写了,就讲这句引用了过来。


 

1.2 背景知识说明



在这里需要说明,学习Unity中的Shader编程,最好是之前对OpenGL或Direct3D的渲染状态等相关知识有一个基本的了解。如果之前没有太接触过这方面的知识,可以看看浅墨写的DirectX相关的教程。而需要大量恶补提升图形编程功力的童鞋,可以在NVIDIAAMD开发者网站上可以找一些着色器教程和文档来啃啃。

 

对于本期的光照和材质,需要的背景知识可以看浅墨之前写的这篇以DirectX为载体的光照和材质导论式的文章:

 

【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界:光照与材质专场


如果对其中的C++&DirectX的代码不太熟悉的话,没关系。看看概念,了解个大概就可以了。


 




 

二、 Unity中Shader的三种基本类型

 






我们知道,计算机图形学的中渲染管线一般可以分为两种类型:

 

1.固定功能渲染管线(fixed-functionrendering pipelines)

2.可编程渲染管线(programmablerendering pipelines)



按这样的分类思路,在Unity中,Shader便可以分成如下三种基本类型:


 

1.固定功能着色器(Fixed Function Shader)

 

2.表面着色器(Surface Shader)

 

3.顶点着色器&片段着色器 (Vertex Shader & Fragment Shader)



顾名思义,其中的固定功能着色器便是我们所说的固定功能渲染管线(fixed-functionrendering pipelines)的具体表现,而表面着色器、顶点着色器以及片段着色器便属于可编程渲染管线。下面分别对其进行简单的介绍。




2.1 关于固定功能着色器



这里的固定功能着色器可以说是Unity为Shader的书写自带的一层壳,Unity已经在内部为我们做了大量的工作,我们只要稍微记住一些关键字、一些规范就可以实现出很多不错的效果。固定功能着色器是我们初学Unity Shader的最近几篇文章中的主要学习对象。而后面的表面着色器、顶点着色器以及片段着色器就是在固定功能着色器的基础上嵌套了CG语言的代码而成的更加复杂的着色器。我们来看看他们的一些基本概念。

 

 


2.2 关于表面着色器



表面着色器(Surface Shader)这个概念更多的只是在Unity中听说,可以说是Unity自己发扬光大的一项使Shader的书写门槛降低和更易用的技术。我们会在接下来的学习中逐渐意识到Unity是如何为我们把Shader的复杂性包装起来,使其书写的过程更便捷和易用的。


 



2.3 关于顶点着色器和片段着色器




研究过Direct3D和OpenGL着色器编程的童鞋们一定对这两者不陌生。我们来简单介绍一下他们的用途。

顶点着色器:产生纹理坐标,颜色,点大小,雾坐标,然后把它们传递给裁剪阶段。

片段着色器:进行纹理查找,决定什么时候执行纹理查找,是否进行纹理查找,及把什么作为纹理坐标


 



2.4 如何区分Unity中的Shader类型



在Unity中想要区分他们很简单。后面熟悉了自然知道。在这里浅墨先剧透一下:


  • 没有嵌套CG语言,也就是代码段中没有CGPROGARAM和ENDCG关键字的,就是固定功能着色器。
  • 嵌套了CG语言,代码段中有surf函数的,就是表面着色器。
  • 嵌套了CG语言,代码段中有#pragma vertex name和  #pragma fragment frag声明的,就是顶点着色器&片段着色器。

 

 

 

 

 

 

 

 

三、Unity中将Shader赋给Material的两种方法





在Unity中将Shader赋给Material使用的两种方法。

 

【方法一】直接将Shader拖拽到Material之上。这种方法我们上篇文章中已经多次讲到,也就是这样:

 


【方法二】在Material的Inspector面板中选择。

Unity中内建的Shader都是通过这种方式来让Material使用的。在Material的Inspector中,其名字下方的Shader栏中选择。可以发现Unity已经为我们准备好了很多种不同的Shader,基本可以满足居家旅行的需求了。

 

而对于我们自己新写的Shader,也会在这个菜单栏中显示出来。细心的朋友们看上图的时候,肯定就已经发现了。

这里选择的菜单取决于我们Shader中定义Shader的第一行代码时紧接着Shader关键字的引号“”里面的书写方式:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值