怎么怎样才能快速学好英语学好unity3D呢?我是初学者

他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)位置:深圳龙图教育& &
深圳unity3d如何学习
为何首选U3D游戏编程开发工程师?
趋势!高薪!高逼格!
Unity3D是Unity Technologies公司开发的一款强大的跨平台游戏开发引擎,能让游戏开发者轻松创建诸如3D视频游戏、实时3D动画等互动内容。最新Unity4.0引擎已经能够支持包括iOS、安卓、Windows Phone、PS3等在内的十余个平台发布,广泛应用于网页游戏及手机游戏开发领域。Unity&&3D手游的传奇,孕育了成千上万款高质、超酷炫的神作:《炉石传说》 《神庙逃亡2》《天天跑酷》。游戏的3D时代已经来临,现在有数百万开发者加入Unity大军,你还在等什么?龙图教育与高校共同开发制定符合游戏开发设计专业,为高校提供专业师资、教材、项目案例,制定符合行业标准、国家标准的课程体系,取得相应教育部门承认的学历标准,为整个游戏教育树立行业标准。
名企品质保证,入学签就业协议,绝非普通推荐就业协议
邀请15000多家企业与龙图教育各期学员共同见证
Unity3D游戏引擎是大势所趋
Unity多可以支持超过十个主流平台和发布,最大程度节省开发成本和时间,却又可以在多个平台获取收益。
轻松开发,友好的可视化编辑界面功能强大,编写方便,极易上手。功能齐全,缩短开发时间:Unity3D引擎简单易用,几乎集成了游戏开发的所有功能,更有Ass et Store 提供开发者所需要的所有资源。
国内Unity 3D的人才缺口达80万人。在深圳,U3D工程师的平均月薪15k。越来越多的人看好U3D,目光聚集之处,财富必将追寻。
Unity 3D培训就找实力品牌
龙图教育优势强势来袭
师生参与的企业大项目,未毕业就有工作经验,走到哪里都有底气
01 千人做实训项目
实战演练才能提升核心竞争力,龙图教育与腾讯、墨麟等上千家游戏名企合作,游戏项目手到擒来。
02 有来自腾讯、龙图游戏等名企讲师
业内技术大神组建的梦之队,名师主导+专家提升,收获的不仅是技术,还有视野和理念。
在游戏行业从业多年, 具有很深的手绘功底和造型能力,经验丰富。参与公司项目:韩国公司T3:大型端游《三国之天》《Big fish》,岳览时代:大型端游《大荒传奇》。
先后参与了《斗破星空》、《星际战争》等多款网页游戏项目开发,13年转入游戏引擎领域,从事Unity3D项目研发与课程研究,熟练使用NGUI、PlayMaker等主流插件。
计算机相关专业毕业,拥有多年的开发经验,参与《烈火遮天》《狂战天下》等多款手机游戏的开发, 对Unity引擎非常熟悉,精通NGUI等插件。
美术专业出身,10多年项目开发和团队管理经验,先后任职网龙、光宇科诗特、腾讯、中青宝,并担任主美、美术经理、美术总监等重要职位;在职期间参与多款业界神作,代表作:端游《 征服》、《魔域》、《御龙在天》等。
03 就业有保障,企业上门来招聘,足不出户&挑&工作
他们在这里成功,你却还在跟梦想唱反调,足不出户挑工作,人性化上门招聘,实现企业,学员完美对接龙图教育,每年与上千家游戏名企强强合作,上百个高薪职位主动送上门,你还不快预定。
权威课程体系,含金量高
一次投资,终身受益
Unity3D程序开发基础
1.C#语法基础 2.OOP(面向对象)3.网络通信 4.内存管理
从基础讲解C#语言,熟悉字段、属性、接口、委托、事件,掌握C#面向对象编程的核心思想。让学员掌握Unity3d各个方面的知识和基本使用方法,为后面深入的学习打下良好基础。
Unity3D程序初级阶段
1.U3D初识 2.Unity3D开发环境使用 3.物体系统,粒子系统使用 4.灯光,地形系统使用 5.GUI以及NGUI插件介绍 6.常用组件,以及脚本绑定 7.伪2D游戏的制作
熟练掌握编辑器元素包括地形、光照和阴影、 摄像机和天空盒的使用与游戏设定,物理引擎、粒子系统,输入与控制的脚本开发和GUI、NGUI插件的使用,构建网络游戏框架。
Unity3D高级阶段
1.Unity3D物体系统高级部分 2.Untiy3D动画系统高级部分 3.常规设计模式4.动画,跟随等相关插件学习 5.第1,3人称项目讲解
在原来的学习基础上,深入学习Unity3D物体系统、动画系统的高级部分,例如骨骼的绑定,动画角色的创建等。配合游戏案例进行深度讲解,让学生充分了解动画的制作过程。
游戏跨平台发布
1.IOS版发布 2.安卓版发布 3.网页版发布 4.PC版发布
掌了解不同平台的资源要求范围、资源表现形式、资源的具体优化方向和最终呈现效果,掌握客户端游戏发布、网页游戏发布、Android平台发布与上架、IiOS平台发布及上架以及其他平台发布介绍,提高成品游戏的可利用率。
1.设计模式 2.Socket 3.通信协议 4.XML与SQLite 5.对象池技术 6.全局事件技术 7.伪2D飞行类 8.FPS射击类 9.MMORPG
学生根据自己实际情况选择对应课题或者做提供的课题,由学生自己来动手完成一个完整项目,让学生实际感受并把控整个项目,培养学生的独立思考及解决问题的能力,以快速的适应实际工作需求。
黎同学&&&勤奋、坚持!&
不经意间离开龙图教育已经许久了,看了同学们在学校的照片真是感触良多。在此我想把我的学习经验方法分享一下:首先要明确目标,没有目标只有死路一条。相信大家到龙图教育都想要掌握本领,找一份心仪的工作,要现实这一目标就必须努力学习。将老师所教的知识变成自己的,需要在课外也花时间学习。最后就是&勤奋、坚持!&,相信这句话你们老师也跟你们说过!这句话我印象很深,也是我奋斗的动力之一。希望师弟师妹们能够有一个端正的学习态度,做到不卑不亢、不骄不躁。
高同学&&腾讯出来后我也选择了创业
尊敬的校长、老师们,我是程序5班的高震宇,还记得我吗?转眼毕业3年过去了,我也开始想家了,也开始想你们了,老师们还过得好吗?学校现在发展越来越快了,谢谢这些年来老师们的耐心教导~在学校里学习期间对我的人生有了很大的改变啊,现在工作很开心,而且有了技术不怕找不到好的工作,小宇在此向希望龙图教育越开越大,招更多的学生,为社会培养出更多的人才!校长越来越帅!老师们教出更多更出息的学生!
袁同学&&努力吧师弟师妹们
时间飞快,眨眼间毕业已经3年多了。从龙图教育毕业到公司,深圳给我的感觉就是这是个节奏很快的城市,生活的压力让我们无法停下来喘气。我现在主要从事网页游戏客户端程序的开发,工作后我才明白老师常说的:语言都是相通的,关键在思想&&这样一句话让我在工作中受益匪浅,也希望自己今后能在开发技术和思想上有更大的收获。在此祝福龙图教育越办越好,为师弟师妹们提供更好的学习环境和就业指导。同时也希望师弟师妹们学业有成,找个好工作,不过学好基础知识是前提,努力吧师弟师妹们,我祝福你们!
李同学&&非常感谢龙图教育的老师
来到广州菲音凡人工作室上班已经有2年多了,我现在已经完全适应了这里的工作氛围,每天的工作都非常忙碌和充实。非常感谢龙图教育的全体老师们对我的帮助,没有他们的悉心教导和热心栽培,作为只有高中学历的我,就不可能有今天,更不可能如此轻松地找到一份自己心仪已久的工作。在踏上工作岗位之后,我终于明白老师们曾经的教导是多么的用心良苦。为了我们可以学习到更扎实的技能、找到更加优越的工作,龙图教育的老师们真的是无时无刻的不为我们操心。不为其他,只为我们能够在这里收获满满,并最终找到自己心仪的工作。
校区简介:深圳龙图教育南山区校区地址位于深圳市南山区松坪山新东路1号,附近有Organe生态厨房、紫光信息港、北环大道等。
公交路线:科苑北环立交站(可乘b607路、36路、233路、339路、E9路、E19路、M299路、M429路、334路、M391路);清华信息港(M240路);海能达(M209路、M355路、M313路)
详情请进入
查看,文章来源:
开班时间: 滚动开班
课程费用:咨询
咨询电话: 咨询QQ:
想找到梦寐以求的概念艺术设计这样一份工作,不仅仅关乎你有没有这方面天赋的问题。成功的机会一直都是留给那些有准备的人们的,所以在你开始投递简历前的三到六个月,你就应该着手制定你的“征战”计划了。
为了帮助那些打算入坑的朋友,我们采访了概念艺术设计师Eliott Lilly,身为《电视游戏原画设计的黑暗世界(The Big Bad World
Of Concept Art For Video Games)》(以下简称《电视游戏原画设计》)一书的作者,他向我们罗列了在找工作前最重要的10件事。
Eliott Lilly
1.列出你最钟意的五个工作室
每个人都有一个所向往的工作室,或者一个想要参与的项目。你的第一个行动应该是对这些工作室的艺术家们做一些研究,看看他们工作室的网站上都有什么样的作品。
观察其中的一个作品,把它跟你自己的作品比较。相比之下,你的作品怎么样?如果你在这个行业里只是个新手,很可能你的作品相较会逊色不少,因此,如果你现在申请你梦想的工作室,很可能你得不到这份工作。所以现在最好不要把你的时间浪费在应聘上。
别担心,还是有挽救的方法。虽然列出了你中意却暂时遥不可及的工作室,但现在你已经有了自己的目标。你可以把这个清单先放一边,几年后再回头看看。你会发现,有一天,你把你的艺术作品会放在一个你曾经崇拜的艺术家边上,你会发现你的将会跟他的一样好。届时你就会知道,这个阶段的你就可以申请你梦想的工作室了。
图为 Eliott Lilly为游戏公司Id
software旗下游戏《狂怒》所做的的角色概念设计。把你的作品与你所向往的工作室的艺术家的作品相比,这将有助于指导你的求职。
Eliott Lilly为Software’s
Rage设计的概念人设,把你的作品和你想为他工作的艺术家的作品进行比较,这等于你免费找了一个老师来指导你的工作哦。
2.现实一点,现在再列出几个工作室
现在,你知道你最终想去哪里工作。你可以寻找有类似项目但没有如此高要求的公司。这些工作室可能是小型的或者不知名的,但他们仍需有能力让你变得更加专业。
根据个人偏好按顺序把它们写下来,然后有条不紊的查看他们是否正在招聘。工作室通常会直接把招聘信息列在他们自己的网站上或活着相关产业的网站、论坛和在线平台上。(比如ArtStation的求职板块――编者注。)你必须得做一些发掘和浏览,但工作就在那里。让你的选择广一些:如果在搜索时,偶然遇到一个你之前没有考虑过的工作室时,别急着把他忽略掉。
在这之前,你真的需要一个能让自己热热身的工作,来帮助你熟悉当前的市场环境,并减轻一些当你开始认真找工作时的压力。
3. 对你的作品集进行回顾
再你申请一份工作之前你需要有人对你的已有作品进行专业的评估。如果你仍是学生,你可以询问你的老师;或者询问你所知道的其他专业人士。(一些商业展览,比如特洛伊木马是独角兽,他们也开展专业评估这项业务――编者注。)避免询问你的家人和亲近的朋友:他们只会告诉你你想听的。尽早寻求建设性的批评,以便你有足够的时间去做任何必要的改变。
这里例举了一些好的问题:
基于你所看到的作品,你认为我最合适做什么类型的工作?
如果答案不是你所期望的,这就意味着你的作品并没有传达出你的意图,意味着你并没有呈现最正确的图像,亦或者更加糟糕,这些图像质量根本达不到行业质量。总之,你将会知道你接下来需要去做什么。
你认为我作品中的优点与缺点是什么?
无论你获得了什么答复都不要去打断或者辩解,你必须靠作品说话。如果你不喜欢你所获得的答复,那就多问问你需要在哪部分加强练习。
为了在“XX部门工作”我还应该在我的资料中加些什么?
无论你想做一名角色设计、环境设计或者艺术总监,一个经验丰富的行家会知道你是能否有胜任你所向往的工作。
当你听完所有的回馈,行动起来。不要让它拖住你的脚步或者击垮你。马上改变。
图为特洛伊木马是独角兽庆典时,专家正在进行资料评审工作。得到专业的反馈对你申请工作非常重要。
4. 完成你的作品网站
接下来你该着手考虑你的网站和。你必须得认真对待,是它符合业界标准。你得考虑的站点可以去哪里注册建站,它应当包含什么样的内容,甚至可以考虑导航的易用性。你的网站应该告诉大家:你是一个正在找工作的年轻专业人才。如果需要帮助,去专业从业者的网站找找灵感。
除了你的作品,你的网站应该还包括你的简历和联系方式,比如电话号码或电子邮件地址。(但不要包含您的邮寄地址,留点个人隐私总是必要的。)由于人们喜欢右键保存他们喜欢的图像到自己的,请确保你的网站上的每一个图像的连接都正常可用。
由于艺术总监只有几分钟的时间花费在访问你的网站上,所以在你的窗口只有很短机会。要确保网站易于浏览,没有一点杂乱东西分散眼球。没必要添加广告、音乐或华而不实的动画。同样重要的是,你的内容需优化并尽可能有效地减少的加载时间。
5. 制作一份得体的简历
在你申请工作前,你需要建立一份简历,列出你的、教育背景和工作经历。尽可能让你的简历显得专业些,并将内容保持在2页以内的长度(1页最佳。)只要上谷歌上搜索一下,网上就有数以百计类似的模板提供下载,记住:不要有错别字!
6.参加业内的活动
在电子游戏展上,通常每个展位都会派HR或者工作室的雇员去参加。(这种情况同样适用于贸易展会上的那些视效和动画工作室―编者注。)运气好的话,他们也许会看你的简历,并回答一些问题。与这些工作室的人面对面的交流是你给他们留下深刻印象的绝佳机会,因为你展示的不仅是你的作品,还有自己的个性。可以把这种交流当成员一次简短的面试。
如果事情进展顺利的话,一般他们都会给你一张名片,这样一来你就有了这个工作室的联系方式。在贸易展会结束后,你手里应该会有一些名片了,趁你对那些谈话内容还有印象的时候可以把和每个人的交流做一些笔记。尤其是要记下他人对你的评价或者建议――特别要注意那些他们想让你持续跟进的点。
记住:在参加展会之前,你必须要完成之前说的那五个步骤。如果不知道自己想要去哪个工作室工作,也没有过硬的专业能力,简历也完全不合适,那你只是在浪费时间和金钱而已。
7.自我推销
除了你的个人网站和社交媒体,把你的作品多多的展现在专业的艺术画廊里。多多的参与艺术比赛,无论是网络上的还是线下活动。这样做都会增加你的知名度,甚至在你申请工作之前,就会有人发现你并为你提供更多的机会。这也让你好好品尝一下现实世界中的种种底线、束缚和压迫感。即使你无法脱颖而出,也可以从中有所收获。
并且,不要害怕在概念艺术相关的论坛上发表你的作品去寻求帮助。并不是所有的反馈都是有用的,甚至有些反馈和你的作品并没有关联,但是如果你因此学习到了新的东西,那就很值得了。
8. 接触专业人士
一旦你一开始将范围缩小至你将来想要去的工作室,那你可以联系这些工作室的画家,并将作品发给他们看。向他们提出问题,如:“我的作品还需要做出那哪些改进,才能让你们公司感兴趣?”在还没申请工作之前,就与团队的成员打好关系,这样能够增大你被雇佣的机会。
除此之外,你还应该要通过社交网络,公开画展和论坛与业界内的其他画家保持交流。关注他们的博客,与他们建立联系。对于他们公开发布的作品,做点评,偶尔要给他们发送一些简短的邮件。成为业内不断发掘其他艺术家的专业人士网络中的一分子,这对于任何一个艺术家来说都是有很大的帮助。
首席艺术家David Levy,曾在Eliott的《电视游戏原画设计》一书中接受采访。同专业业内人士作比较会对你的求职有很大帮助。
9.时刻关注业界新闻与动态
开始留意业内新闻,关注几个有影响力的主流游戏或电影资讯网站,并且每天花几分钟扫一眼上边的文章。这将有助于了解行业现状趋势,确保在面试中被问及相关问题时,你回答的上来。
10.变得有条理
记录下求职过程中的点点滴滴,将“你感兴趣的工作室”、“与你联系过的人”以及“同你交谈过的人”等都整理出来。把你的这些求职资源编辑成单独的列表,并且浏览器收藏中所有与相关的业内的网站。
一旦你开始将你的作品发送给工作室或者其他艺术家,你就得和他们保持联系并认真记录他们给你的评价或反馈。相信我,在你坚持这么做了一段时间后,你就会发现和他们保持联系并不容易。
现在,你应该已经确定你的求职目标,并且大体完成了作品和其他辅助材料的准备,以便能打动他们;一旦机会出现,你能马上自信的出击。为了更深入地看问题,你可以看看我的书《The
Big Bad World Of Concept Art For Video Games: An Insider’s Guide for
Students》。几乎涵盖了概念设计师需要具备的详细说明;如何选择正确的教育;在学校里该怎么学习怎么练习;如何创建你工作中想要的文件;然后还有很多很多。
Lilly是一个自由概念艺术家,兼职教授,作家。他在游戏行业工作了近十年,目前在使命召唤:黑色行动3.你可以通过他的博客了解更多信息,或者欣赏他的作品。
校区分布Related schools
师资介绍|教学环境|学员评论
教学点: 1个
教学点: 1个
教学点: 1个
教学点: 1个
教学点: 1个
教学点: 1个
教学点: 1个
教学点: 1个1,046被浏览183,251分享邀请回答12414 条评论分享收藏感谢收起415 条评论分享收藏感谢收起【译】Unity3D Shader 新手教程(1/6)
时间: 22:23:15
&&&& 阅读:27824
&&&& 评论:
&&&& 收藏:3
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D Shader编程望而却步。该系列教程的第一篇文章(译者注:即本文,后续还有5篇文章)详细介绍了Unity3D中的表面着色器(Surface Shader)的,为学习更复杂的Shader编程打下基础。
如果你是刚刚接触Shader编程的新手,你可能不知道从何开始踏出Shader编程的第一步。本教程将带你一步步完成一个表面着色器(Surface Shader)和片段着色器(Fragment Shader)。本教程也将介绍在Unity3D Shader编程中所使用的一些函数和变量,这些内容可能和你在网上看到的不一样哦!
如果你满足下面的条件,我觉得你应该看看这篇文章:
如果你是shader编程的新手。
你想在你的游戏中使用shader做一些很炫酷的效果,但是你在网上找不到可用的Shader(译者注:o(╯□╰)o自己动手丰衣足食)。
由于缺乏对基础知识的了解,造成不能随心所欲使用Strumpy着色器编辑器(译者注:Strumpy Shader Editor,一种图形化编写shader的方式,看着很诱人!)。
你想在你的shader代码中手动处理纹理(Textures)
本文是该系列教程的第一篇文章,随后我们会制作一些更复杂的shader。相比起来,第一篇文章确实很简单。
我也是Shader编程的新手----所以我决定写这篇教程帮助大家入门&&我当初也在入门上遇到很多苦恼。事实上我并不是一个Shader编程专家。
当我想了解Shader编程时,我曾反复阅读官方文档,但是我最终发现官方文档讲述的顺序并不适合我学习shader。所以我觉得我应该写一篇教程,并分享我所学到的知识。不过写完教程之后,我发现再次阅读官方文档时,觉得明白多了。
尽管本教程中的所有例子都能正常运行,但是我相信肯定有更好shaders实现这些例子。如果聪明的你对这些例子中的shaders有更好的建议,请在评论区留言!
我之所以学习shader编程是因为我需要在我创建的游戏世界中创建些东西,但这个游戏世界创建起来有个麻烦之处,因为它是由不同角色组成的,而我必须创建由多个部分组成的一个统一网格(mesh)。所以我只能对每个角色使用一次绘制调用(draw call)。(译者注:完全不知道他在讲什么?所以我把原文放在下面给大家评评理)
My reason for getting into shader programming was to build something that I needed for a world populated with an endless array of different characters.& I needed to build a combined mesh out of multiple parts so I only have one draw call per character.
通过打开和关闭角色的穿衣效果,我使用Megafiers(一个变形插件)修改了角色的基本网格(base meshes)。其中的困难在于我只有一个纹理(texture),但是我却想给每个角色的皮肤,服饰以及其他的特征使用不同的颜色。我想到一个方法----对每个角色使用不同的3个4x4纹理,并使用一个shader来给模型上色。我将在整个教程中详细描述我做的这个shader,但是现在&我想你们已经迫不及待地想看我创建的角色表演一段即兴的快闪舞(flash mob dance)(译者注:网上截的图片)。
着色器和材质(shaders&materials)
一个shader所做的就是将一个模型的网格(mesh)渲染到屏幕上。Shader可以被定义为一系列的属性(译者注:就像一个函数里面的参数一样,你可以改变函数的不同赋值来改变函数的输出结果),你可以通过改变这些属性来改变模型渲染到屏幕上的效果。而这些属性被存放起来,放到一个叫做材质(material)的地方。
Unity3D Shader有以下几种
表面着色器(surface shader)----后台自动为你做的绝大部分的工作,减少了你工作量,并且适合绝大多数需要shader的情况。
片段着色器(fragment shader)----可以让你做更多的效果,但是此shader更难写。你也可以用它做一些底层的工作,比如顶点光照(Vertex lighting,即在每个顶点存储该点的光照信息)。顶点光照对于移动设备很有用(译者注:估计省内存吧)。该shader对于一些需要多通道(multiple passes)的高级渲染效果也很有效。
本文中我们将关注点放在表面着色器上。
学习Shader的资源
如果你要学习Shader编程,我向你推荐下面几个资源
Martin Kraus‘s fantastic Wiki Book GLSL Programming/Unity
Unity‘s Shader Reference
NVidia‘s tutorial on the CG programming language
CreativeTD‘s video series on writing surface shaders
Shader的流水化工作方式
(译者注:Shader的工作方式也称为shader流水线(pipeline),因为shader工作方式很类似汽车流水线,将模型上一系列顶点数据和其他各种数据作为输入,用这个shader组成的流水线加工下,出来的就成了炫酷的效果了。)
你将在shader流水线中看到不明觉厉的各种术语,我将用我自己的语言尽量降低理解的难度。
Shader的工作就是输入一些3D几何信息,经过shader处理后将其变为2D的像素呈现在屏幕上。好处是在shader处理过程中,你只需要改变少数几个属性就可以产生不同的效果。对于表面着色器,该工作流程看起来像下面这样:
(译者注:简单讲解一下这个流程图,首先要渲染的物体将自己的几何信息传递到Shader中,并且系统得到了该物体的顶点信息,然后你可以选择经不经过Vertex Function来处理这些顶点信息,随后经过光栅化(将三维几何信息映射到二维屏幕上,打个不恰当的比喻,相当于把3D模型拍扁到屏幕上,然后你就可以专心处理屏幕上的像素了),每个像素经过你的shader代码将得到最终的颜色值)
注意在表面着色器(Surface Shader)中的函数退出之前,像素的颜色还没有计算出来。这意味着你可以再次之前传入顶点的法向量来影响光照的计算。
片段着色器(Fragment Shader)有着同样的工作流程,但事实上,片段着色器中必须有Vertex Function(上图中的Vertex Function部分就是可选的(Optional)),而且需要在像素处理阶段做很多的工作才能产生最终的像素。而表面着色器隐藏了这些。(译者注:给我的感觉就是片段着色器向用户提供了更多的接口进行更高级的渲染)。
下图展示了你的代码如何被调用以及代码构成
从上图我们可以看到,当你写一个shader的时候,你可能得有一些属性值(properties),并且有一个或多个Subshaders。具体使用哪个Subshader进行处理取决于你的运行平台。你应该还要指定一个Fallback shader,当你的subshader没有一个能运行在你的目标设备上,将使用Fallback shader(译者注:有点像备胎)。
每个Subshader都至少有一个通道(pass)作为数据的输入和输出。你可以使用多个通道(passes)执行不同的操作,比如在一个Grab Pass中,你可以获取将要呈现到屏幕上的像素值(译者注:类似于glsl中的fragment buffer)。当你想制作高级的扭曲效果,这非常有用。虽然当你开始学习shader编程时,你可能并不会使用到它。另外一个使用多通道(multiple passes)的原因是在不同时刻,你可能需要写入或者禁止写入深度缓存的使用。
当你写表面着色器时,我们将直接在Subshader这个层次上写代码,系统将把我们的代码编译成若干个合适的通道(pass)。
尽管shader最终产生的是二维像素,但是其实这些像素除了保存xy坐标外,本身保存着深度值(即每个像素点上的内容在原先3D场景中离照相机的远近),这样距离照相机近的物体就会把距离照相机远的物体遮挡住,在屏幕上显示时,就是将其像素值覆盖。
你可以控制是否在你的shader中使用深度缓存(Z-buffer)产生一些特效,或者在Pass中使用一些指令决定shader是否可以写入Z-buffer:比如使用ZWrite Off时,任何你输出的东西都不会更新Z-buffer的值,即关闭的Z-Buffer的写入功能。
你可以使用Z-buffer技术在别的物体上掏出一个洞,你可以先写入需要打洞区域的深度值,但不输出打洞区域所属的像素值,然后在你模型后面的物体的深度值将无法写入(因为Z-buffer觉得你的模型已经挡住了后面的物体)(译者注:这样你打洞区域显示的就是一开始使用的背景色,会造成一个洞穿过了这些物体的效果)。
下面是一些shader代码:
希望你能看出上面代码是由Properties,SubShader,Fallback三段代码组成的。
理解Shader代码
文章剩下的部分将讲述上面那段简单代码到底做了什么?真正的干货马上就来了,你必须好好掌握这些内容。
当你进行shader编程时,你必须使用正确的变量名和函数名来调用它们,事实上变量的名称在某些情况下能让人一眼看出它的特定含义。
创建并使用默认Shader
(译者注:在详细介绍Shader之前,我们先简单介绍下shader如何使用。)
1. 我们先打开Unity(我的版本是4.6.1),创建新工程,并在Assets文件夹下创建三个目录,如下:
2. 我们再创建一个cube。
可以在Inspector面板看到新创建的cube所使用的Material如下。
3. 打开Material文件夹,我们在其中创建一个Shader和一个Material。
此时New Material的默认Shader为Diffuse。
我们将NewShader拖到New Material上。
可以看到该材质所使用的Shader变成我们新建的NewShader了。当然你也可以直接点击材质编辑器中Shader下拉框,选择相应的Shader。
4. 最后将New Material拖到cube上。可以看到cube所使用的材质和Shader都变成了我们新创建的材质和Shader了。
Properties(属性值)简介
你在shader代码中的Properties{&}部分定义Shader中的属性值(属性值就是用户传入给shader的数据,比如纹理之类的,然后shader处理这些纹理,产生特效。可以理解为属性值相当于一种全局变量,而Shader就是那个主函数,Unity的优势在于给这个全局变量赋值可以在Inspector面板进行)。注意Properties(属性值)是所有Subshader代码中的共享的,意味着所有SubShader代码中都可以使用这些属性值。
属性值(property)定义的形式:
_Name(&Displayed Name&,type) = default value[{options}]
_Name 属性值的名称,是在shader代码内部使用的,区别于下面的Displayed Name,后者是在Inspector 面板上显示的,作为外界(用户)的输入提示。
Displayed Name 呈现在材质编辑器中的属性值名称,在Inspector面板上显示。
总结:打开我们创建的NewShader。可以看到_MainTex是在代码中使用的,而Base (RGB)是在材质编辑器中使用的
type&属性值的类型,包括:
Color & 表示纯色,使用了RGBA表示法
2D & 代表尺寸为2的幂次的纹理(如2,4,8,16&256,512)
Rect & 代表纹理(texture),不同于上面的纹理,此处纹理的大小不一定是2的幂次。
Cube & 用于3d中的cube map,经常提到的天空盒就是使用了cube map。
Range(min, max) & 在min和max之间的一个值,在面板中可用滑动条改变其值大小。
Float & 任意一浮点数。
Vector & 4维向量值,本质就是4个浮点数组成的类型。
来张全家福:
default value&属性值的初始值,就相当于你的变量初始化的那个值。
Color & (red,green,blue,alpha) 使用了RGBA这种格式的颜色,alpha指的是透明度& 比如 (1,1,1,1)
2D/Rect/Cube & 纹理的类型,上面已经介绍过了。初始化值可以使一个空字符串,或者"white", "black", "gray", "bump"(说明此纹理是一个凹凸纹理)
Float/Range & 这个没啥说的,跟浮点数初始化一样一样的
Vector & 4维向量,其中4个数均为浮点数 (x,y,z,w)
{ options }&这里注意了,{options} 仅仅用于纹理类型,比如上面提到的2D,Rect,Cube,对于这些类型,如果没有options可填,至少要写一个空的{},否则编译出错。可以使用空格将多个options(选项)分开 ,可用的options(选项)如下:
&TexGen texgenmode:纹理坐标自动生成的方式。可以是ObjectLinear, EyeLinear, SphereMap, CubeReflect, CubeNormal其中之一,这些方式和OpenGL中的纹理坐标生成方式相对应,具体详见这篇。注意当你写Vertex Function时,纹理坐标产生方式将被忽略。
下面举几个属性值写法的例子:
// 定义了一个半透明(alpha=0.5)效果的红色作为默认颜色值
_MainColor(&Main Color&,Color)=(1,0,0,0.5)
// 定义了一个默认值为白色的纹理
_Texture(&Texture&,2D) =&white& {}
注意属性值的定义末尾处不需添加分号。
标签(Tags)
你的表面着色器可以用一个或多个标签(tags)进行修饰。这些标签的作用是告诉硬件何时去调用你的shader代码。
在我们的例子中,我们使用:Tags {&RenderType& = &Opaque&},这意味着当程序去渲染不透明的几何体时,将调用我们的shader,Unity定义了一系列这样的渲染过程。另一个很容易理解的标签就是Tags {&RenderType& = &Transparent&},意味着我们的shader只会输出半透明或透明的像素值。
其它一些有用的标签,比如&IgnoreProjector&=&True&,意味着你渲染的物体不会受到projectors(投影仪)的影响。
&Queue&=&xxxx&(给shader所属的对象贴上渲染队列的标签)。当渲染的对象类型是透明物体时,Queue标签能产生一些非常有趣的效果。该标签决定了物体渲染的顺序(译者注:我猜测它的工作方式是这样的,一个场景中有很多个物体,当这些物体被渲染时,必须有一个渲染的顺序,比如背景应该比其他物体先渲染出来,否则背景会将之前渲染的物体遮挡住,具体方法是将背景使用的shader中贴上一个&Queue&=&Backfround&标签,这样使用该shader的物体将被贴上Background的标签。总之当渲染整个场景时,unity会根据这些渲染队列的标签决定按什么顺序去渲染对应标签所属的物体)。
Background & 在所有其他物体渲染之前渲染,被用于天空盒或类似的背景效果。
Geometry(默认tags为geometry) & 适用于大多数物体。非透明物体使用这种渲染顺序。
AlphaTest & 顺利通过alpha测试的像素(alpha-test是指当前像素的alpha小于一定的值就舍弃该像素)使用该渲染顺序。单独设置该渲染顺序是因为在所有实体渲染过后,该渲染顺序将对渲染经过alpha测试的物体更有效率。
Transparent & 该渲染标签所属的物体将在标签为Geometry和AlphaTest之后的物体渲染,并且这些贴着Transparent的所有物体本身是从后往前依次渲染的。任何经过alpha-blended的物体都应该使用该标签(译者注:alpha-blended是指使用当前像素的alpha作为混合因子,来混合之前写入到缓存中像素值,此时注意shader是不能写入深度缓存的,因为如果不关闭写入深度缓存,那么在进行深度检测的时候,它背后的物体本来我们是可以透过它被我们看到的,但由于深度检测时,小于它的深度就被剔除了,从而我们就看不到它后面的物体了),玻璃和粒子效果比较适合该渲染标签。
Overlay & 该渲染标签适合覆盖效果,任何最后渲染的效果都可以使用该标签,比如透镜光晕。
有趣的是你可以给这些基本的渲染标签进行加加减减。这些预定义的值本质上是一组定义整数,Background = 1000, Geometry = 2000, AlphaTest = 2450, Transparent = 3000,最后Overlay = 4000。(译者注:从此处我们也可以一窥究竟,貌似数值大的后渲染。)这些预设值这对透明物体有很大影响,比如一个湖水的平面覆盖了你用广告牌制作的树,你可以对你的树使用&Queue&=&Transparent-102&,这样你的树就会绘制在湖水前面了。
Shader的整体结构
让我们回顾下shader代码的结构。
#pragma surface surf Lambert 这段代码表示其中surface表示这是一个表面着色器,进行结果输出的函数名称为surf,其使用的光照模型为Lambert光照模型。
我们的CG程序使用了一种经过修饰的类C语言 && CG语言(是Nvidia和微软共同出品的一种shader语言)。详见 && 我在文中也会介绍一些基本的Cg使用方法。
浮点数类型(float)和向量值类型(vec)一般都会在末尾加上2,3,4这些数字(float2,float4,vec3&)表示该类型具体有几个元素组成。这种定义方式使数值操作变得更方便,你可以将其当做一个整体使用,或者单独使用其分量。
//定义一个浮点类型的二维坐标
//定义一个颜色变量(4个浮点值分量的颜色值)
//通过点乘得到3个浮点值分量的颜色值
float3 multipliedColor = color.rgb * coordinate.x;
你可以使用.xyzw或.rgba来表明你使用的变量类型具体的含义,比如.xyzw可能表示的是旋转四元数,而.xyz表示位置或法向量,.rgba表示颜色。当然,你可以仅仅使用float作为单个浮点值类型。其实对.rgba等分量访问符的使用也称作swizzle,尤其是对颜色的处理,比如颜色空间的转换可能会用到它,比如color=color.
你将会遇到half(半精度)和double(双精度)类型,half(一般16bit)即正常float(一般32bit)的一半精度,double(一般64bit)是正常float的两倍精度(此处的倍数衡量的方式不是指表示的范围,而是表示可以使用的bit位数)。使用half经常是出于性能考虑的原因。还有一种区别于浮点数的定点数fixed,精度更低。
当你想将颜色值规范到0~1之间时,你可能会想到使用saturate函数(saturate(x)的作用是如果x取值小于0,则返回值为0。如果x取值大于1,则返回值为1。若x在0到1之间,则直接返回x的值.),当然saturate也可以使用变量的swizzled版本,比如saturate(somecolor.rgb);
你可以使用length函数得到一个向量的长度,比如float size = length(someVec4.xz);
如何从表面着色器输出信息
我们的surface function(表面函数)每个像素调用一次,系统已经事先计算出当前处理的像素的输入值(准确来说应该是输入结构体,即Input IN中的Input类型)。 它是根据每个网格上的面片,并进行插值得到的结果。
来看看我们的surf函数
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).
很明显我们可以看出,我们返回了o.Albeodo值 & 该值是Unity为我们定义的SurfaceOutput结构体中的某个成员。接下来让我们看看SurfaceOutput具体定义了哪些成员。该Albedo表示像素的颜色。
struct SurfaceOutput {
half3 A //该像素的颜色值
half3 N //该像素的法向量
half3 E //该像素的辐射光,辐射光是最简单的一种光,它直接从物体发出并且不受任何光源影响
half S //该像素的镜面高光
half G //该像素的发光强度
half A //该像素的透明度
你只要将该结构体中值交给Unity,Unity会自动根据这些值产生最终效果,而不需要你关心其中的细节。
我答应你们的干货就在下面
首先看看作为我们surf函数的输入是啥?
我们定义了一个输入结构体如下:
struct Input {
float2 uv_MainT
通过简单地创建结构体,我们告诉系统当我们每次调用surf函数时,获取MainTex在该像素的纹理坐标。如果我们有第二个纹理叫做&_OtherTexture,我们可以通过在输入结构体中添加下面代码得到它的纹理坐标
struct Input {
float2 uv_MainT
float2 uv_OtherT
如果对于其他纹理,我们有第二套纹理坐标,我们可以这样做:
struct Input {
float2 uv_MainT
float2 uv2_OtherT
此时对于我们所使用的所有纹理,我们的输入结构体包含一套uv坐标或者一套uv2坐标。
如果我们的shader很复杂并且需要知道像素的其他相关信息,我们就可以将以下变量包含在输入结构体中,以此来查询其他的相关变量。
float3 viewDir & 视图方向( view direction)值。为了计算视差效果(Parallax effects),边缘光照(rim lighting)等,需要包含视图方向(view direction)值。
float4& with COLOR semantic(比如float4 currentColor,即用户自定义和颜色相关的变量名称) & 每个顶点(per-vertex)颜色的插值。
float4 screenPos & 为了反射效果,需要包含屏幕空间中的位置信息
float3 worldPos & 世界空间中的位置
float3 worldRefl & 世界空间中的反射向量。如果表面着色器(surface shader) 不为SurfaceOutput结构中的Normal赋值,将包含这个参数。
float3 worldNormal & 世界空间中的法线向量(normal vector)。如果表面着色器(surface shader) 不为SurfaceOutput结构中的Normal赋值,将包含这个参数。
INTERNAL_DATA & 相对于上面的float3 worldRefl和float3 worldNormal,如果表面着色器为SurfaceOutput结构中的Normal赋值了,将使用该参数。为了获得基于每个顶点法线贴图( per-pixel normal map)的反射向量(reflection vector)需要使用世界反射向量(WorldReflectionVector (IN, o.Normal)),其中o.Normal表示的是切空间的法向量,而非世界坐标系下的法向量。
你可能会问上面的COLOR semantic是什么意思?当你写一个正常的片段着色器时,你得告诉别人你的输入结构体每个变量代表什么意思?如果你够疯狂,你可以试试下面这样定义:float2 MyUncleFred : TEXCOORD0; 并告诉别人MyUncleFred表示该模型的uv坐标。(画外音就是这种变量命名方式很令人费解)在表面着色器中你唯一担心的就是对COLOR类型的定义。float4 currentColor : COLOR;可以看做目前已经经过插值后的像素颜色。当然你也可以不用关心这些,不过建议你命名上最好规范些,方便自己也方便别人。
该shader实际做了哪些事?
现在我们还有两行代码没有详细讨论:
Sampler2D _MainT
对每一个属性值,我们定义了属性值区域(Properties Section),该区域用来定义CG程序中使用的变量。在使用中,我们必须保证属性名称一致。
注意输入结构体中的uv_MainTex是uv+对应属性值(文中为_MainTex,注意前面带下划线是CG官方推荐的写法),如果你使用uv2,那将写作uv2_MainTex。注意Sampler2D _MainTex中的_MainTex变量是一个Sampler2D(这个Sampler2D,可以理解为引用一个2D Texture),它引用了Properties中的_MainTex(译者注:注意两者同名。解释通了sampler2D是什么之后,还需要解释下为什么在这里需要一句对_MainTex的声明,之前我们不是已经在Properties里声明过它是贴图了么。答案是我们用来实例的这个shader其实是由两个相对独立的块组成的,外层的属性声明,回滚等等是Unity可以直接使用和编译的ShaderLab;而现在我们是在CGPROGRAM...ENDCG这样一个代码块中,这是一段CG程序。对于这段CG程序,要想访问在Properties中所定义的变量的话,必须使用和之前变量相同的名字进行声明。于是其实sampler2D _MainT做的事情就是再次声明并链接了_MainTex,使得接下来的CG程序能够使用这个变量。),他可以根据指定的uv坐标来提供对应纹理上的像素值,而此处uv_MainTex的作用就是提供纹理_MainTex的uv坐标值。
如果我们定义了一个_Color变量,我们可以定义它的属性为
我们surf函数中唯一一行代码
o.Albedo = tex2d( _MainTex, IN.uv_MainTex).
tex2d的作用是利用IN.uv_MainTex所代表的uv坐标(注意我们上面指定了uv坐标产生的方式,所以此处的IN.uv_MainTex是自动生成的)对纹理_MainTex进行采样。此处,对于o.Albedo我们只取颜色分量中的rgb三分量,其中alpha值(透明度)目前不需要,至少对于非透明物体alpha值得作用不大。
如果你要设置alpha值的话,可以像下面这样赋值
float4 texColor = tex2d( _MainTex, IN.uv_MainTex );
o.Albedo = texColor.
o.Alpha = texColor.a;
你已经了解了很多的术语,但是目前我们所写的shader还相当有限,但是当学习完第二部分教程后,我们就可以做一些很酷炫的shader了,因为第二部分我们将开始使用多重纹理,法向量等等酷炫技术。
在第二部分中,我们创建了一个实现积雪效果的shader,根据积雪的程度来修改模型,以呈现不同效果。
在第三部分我们改进了我们的shader来混合岩石边缘的积雪。
在第四部分,我们使用黑色边缘和渐变纹理来创建了具有卡通效果的shader。
在第五部分,我们创建了一个顶点/片段多通道凹凸纹理着色器(vertex/fragment multipass bumped shader) & 其复杂程度远远超越表面着色器
在第六部分,我们创建了一个顶点/片段着色器(vertex/fragment shader)来制作相比于我们第四部分使用表面着色器制作的卡通效果shader更好的shader。
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:http://www.cnblogs.com/polobymulberry/p/4314147.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!

我要回帖

更多关于 怎样才能快速学好英语 的文章

 

随机推荐