标签:
这篇文章是我在学习蛮牛的一套关于Shader教程(http://www.unitytrain.cn/course/96)后的简单总结,个人感觉这套教程并不是以高级Shader编程为目的的,更像是授人以渔的宗旨。下面我会分为三个部分:Shader简述、图形学基础,Cg简介为大家介绍Shader的相关内容,也算是做一个总结。
一:Shader简述
a.先说一下GPU与CPU的区别,简单说:GPU主要负责跟显示相关的数据处理,而CPU主要负责操作系统和应用程序。为什么不把显示相关的数据直接交给CPU处理呢?下面附上教程中的解释:
b.Shader分类。Shader中文翻译为“着色器”,含义是:可编程图形管线。主要分为:Vertex Shader和fragment Shader,即定点Shader和片段Shader。上面有一个概念是“图形管线”,简单解释就是:计算机处理图形显示的处理流水线。
c.Shader 的主流编程语言。主流的Shader编程语言主要有HLSL、GLSL、CG。下面简单说一下区别:HLSL(High Level Shader Language)是微软基于DX的作品,只能运行在Windows平台上。GLSL(OpenGL Shading Language),OpenGL着色语言,是用来在OpenGL中着色编程的语言(OpenGL是个定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口),是跨平台的着色器语言。到这里,我们已经可以发现有一个比较麻烦的问题出现了,就是我们底层图形驱动限制了上层的编程语言,一旦想要改动图形驱动库,那就不得不重写整个Shader Files,此时CG就应运而生了,CG在HLSL和GLSL上做了进一步封装,屏蔽了上层的着色器语言对底层图形库的依赖。
d.Unity Shader。ShaderLab其实是Unity对Shader语法结构的一种包装,其中支持三种Shader:surface Shader、Vertex and Fragment Shader 和 Fixed function shader Fixed function shader 是一种比较“保守”的Shader(兼容性最好),vertex and fragment Shader可以只用HLSL或GLSL或CG语言区编写,surface shader是对Vertex and fragment的一种语法包装,最终也会被翻译中Vertex and fragment Shader。(以上更具体信息的可以参考官方文档http://docs.unity3d.com/Manual/index.html)
二:图形学基础
个人感觉这一小节的内容对于未接触过图形学的人来说是挺有价值的,扫清了以前对于在Untiy中的坐标转换和渲染过程等的盲点。下面分两个小节去描述该部分的内容。
a.3D数学基础。其实3D数学无非就是矩阵的相关操作,对于学过线代的同学肯定都不是问题,这里我就简单介绍一下。
1.坐标系与向量。3D分为左手和右手坐标系,可以参考(http://www.cnblogs.com/mythou/p/3327046.html),示意图如下:
2.向量相关的东西就不啰嗦了,比较重要的就是向量点乘和叉乘,这里附上参考文章(http://blog.csdn.net/augusdi/article/details/20037851)。
3.矩阵相关。在3D数学中,矩阵往往代表着一种变换,这也是坐标系转换所依赖的数学原理。大家在Unity中肯定都听过“MVP矩阵”,MVP矩阵其实就是一种通过矩阵操作实现坐标系的转换一种方式。Unity中,有3中四种坐标系:模型坐标系、世界坐标系、摄像机坐标系、屏幕坐标系。这其实是3D图像显示的一个流程:从模型本身坐标利用_ObjectToWorld(即M矩阵)转换到世界坐标系,再利用_WorldToCamera(即V矩阵)从世界坐标系转换到摄像机坐标系,最后利用_Projection(P矩阵)实现从摄像机到屏幕坐标系的转换,并最终把3D图像显示在屏幕上,下面附上一篇百度文库的资料(http://wenku.baidu.com/link?url=A3AGV805UK5rcsEjkaL1h6QjnxsktvCscyNJqaHvfe2cIhwXMam6ZzH4Gxbu_XB7Jd7ripxjd0eR51Q6cPt9xPxTiX3MeHtFaWkwexBlZti)。
矩阵几种重要的操作有:矩阵的行列式、矩阵的转置、矩阵四则运算、矩阵逆……这些知识这里就不啰嗦了,下面简单介绍一下几种常见矩阵变换。
绕坐标轴旋转矩阵:
缩放矩阵:
投影矩阵
平移矩阵
以上是几种比较常用的矩阵,更多的信息就得靠度娘和Google了。
b.下面介绍几个简单的图形学的应用:光照剔除,漫反射和高光的实现方式。
1.光照剔除。到这里必须了解“法线的概念”(始终垂直于某平面的虚线),我们的视角即从物体到摄像机的向量,如果法线N与视线E形成的角度小于90度,那么观察者应是大约是在正面,反之大于90度应在该面的反面,此时应是无法观察到物体的(法线的求得使用向量差乘,角度计算可以使用向量的点乘),这时候就需要将其剔除了,下面两幅图简单说明一下:
2.漫反射(Diffuse 是投射在几盒体表面上的光向各个方向反射的现象),可以简单理解成光照对物体表面颜色的影响(在Unity中默认的Shader其实就是漫反射加环境光的综合作用)。那么该怎样计算光照对物体颜色的影响程度呢?此时还是需要用到法线,我们使用法线和光向量(必须先标准化)的点乘作为影响该区域颜色的因子,这样再乘以该光源的颜色信息就可以得到对应受光照影响后的颜色了,下面用简图说明一下:
3.高光(Specular 光源照射到物体然后反射到人的眼睛里时,物体上最亮的那个点就是高光),从定义就可以得出高光其实和反射光与视角相互作用形成的,同样的我们在计算高光也是利用同样的原理:由入射光求反射光、再计算反射光和视向量的点乘得出影响因子,最后算出高光强度,简图说明一下:
以上是三种比较常见的光照相关的知识,更多资料只能依靠度娘了……
标签:
原文地址:http://www.cnblogs.com/lixiang-share/p/5025662.html