2013年4月5日 星期五

OpenGL基本瞭解(三)


著色器 (Shader)  // 部分內容參考 http://cg2010studio.wordpress.com/2011/06/29/shader/


* 什麼是Shader?Shader可以翻譯為著色器,分為Vertex Shader & Pixel Shader ,即:頂點著色器和像素著色器。Shader主要指的是可編程管線的算法片段
* 什麼是管線?因為圖形渲染象流水線一樣的順序執行,所以形象說法,下文所涉及的處理pipeline就是這種東西。
需要注意的:關於老顯卡和新顯卡的區別是什麼?
* 以前老顯卡是不能編程的,所以叫固定管線。
* 詳細說明:以前固定管線時代,頂點的運算是固定不變的,就是坐標變換,比如投影到屏幕上的坐標換算,後來GPU出現了,頂點的運算就可以編程了,把這些操作頂點的算法叫shader。

The OpenGL ES assembly line


在OpenGL中,GLSL的shader使用的流程与C语言相似,每个shader类似一个C模块,首先需要单独编译(compile),然后一组编译好的shader连接(link)成一个完整程序。



 Early life of a vertex. Top row is conceptual; bottom row is OpenGL’s view

 

Last three stages of a vertex before rasterization(光柵)

 

1. Vertex Shader

* 什麼是Vertex?稱頂點,由於模型是由很多坐標點定義的,這些點就是Vertex。
* 什麼是Vertex Shader?用來改變物體模型外形,由於模型是由點構成的,因此改變點就是改變外形

2. Pixel Shader 

* 什麼是Pixel?稱像素,即一個像素點,像素點可以變化不同的顏色,由眾多的像素點就可以組成我們現在所見的電腦顯示內容。
* 什麼是Pixel Shader?當模型頂點變換完之後,需要填充顏色,這些填充算法是針對屏幕上的每個像素,所以叫Pixel Shader(像素著色器),以前這些內容是不能通過編程控制的,後來顯示卡的GPU出來後就可以編程控制了,因此這些算法叫piexl shader。
* 常見的毛髮效果渲染:遊戲引擎裡面,動物身上所渲染的一根根毛髮,就是用了Pixel Shader,因為毛髮這種是針對每個像素的,所以要用到Pixel shader。




shaderType是vertex shader或pixel shader中的一种,由常量GL_VERTEX_SHADER和GL_FRAGMENT_SHADER来表示——后者就是我们常说的pixel shader。


如果任何类型为GL_VERTEX_SHADER的shader对象连接到program,它将产生在“可编程顶点处理器”上可执行的程 序;

如果任何类型为GL_FRAGMENT_SHADER的shader对象连接到program,它将产生在“可编程片断处理器”上可执行的程序。 (=> 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 ShaderPixel ShaderDirect3D)在不同的文檔裡面有不同的叫法,Nvidia在自己的OpenGL擴展中把Vertex Shader叫做Vertex Program、把Pixel Shader叫做Texture Shader,3D labs在自己提出一份OpenGL 2.0的提議裡面把這兩者分別叫做Vertex ShaderFragment(片元)Shader










沒有留言: