想成为一个优秀的游戏程序员的我，如何才能快速入门Shader并用于开发，弥补我现在的最大不足?
其实我觉得Shader之所以难学，并不是因为Shader自身难，而是因为计算机图形学难学，而且对于完全没有基础的同学来说这个过程是几乎是不可能通过自学速成的（有专门的老师一对一辅导就另说）。 学习Shader之前，了解计算机图形学的基础知识是必须的，如果没有图形学的基础，直接学习写Shader就好比建一座空中阁楼。Shader只是3D渲染管线中的一个环节，它在执行前需要先获取输入数据。如果连Shader需要什么样的输入数据，这些输入数据怎么得到都不知道，是不可能学会写Shader的。其实主流的Shader语言（HLSL和GLSL）无非就是C语言的变种而已，除了部分关键字的区别，语法几乎一样。 然而打基础的阶段恰恰就是最艰难的阶段，因为计算机图形学中涉及了很多专业概念和术语，这些对没怎么接触过图形学的初学者来说非常抽象，很多和我一起选修图形学的同学都没有跨过这道坎——大多数同学考试靠死记硬背过关，能够独立完成大作业的同学目测不超过三分之一（我们的大作业是组队用OpenGL的固定渲染管线写一个场景渲染demo）。 下面是我个人学习图形学的历程，大体来说可以分为四个阶段，可以给题主做一个参考： 第一阶段：学习固定渲染管线（了解基本概念） 这个阶段我是在学校完成的，我们学院使用的教材是Steve Cunningham的《Computer Graphics》,这个时候需要一边书学习基本概念（顶点、索引、空间变换、纹理映射、基本光照模型、GPU架构等），一边学习图形渲染API（OpenGL or DirectX）。 Ps：固定渲染管线现在基本已经被淘汰了，但学习它也并不是完全没有意义的。就我个人看来，学习DirectX的难度明显比OpenGL更高，如果感觉直接学习可编程管线非常吃力，不妨先学习固定渲染管线打好基础，这样以后学习如何写Shader时，可以先通过实现固定渲染管线的效果来练手。这个阶段可以《Computer Graphics》中文版和英文版相互对照看，再买一本《OpenGL编程指南》（封面是红色的，俗称OpenGL红宝书）。 第二阶段：学习无光照的可编程管线 把图形学的基础学得差不多了，就可以开始学习可编程渲染管线了，也就是写最简单的Shader。这个阶段我并没有系统地花时间来学习，而且也没有找到好的学习资料，因此本人在这个阶段的学习比较混乱。最先是跟某坑爹老师做了一个国创项目，在iOS平台用OpenGL ES写的，涉及到了简单的Shader（Shader部分我记得就花了一天不到的时间，看别人的demo写出来的，当时没有深究具体的原理= =）。之后断断续续地看了一些微软官方的DirectX Tutorial和DirectX SDK中的Sample，写了几个简单的demo。在对可编程渲染管线的基本流程仍然一知半解的情况下，我又跑去学习了OpenGL ES，这个过程用OpenGL ES仿造libGDX引擎写了一个简单的2D安卓游戏引擎。如果你跟我一样先学习了固定渲染管线，在这个阶段会接触到一些新的概念，比如VertexBuffer和IndexBuffer，它们都是在固定渲染管线的基础上做出的改进。这个阶段我最大的学习收获是了解了简单的Shader工作原理，对坐标系的MWVP（模型/世界/视图/投影）变换有了十分深刻的理解（理解空间变换过程对写Shader非常重要）。 Ps：如果只是写一个无光照的可编程渲染管线的demo并且了解可编程渲染管线与固定渲染管线的区别，可以向同事请教，我觉得花几个晚上就够了（前提是对固定渲染管线已经足够了解）。 第三阶段：学习带有简单光照的可编程管线 在这个阶段我用DirectX9实现了OpenGL固定渲染管线的大部分效果，期间主要看的书是《3D游戏程序设计入门》和某不知名的HLSL语法手册，经过这个阶段的实践以后会有一种整个人都豁然开朗的感觉。 第四阶段：学习高级视觉效果 去年毕业来公司以后，导师推荐我看了NVidia的《The Cg Tutorial》，这篇教程里介绍了很多视觉效果实现的基本思路以及shader的写法，对我的启发很大。不过遗憾地是导师没过多久就跳槽了，所以我又得开始自学了（导师是项目组里唯一一个对图形学有了解老员工= =）。现在我正处于一边看UE4源码，一边写3D渲染引擎的状态，目前的成果是抄袭OGRE实现了场景树管理，根据某大大博客的思路实现了一个半残的动态Shader生成系统，抄袭UE4实现了一个半残的PBR ForwardShading。这个过程可以说是看起来容易做起来难，一不小心就被某一个细节坑得半死。。。 计算机图形学之所以让大家觉得难学，我觉得主要原因有三个：涉及大量晦涩的专业术语；涉及大量数学理论和计算；理论与实践之间的埋了太多的坑。。。。 最后再补充说明一下： 1. 我觉得要想真正学会写Shader，至少需要掌握基本的线性代数知识，与数字信号处理有关知识也需要有了解，不然一看到论文里的“卷积”，“滤波”，“插值”，“傅里叶变换”这些词就要懵逼了。 2. 另外，最好一边学习一边做笔记，这样可以每隔一段时间就进行一次整理，有助于建立系统的知识框架，同时可以发现自己遗漏的知识点，有针对性地巩固加强，也便于日后回顾。