Shader的学习方法总结

做者esfog,原文地址http://www.cnblogs.com/Esfog/p/5537624.htmlphp


如何起步

  其实如今比几年前好多了,有了很多资源,不少热心网友写的教程,也有几本还能看的书。

  我仍是谈谈个人建议,首先找个游戏引擎(固然你也能够不用引擎直接本身写OGL或DX),一本合适的书。unity固然是如今最容易上手的了,书的话用来入门了解的有几本是我以为能够看的,但适不适合要看你本身了:

  1. 《GPU编程与CG语言之阳春白雪下里巴人》,严格说这不是一本书,是网上盛传的新人学习的必读物。

  2. 《Cg Programming in Unity》,这是Wiki上的一系列UnityShader教程,不过如今可能须要FQ看了。

  3. 《Cg教程_可编程实时图形权威指南》,由于Unity的Shader大部分仍是用CG语言来写的,这本书虽然年代有点早,但仍是值得一看的,并且Nvidia的网站上有最最新的英文版。

  4. 《Unity Shader入门精要》candycat1992,小姑娘这本书绝对的值得一看的,虽然是面向入门级的,可是里面涉及了不少底层的,原理的性的内容。国内Unity书总算有本值得买的了。

  别问我为啥不推荐那本《Unity 3D ShaderLab开发实战详解》,前面已经说了。

  有了书,打开引擎开始学,你须要的就是耐心和恒心了,我想学其余的知识也是同样吧。Shader的水很深,作好打持久战的准备,不断的练习,不断的尝试,不断的总结。

  在学习过程当中遇到问题是必然的,合理的使用搜索引擎,去论坛和站点和你们交流。保持一颗谦卑的心,别人总有比你强的地方,虚心的学习,慢慢的积累。若是你身边有一个能够请教的人,那就太好。就像我遇到Y君同样。

  当你以为本身入了一点门之后,就能够尝试着分析项目里的Shader代码了,结合着游戏中的实际效果,看看代码里用到了哪些你不知道的技术,或者说有什么你以为不合理的地方。若是有机会,就尝试着申请在项目里实际写Shader的工做。这样的锻炼是可贵的。惋惜我当初作Unity时候没有这样的机会。

  起步的一开始必定会是有些无从下手的感受,度过这段时间,找到适合本身的节奏,就会有个很快速的学习积累过程。要坚持。


如何提升

  刚接触Shader时候会有个迷茫期,其实当你学了一段时间,感受本身学到了不少东西之后,也会有个迷茫期,不知道怎么进一步的提升本身,感受本身该掌握的都已经掌握了,可是又写不出什么东西。

  正如我在前面说的,咱们总以为本身好像该学的都学了,又感受哪里好像没吃透。这说明咱们仍是没有触碰到咱们学习内容的全貌,才只看到整个知识体系的冰山一角。因此必定会经历这个从以为本身什么都会了,到感受本身什么都不会了的转变。这个转变是必要的,它意味着你将了解到更深更广的知识。

  废话不说了,通常咱们入了门之后还要去理解更多的知识,我总结一下,大概有几方面:

  1. 首先要对渲染管线有个透彻的了解,至少要知道每一步发生了什么。不少学Unity从业者说会Shader也就只停留在前面那个语法层次了。若是连渲染管线都不知道,就不要再往简历写会Shader了。这方面的资料不少,candyCat1992那本书以及《计算机图形学-基于3D图形开发技术》都有,还有Trace大神搬运过来的一套教程。了解渲染管线,能让你对Shader里的不少用法都能有更深刻的认识。

  2. 去学习OpenGL或者DirectX的知识(若是你经历足够能够左右开弓),看好,不是说HLSL或者GLSL这些Shader语法,而是OGL和DX。了解了渲染管线以后,再去了解一下图形API,试着动手写写,你才能真正的理解渲染管线的实际流程,以及那些被游戏引擎所隐藏起来的渲染逻辑。你也就能了解到Unity中的FBX模型里到底都放了什么数据,场景模型上的MeshFilter组件和MeshRenderer组件都是起什么做用的,等等。对这些图形API有了必定的掌握,不只能够对渲染流程有更深刻的了解,甚至能够本身开发一个简单的渲染引擎了。这方面的学习���料就太多了,学OGL就是红宝书,DX的话天然就是龙书

  3. 再有很重要的一块就是图形算法,想要在经过Shader作出各类惊艳或者特殊的渲染效果,可不是只学会写Shader语法就能够作到的,就像大学里学程序设计后还要学习算法是同样的,图形渲染中也有大量的算法,从最基础的光照算法,到HDR,FXAA,Toon。再到最近次时代流行的PBR等等。有不少已经很成熟的算法,但这些算法不必定彻底适合你的项目或者平台,因此必须了解他们改进它们,甚至研究出新的算法。这个过程估计是最痛苦的了,由于国内的资料很少,讨论的人也很少,算法中每每还涉及到大量的数学和物理知识。若是能持续不断的坚持学习和实践,那你也许就会是万千游戏开发大军中的的佼佼者。这方面的书虽然很少,基础类的我就不说了,不少书上都有,有一些大部头的经典如:《GPU Gems》系列,《Real-Time Rendering》,《Physically Based Rendering》。国内能读完这些书的人应该是是不多的。我本身还不到这个层次,不过也准备要开始塌下心来学习。还有一个论坛OpenGPU,也推荐给你们,不过这个不是入门向的,里面的大神太多了,不要在里面提太没养分的问题,会被鄙视的。

  4. 补补数学再学点物理知识吧。线性代数的重要性就不用我说了,若是能力和精力容许的话,就多补一补,我这数学渣就很少说话了,不过我也有时间会学一学的。这方面也有一些好的资料。我手头就有一本《Mathematics for 3D Game Programming and Computer Graphics》。这个我就很少说了,没事多学学,省着用到了挠头。

  ...

  其实还有不少,好比把C++好好学一学,不过已经没关系了,路很长,要怎么走仍是要靠你本身。我也只是个必定意义上的入门者,不想误导别人。你们一块儿提升,互相帮助吧。