3d Vertex Shader And Pixel Shader

Vertex Shader & Pixel Shader
分类: shader 2008-11-07 10:47 5234人阅读 评论(0) 收藏 举报
作为游戏策划还是得懂得一些引擎的运作原理的,其实以下的内容我也很难用专业的方式去解释,昨天和一个程序员聊了会天后,发现了解Vertex Shader & Pixel Shader的重要性,因为通常程序员口中总会有一些专业性的术语,我们最好能够理解它们是什么。不过,在我们了解Vertex Shader & Pixel Shader之前,首先得知道什么是shader,什么是管线,什么是流水线。

通俗解释:什么是管线?什么是流水线?什么是Shader?

什么是Shader?Shader可以翻译为着色器,分为Vertex Shader & Pixel Shader ,即:顶点着色器和像素着色器。Shader主要指的是可编程管线的算法片段。
什么是管线?因为图形渲染象流水线一样的顺序执行,所以形象说法,下文所涉及的处理流水线就是这种东西。
需要注意的:关于老显卡和新显卡的区别是什么?

以前老显卡是不能编程的,所以叫固定管线。
详细说明:以前固定管线时代,顶点的运算是固定不变的,就是坐标变换,比如投影到屏幕上的坐标换算,后来GPU出现了,顶点的运算就可以编程了,把这些操作顶点的算法叫shader。
通俗解释:什么是Vertex Shader?

什么是Vertex?称顶点,由于模型是由很多坐标点定义的,这些点就是Vertex。
什么是Vertex Shader?Vertex shader是改变物体模型外形的,由于模型是由点构成的,因此改变点就是改变外形,比如星际争霸2demo片中所展示的那个神族母舰黑洞的技能效果,扭曲了单位的外型。
通俗解释:什么是Pixel Shader?

什么是Pixel?象素,即一个象素点,象素点可以变化不同的颜色,由众多的象素点就可以组成我们现在所见的电脑显示内容。
什么是Pixel Shader?当模型顶点变换完之后,是需要填充颜色的,这些填充算法是针对屏幕上的每个像素的,所以叫Pixel Shader(像素着色器),以前这些内容是不能通过编程控制的,后来显示卡的GPU出来后就可以编程控制了,因此这些算法叫piexl shader。
常见的毛发效果渲染:游戏引擎里面,动物身上所渲染的一根根毛发,就是用了Pixel Shader,因为毛发这种是针对每个像素的,所以要用到Pixel shader。
专业解释如下:

1.固定功能的图形处理流水线(fixed function graphics pipeline)

能够实现Vertex Shader和Pixel Shader的显卡的图形处理流水线被称作为是可编程的,相对而言,在此之前的图形处理流水线被称作为是固定功能(fixed function),下面是OpenGL图形处理的一个简图:(图片被华丽的吃掉了-_-||)

完整的OpenGL图形处理流水线为称作为OpenGL机器(OpenGL machine,在OpenGL参考手册上可以找到这份框架图),就像一个电路图一样,上面有许许多多的开关,我们可以打开或者闭合这些开关,还可以设置图中各个处理单元的参数以控制处理的方法,但是无论如何整个系统的功能已经确定下来了,你只有使用或者不使用某些功能和控制某些功能的具体执行方法的权利而无法实现自己定制的功能,所以这样的图形处理流水线被称作为是固定功能的。(有实力的显卡厂商在自己的OpenGL实现中添加了许多OpenGL扩展实现了一些标准OpenGL规范所没有的功能,现在有了可编程的图形流水线,一般用户也有机会实现一些自己定制的功能。)

2.Vertex Shader & Pixel Shader

虽然实现Vertex Shader和Pixel Shader功能的图形流水线被称作为是可编程的,但是实际上可编程的只有流水线的一部分,正如Vertex Shader 和Pixel Shader的字面意思一样,现在可编程的部分只有处理顶点的和处理象素的单元。

Vertex Shader 和 Pixel Shader在不同的文档里面有不同的叫法,Nvidia在自己的OpenGL扩展中把Vertex Shader叫做Vertex Program、把Pixel Shader叫做Texture Shader,3Dlabs在自己提出一份OpenGL 2.0的提议里面把这两者分别叫做Vertex Shader和Fragment(片元)Shader。抛开叫法的差异,实际上的功能都是差不多的,下面的一段话对这种状况作了一个完美的解释:

Shader or Program? Shader has been used as the preferred name as this fits in with common usage in RenderMan and DX8. There is some argument that shading has connotations of being a color operation so doesn't fit with a vertex operation. RenderMan doesn't make this distinction, nor does DX8. It seems wise to go along with the common usage of shader as a general term for a program which operates on some part of a graphics pipeline.

(Shader 还是 Program,在RenderMan和DX8中,通常情况下倾向于使用Shader这个名字。这个叫法有一些争议,因为Shading蕴涵地表示为进行了相关的颜色操作而不适合用来描述顶点操作。但是在RenderMan和DX8中并没有理会这种区别。所以跟随通常的叫法,把Shader作为在图形处理流水线某些部分起作用的program的一般术语似乎是一个明智的做法。)