什么是Shader

光看字面的意思「Shader」不知道是什麼玩意兒,硬翻成中文「著色器」似乎也難以摸著頭緒!剛開始接觸圖學的我完全搞不懂它有什麼作用,然後盲目地學著OpenGL:P直到老師說:「只要你學會Shader,就可以做到別人辦不到的效果。」哈~上學期末有教到,只是很意外地沒聽懂,雜務太多不是件好事呢!

我發現網路上很少有繁體中文的教學資源,雖然可以直接看英文來學習,然而對一個初學者來說,可能會誤解英文字面上的意思,於是我打算從定義著手,恰好發現大陸的網友有貼Shader的定義,從什麼是Shader,接下來延伸到Vertex Shader和Pixel Shader,直接把原文貼過來,因為寫得真是太好了!

通俗解釋:什麼是管線?什麼是流水線?什麼是Shader?

* 什麼是Shader?Shader可以翻譯為著色器,分為Vertex Shader & Pixel Shader,即:頂點著色器和像素著色器。Shader主要指的是可編程管線的算法片段
* 什麼是管線?因為圖形渲染象流水線一樣的順序執行,所以形象說法,下文所涉及的處理流水線就是這種東西。

需要注意的:關於老顯卡和新顯卡的區別是什麼?

* 以前老顯卡是不能編程的,所以叫固定管線。
* 詳細說明:以前固定管線時代,頂點的運算是固定不變的,就是坐標變換,比如投影到屏幕上的坐標換算,後來GPU出現了,頂點的運算就可以編程了,把這些操作頂點的算法叫shader。

通俗解釋:什麼是Vertex Shader?

* 什麼是Vertex?稱頂點,由於模型是由很多坐標點定義的,這些點就是Vertex。
* 什麼是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(Direct3D)在不同的文檔裡面有不同的叫法,Nvidia在自己的OpenGL擴展中把Vertex Shader叫做Vertex Program、把Pixel Shader叫做Texture Shader,3D labs在自己提出一份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的一般術語似乎是一個明智的做法。)

你可能感兴趣的:(opengl)