Shader 在現在圖形管線中可以負責多少部分?
這裡先針對OpenGL來說,想知道到目前為止,shader究竟是能解決多少個過程的渲染。
伴隨以下疑問:1.在頂點著色和像素著色的中間有光柵化過程,光柵化是不是也是封裝好不需要我們去修改了?2.對於非多邊形造型,我們是不是也要在程序中先將他們轉換成多邊形造型再傳入shader?比如說我有一個花瓶的切面曲線,是不是在程序里自己做造型,傳頂點給shader 就可以了?有沒有更好的方法?
3.對於曲線曲面精細化,shader 是怎麼完成的?我留意到Shader 並沒有比較適合傳輸曲線曲面方程的數據結構,那在實現的時候是怎麼做的?4.我已經學習了頂點和像素著色器。現在想知道幾何著色器和曲面細分著色器要怎麼來理解,有沒有很好的例子來說明。先謝謝大家!
shader泛指可編程管線中可執行的一些「函數」。底層API諸如OpenGL或者DirectX只是一個指令封裝。所以談shader可以忽略這些。
GPU的執行從邏輯上講是按照管線來執行,為什麼需要設計成管線可以參考[1]. 硬體具體實現可以參考Nv的官方Paper[2](隨便舉一個架構例子,有興趣可以再看看其他架構).
下面是Dx12的管線:
從GPU的設計從用戶角度來看,一代間不同硬體廠商的設計大差不差,因為AMD和Nv不可能為OpenGL或者DX單獨設計硬體,所以我們其實不需要也沒許可權去關注內部差異, 因此這張圖不影響你對shader和管線的理解.
shader就跑在上圖中可編程管線中. 具備基本概念後來回答題主問題:
- 光柵化屬於不可編程管線. 因此你無法更改.
- 目前GPU是這麼設定的. 你在DDC里做好曲面, 其實GPU是按照三角形來渲染的.
- DX10 - DX12新增了Hull/Tess/Domain/Geo 這些管線可以為你服務.
- 可以參看[3][4].
- From Shader Code to a Teraflop
- Fermi White Papers
- Dynamic Hardware Tessellation Basics
- From Terrain To Godrays: Better Use of DX11
- OpenGL CUDA Tessellation
1,目前有兩個模塊是不能修改的,一個就是光柵化,另一個就是曲面細分的細分階段。當然,也不是說完全不能自己寫,因為有compute shader存在,你可以跳過固定的光柵化過程用computeshader去模擬渲染,然而並沒有什麼卵用,因為人家得光柵化畢竟是硬體加速的。2,通用的方法確實是轉換成多邊形進行渲染。同樣的道理,現在有computeshader和曲面細分,你大可以在shader里依照曲面方程自動生成網格。我以前寫過一個3d版得貪吃蛇就是這麼做的,先用computeshader根據b樣條線生成一根四棱的曲條,然後再用曲面細分把它變成柔和的圓柱蛇體。但是這種方法並不是對所有模型都有效,至少對於遊戲來說很雞肋。3,同上,方程你要自己寫到shader裡面,computeshader和曲面細分都可以做到這一點。方程不同,shader也要做一些變化。
4,幾何著色器和細分著色器都可以產生額外的頂點(簡單的可以理解為比如輸入一個立方體,把它變成球,需要多產生一些點),這是其他著色器做不到的。而這兩個著色器也有區別:幾何著色器的每個線程,對於每個輸入的圖形,每次只能調用一個線程去做細分工作。而細分著色器的每個線程每次則可以調用無限多個線程去做細分工作。因此幾何著色器適合去做粒子系統那種,輸入的點賊多,但是每個點只需要一些小小的擴展的需求。而細分著色器則是對於類似於地形啊,水面啊這種單體細分比較複雜的部分比較好用。
Dx11渲染管線,其中圓角矩形是可編程部分。
曲面細分本身不能編程,但它前後的部分是可編程的。
光柵化是不可編程的,現在只有「點」,「線」,「三角形」這三種方法。所以,假如以後光柵化也能編程,就有可能能夠實現你說的「真正的曲面繪製」。當然,現在是沒有的,因為光柵化只認三角形。
(我倒是記憶里有那麼一點未來光柵化可編程化的映象……不確定)這個問題對我有點超綱,看看後面會不會有其他人來回答吧。謝邀,但是我對這些的了解比較淺,所以只能在我知道的範圍內粗淺的回答一下,如果有錯誤,還請見諒。
- 光柵化的基本過程是被硬體封裝好了,不需要修改的,但是從DX11開始在某種意義上算是提供了對光柵化過程的部分控制,主要體現在硬體抗鋸齒開啟後對子採樣的控制中。
- 對於可以用數學公式生成的幾何體,可以不需要模型,直接在shader中生成,如果不考慮D3D9時代的Higher-Order Primitives ,還可以在VS中控制頂點坐標,D3D10時代可以在GS中生成新的頂點,現在還有流行的RayMarch——這個技術連頂點都可以不要。
- 在Shader可以使用strcut來自定義各種數據結構,Shader的不同stage之間也可以使用特定的寄存器傳輸數據。曲面細分的細節可以查閱相關資料。
- DirectX SDK自帶了很多例子,龍書的DX10版和DX11版也算是不錯的教程。
推薦閱讀:
※如何評價CSDN學院姜雪偉的《3D遊戲引擎高端實戰培訓》課程?
※在 OS X 下怎麼寫新版本的 OpenGL?
※初學OpenGL 用的是OpenGL2.1加MFC 但是感覺好難啊!難度是兩方面的啊?
※初學者學習opengl是用紅寶書好還是藍寶書好?