❶ 什麼是Shader
2D圖形,就是無論你如何移動視角,地面上的建築物、花草樹木樣子都不會變,而3D圖形則不 同,隨著視角的變換,你看到的物體也在變化,從正面變成側面,越遠的物體越小,越近的越大,與現實生活中人眼看到的情景非常相似。 shader就是專門用來渲染3D圖形的一種技 術,通過shader,程序設計人員可以自己編寫顯卡渲染畫面的演算法,使畫面更漂亮、更逼真。 幾年前並沒有shader這個東西,所以那時候的顯卡,就不 支持shader,而只支持固定管線渲染,游戲畫面也沒有現在的酷。 shader又分兩種 ,一種是頂點shader(3D圖形都是由一個一個三角形組 成的,頂點shader就是計算頂點位置,並為後期像素渲染做准備的),另一種是像素shader,像素shader顧名思義,就是以像素為單位,計算光 照、顏色的一系列演算法。 幾 個不同的圖形API有各自的shader語言:在DirectX中,頂點shader叫做 vertex shader ,像素shader叫做 pixel shader; 在OpenGL中,頂點shader也叫做 vertex shader ,但像素shader叫做 fragment shader。 此外顯卡晶元廠商nVidia還推出CG顯卡編程語言,也支持 shader。 shader 有很多不同的版本:所以,即使你的顯卡支持shader,但可能版本不夠高,所以無法支持比較新的游戲使用的 shader。 一般來說,大部分游 戲都支持不同版本的shader,為的是讓盡可能多的機器都能運行,為此需要做很多額外的工作。 除了顯卡不夠新之外,不同顯卡廠商對shader的支持也不盡相同,所以同一個游戲,一樣的 設置,在n卡和ATI的卡上,表現可能大不一樣。 另外,安裝官方最新的驅動程序也是必要的。如果你安裝了錯誤的驅動程序,甚至是隨便從網上下載一個顯卡驅動,那麼即使你的顯卡支持 shader,也可能跑不了需要shader支持的程序,包括但不限於網路游戲! 三個level:
❷ shader編程怎麼學
學習方法
(1)由簡入繁:自己寫Shader,從最簡單寫起,簡單的測試通過了,再一點點往裡加。
(2)多調試:例如,有一個float變數x。假如x范圍是[0,1],則在frag片段函數里輸出 float4(x,0,0,1)的顏色,以紅色的深淺來觀察x的值;如果x范圍是[0,1000],則可在frag片段函數里輸出 float4(x/1000,0,0,1)的顏色。方法就這么簡單,具體根據需要去調整。
(3)結合查看UnityCG.cginc等文件,以及unity的自帶Shader,即Build-in Shader。
Build-in Shader下載地址
(4)看看書:建議看本教程的同時,多看看書。推薦英文的The CG Tutorial,也就是中文版的Cg教程_可編程實時圖形權威指南
相關教材鏈接
學習小技巧
(1)查看UnityCG.cginc等文件
使用Vertex and Fragment的CG時,會#include "UnityCG.cginc",用到裡面的很多函數,如TRANSFORM_TEX,UNITY_TRANSFER_DEPTH等函數的定義。那麼怎麼查看這些定義呢?
windows路徑:Unity\Editor\Data\CGIncludes
mac路徑:右鍵點擊unity圖標->show contents->Data->CGIncludes
該文件夾下有Unity關於Shader的庫,如UnityCG.cginc,UnityCG.glslinc,Lighting.cginc等。打開
UnityCG.cginc(寫字板MONODev等均可),後即可查看相關函數的定義。
(2)電子書的學習技巧
中文電子書,學起來快,好理解,但大多數是影印版。
英文電子書,可以很好的用關鍵詞搜索知識點。
(3)使用#prama only_renderers d3d9 , 限定編譯平台。(3)(4)配合使用效果更好
(4)打開編譯後的Shader,查看對應的匯編代碼或者OpenGL ES代碼。
方法:左鍵單機shader文件,然後在Inspector面板里點擊Open Compiled Shader.
❸ OpenGL和OpenGL Shading Language的關系
打個比方,你的PC上運行著一個使用了 opengl 的客戶端程序,這個客戶端程序同時會訪問一個伺服器(顯卡)提供的服務,那麼 shader 就是你上傳到伺服器上進行運行的程序。
這個「伺服器」(顯卡)比較特殊,提供很特定的服務(把客戶端提供的 3d 幾何圖形,根據攝像機位置等參數,經過一系列計算,轉換成屏幕顯示緩沖區 [framebuffer] 中的 RGB 數據)(這就是渲染流水線,原來由 opengl 在以軟體形式提供主要部分,大部分由 CPU 負責,顯卡負責一小部分例如只負責柵格化,隨著顯卡硬體技術發展,目前這個流水線,基本全部移至顯卡硬體中了,從而解放了 CPU 的負擔,讓 CPU 可以關注更重要的游戲邏輯部分。)。shader 就是伺服器上運行的服務中的一些組件(比如說,你可以理解為需要符合某個介面的 dll,相當於插件),所以你需要上傳你的 shader 組件給「伺服器」,然後「伺服器」就會調用你提供的組件(shader program)。
因為這個任務比較特殊,所以使用的編程語言也比較特殊,最早是類似匯編,但是這樣寫 shader 毫無疑問也太困難了點。所以後來就發展出了類 C 的高級語言,這就是 shader language。
opengl 制定了這樣的規范,程序員按照語言規則,寫出 shader 源碼,由 opengl - 顯卡(這兩者通常是難以區分的,因為硬體廠商也提供 opengl implement),像普通開發過程一樣,編譯,鏈接成「伺服器」可執行組件,提交給「伺服器」(顯卡)。
因此,程序員實際上同時負責客戶端程序(CPU)的全部和「伺服器」程序(GPU)的一部分。shader 提供給程序員根據自己的需要定製渲染結果的靈活性。
shader 有多種,分別對應著渲染過程的不同環節。最基本的兩個是 vertex shader 和 fragment shader。(後者在DirectX 中叫 )
vertex shader 設置幾何圖形的位置,並向 fragment shader 提供重要的數據。
fragment shader 主要在柵格化時為幾何圖形填充像素,換句話說,設置三角形內部點的 RGB。
❹ 怎樣學好 GPU 編程目前有哪些流行的 shader 語言
shader語言主要有三種:OpenGL的GLSL,DirectX的HLSL,和Nvidia的CG。
語言本身其實不難,比如HLSL跟C很像,用不了多久就能學會。難的在於如何寫出好Shader,這是圖形學的功夫。
建議先跟DirectX或OpenGL的Tutorial走一些例子,摸清楚Pipeline和Shader的工作原理。然後讀一些圖形學的書,推薦Real Time Rendering,記得出到第三版了。
讀了這些書以後大概就懂得如何使用著色器語言寫出各種效果了,熟練之後就可以嘗試接觸一些比較高級的材料,比如最新的DirectX示例,CUDA,從頭追看一遍GPU Gem, Shader X系列文章。GPU跟一般的計算機編程還不太一樣,理論性很強,想要自己發揮,還是需要有一定基礎的。
圖形學功底扎實的話各種語言都會一通百通,還是多看多寫多練。
❺ Opengl shader 主要用來做什麼shader完全是gpu處理么
找一下這本書《Shaders.for.Game.Programmers.and.Artists》,網上有。
❻ 請問directx和opengl是對顯卡的編程嗎那shader又是什麼三者有什麼關系呢
DirectX(Direct
eXtension,簡稱DX)是由微軟公司創建的多媒體編程介面。由C++編程語言實現,遵循COM。被廣泛使用於Microsoft Windows、Microsoft XBOX、Microsoft
XBOX 360和Microsoft XBOX ONE電子游戲開發,並且只能支持這些平台。最新版本為DirectX 12,創建在最新的Windows
8.1上。
OpenGL(全寫Open
Graphics Library)是個定義了一個跨編程語言、跨平台的編程介面的規格,它用於三維圖象(二維的亦可)。OpenGL是一個開放的三維圖形軟體包,它獨立於窗口系統和操作系統,OpenGL可以與Visual C++緊密介面,便於實現機械手的有關計算和圖形演算法,可保證演算法的正確性和可靠性目前,2.0版本開始加入了很多類似於DirectX中可編程單元的設計.
Shader Model(在3D圖形領域常被簡稱SM)就是「優化渲染引擎模式」。Shader(著色器)是DirectX中一段能夠針對3D對象進行操作、並被GPU所執行的程序。早在微軟發布DirectX 8時,Shader
Model的概念就出現在其中了,並根據操作對象的不同被分為對頂點進行各種操作的Vertex Shader(頂點渲染引擎)和對像素進行各種操作的Pixel
Shader(像素渲染引擎)。
到了Shader Model 4.0,在VS和PS之間引入了一個新的可編程圖形層--幾何渲染器(Geometry
Shader)。原來的Vertex Shader和Pixel Shader只是對逐個頂點或像素進行處理,而新的Geometry
Shader可以批量進行幾何處理。然而性能受到詬病,為了兼顧性能,在DirectX11(SM
5.0)開始引入了Tessellation來取代GS的部分功能。
說白點,三者的關系是,Shader Model是DirectX其中一個技術協議程序,而DirectX和OpenGL則是多媒體編程介面的競爭對手。
❼ opengl 使用多個shader為不同物體著色
不同的顏色空間有不同的取值范圍,這種不同有利於某些數值演算法的實現,
0.0-1.0是很典型的一種,常用於數學變換的中間結果
不過存儲的格式當中,恐怕更多還是變換回以整數為主的空間
很慚愧一直沒玩openGL,不過可以查一下shader用的是什麼顏色空間,
根據這個就可以找到一堆資料讓你理解啦
❽ Shader在OpenGL ES中是怎樣一般的存在
回到GLES中,GLES 1.0是固定管線(為了某些原因),不需要也不能寫Shader;GLES 2.0+是可編程管線,必須寫Shader。
建議題主少走點彎路,直接上可編程管線。雖然比固定管線稍微要多做點工作,但長遠來看是好的,能做出更炫的效果並充分利用GPU。
❾ OpenGL怎麼學就業能做啥呢
OpenGL就業主要能做3D游戲開發,學習需要一個系統的流程,如下:
openGL學習建議按照如下的步驟進行:
1、基本的線性代數知識,不需要很深入,大學時的線性代數拿出來復習一下足夠用了,特別是矩陣變換部分。
2、C++開發語言,一定要非常熟練。
3、《計算機圖形學》這個應該是高校教材了,這個也是所有圖形學的基礎知識。
4、《3D游戲編程大師技巧》等基礎入門教材,這一類圖書基本上是將基礎知識和openGL API如何使用結合起來,使得讀者可以開始上手開發。同樣的還有 https://learnopengl-cn.github.io/ 這一類網站,都是比較好的入門資料。
5、《openGL編程指南》俗稱「紅寶書」,《OpenGL Super Bible 5th》俗稱「藍寶書」,不過這兩本書更加適合作為查詢手冊,用到哪一塊需要深入了解時進行查詢。
6、再深入就是了解詳細的管線處理流程、shader語言開發等。
openGL主要屬於計算機圖形學方面的內容,這一塊屬於比較專業的領域了。
目前主要做3D游戲開發這一塊用得最多,大公司做游戲引擎開發主要以openGL為主,即便現在很多基於U3D開發的手游,至少也需要熟悉基本的openGL管線流程和一些shader知識。
其次,做一些專業領域的模擬會很多,再次在做各種濾鏡、特效方面也需要用到openGL知識,不過這些方面還需要圖像處理方面的一些知識。
PpenGL的設計
OpenGL規范描述了繪制2D和3D圖形的抽象API。盡管這些API可以完全通過軟體實現,但它是為大部分或者全部使用硬體加速而設計的。
OpenGL的API定義了若干可被客戶端程序調用的函數,以及一些具名整型常量(例如,常量GL_TEXTURE_2D對應的十進制整數為3553)。
雖然這些函數的定義表面上類似於C編程語言,但它們是語言獨立的。因此,OpenGL有許多語言綁定,值得一提的包括:JavaScript綁定的WebGL(基於OpenGL ES 2.0在Web瀏覽器中的進行3D渲染的API);C綁定的WGL、GLX和CGL;iOS提供的C綁定;Android提供的Java和C綁定。
OpenGL不僅語言無關,而且平台無關。規范隻字未提獲得和管理OpenGL上下文相關的內容,而是將這些作為細節交給底層的窗口系統。出於同樣的原因,OpenGL純粹專注於渲染,而不提供輸入、音頻以及窗口相關的API。
OpenGL是一個不斷進化的API。新版OpenGL規范會定期由Khronos Group發布,新版本通過擴展API來支持各種新功能。每個版本的細節由Khronos Group的成員一致決定,包括顯卡廠商、操作系統設計人員以及類似Mozilla和谷歌的一般性技術公司。
除了核心API要求的功能之外,GPU供應商可以通過擴展的形式提供額外功能。擴展可能會引入新功能和新常量,並且可能放鬆或取消現有的OpenGL函數的限制。
然後一個擴展就分成兩部分發布:包含擴展函數原型的頭文件和作為廠商的設備驅動。供應商使用擴展公開自定義的API而無需獲得其他供應商或Khronos Group的支持,這大大增加了OpenGL的靈活性。OpenGL Registry負責所有擴展的收集和定義。
每個擴展都與一個簡短的標識符關系,該標識符基於開發公司的名稱。例如,英偉達(nVidia)的標識符是NV。如果多個供應商同意使用相同的API來實現相同的功能,那麼就用EXT標志符。
這種情況更進一步,Khronos Group的架構評審委員(Architecture Review Board,ARB)正式批准該擴展,那麼這就被稱為一個「標准擴展」,標識符使用ARB。
第一個ARB擴展是GL_ARB_multitexture。
OpenGL每個新版本中引入的功能,特別是ARB和EXT類型的擴展,通常由數個被廣泛實現的擴展功能組合而成。