我不是母語爲英語的人,當我試圖通過www.learnopengl.com上的OpenGL wiki和教程時,通過直覺瞭解整個概念的工作原理永遠不會變得可以理解。有人可以用更抽象的方式解釋我的工作原理嗎?什麼是頂點着色器和片段着色器,以及我們將它們用於什麼?什麼是openGL中的着色器,我們需要什麼?
回答
的OpenGL wiki給出了一個很好的定義:
着色器是被設計爲在一個圖形處理器的某些階段運行的用戶定義的程序。
在過去,圖形卡是其中執行的一組固定的算法硅的不可編程件:點/顏色/燈進來,和2D圖像出來使用固定算法(通常沿着https://en.wikipedia.org/wiki/Phong_reflection_model) 。
但是這對於想要創建許多不同視覺效果的程序員來說太具有限制性。隨着技術的進步,GPU供應商開始允許渲染流水線的某些部分被編程爲編程語言,如GLSL。
然後這些語言被轉換爲semi-undocumented instruction sets,這些語言運行在內置於這些新GPU中的小型「CPU」上。
直到不久之前,着色器語言were not even Turing complete。
術語通用GPU(GPGPU)引用了現代GPU的這種增強的可編程性。
在OpenGL的模型中,僅在以下圖的藍色階段是可編程的:
着色器從前一個流水線階段(例如頂點位置,顏色和柵格化像素)獲取輸入,並將輸出定製到下一個階段。
的兩個最重要的有:
- 頂點着色器:
- 輸入:在三維空間中的點的位置
- 輸出:在點(使用4D矩陣乘法)的2D投影。參見:https://stackoverflow.com/a/36046924/895245
- 片段着色器:
- 輸入:一個三角形+(彩色邊緣或紋理圖像)+閃電的所有像素的2D位置參數
- 輸出:每一個像素的顏色三角形(如果它不是由另一個更接近三角形遮擋)的,通常是頂點
名稱SHA之間
GL_COMPUTE_SHADER
,它允許與OpenCL完全無關的任意計算。
TODO能否使用OpenCL單獨有效地實現OpenGL,即讓所有階段都可編程?當然,必須有性能/靈活性的折衷。
具有着色器的第一個GPU使用不同的專用硬件進行頂點和片段着色,因爲這些工作負載差異很大。但是,當前的體系結構爲所有着色器使用單一類型的硬件(基本上都是小型CPU),這可以節省一些硬件重複。這個概念被稱爲:https://en.wikipedia.org/wiki/Unified_shader_model
要真正瞭解着色器和他們所能做的所有事情,您必須查看許多示例並學習API。例如https://github.com/JoeyDeVries/LearnOpenGL是一個很好的來源。
在現代的OpenGL 4中,甚至hello world triangle程序都使用超級簡單的着色器,而不是像以前那樣不贊成的直接API,如glBegin
和glColor
。下面是一個例子:https://stackoverflow.com/a/36166310/895245
一個典型非平凡着色器涼爽應用是動態陰影:
着色器基本上根據幾個光照方程爲您提供想要渲染的對象的正確着色。所以如果你有一個球體,一個燈光和一個攝像機,那麼即使球體只有一種顏色,攝像機也應該看到一些陰影,一些閃亮的部分等等。着色器執行輕方程式計算來爲您提供這些效果。
頂點着色器將虛擬空間中的每個頂點的3D位置(您的3D模型)轉換爲它出現在屏幕上的2D座標。
片段着色器通過做輕量計算基本上給你每個像素的着色。
- 1. 什麼是圖着色需要?
- 2. 什麼是R中的因子,爲什麼我們需要它
- 3. 什麼是仿函數,爲什麼我們需要它們?
- 4. 什麼是EJB回調,爲什麼我們需要它們?
- 5. DavLockDB:我們需要什麼?
- 6. 爲什麼我們需要ioc容器
- 7. Windows上的Spark - 什麼是winutils,爲什麼我們需要它?
- 8. 什麼是OWASP?爲什麼我們需要這個?
- 9. 什麼是jquery noConflict,爲什麼我們需要這個?
- 10. ELF文件 - 什麼是部分,爲什麼我們需要它?
- 11. 什麼是mcrypt,爲什麼和我們需要它在哪裏?
- 12. Maven快照究竟是什麼,爲什麼我們需要它?
- 13. 什麼是__i686.get_pc_thunk.bx?我們爲什麼需要這個電話?
- 14. 什麼是伴侶對象,爲什麼我們需要它?
- 15. 什麼是OpenGL次要顏色有用?
- 16. 爲什麼我們在OpenGL 2的運行時編譯着色器?
- 17. 我們的意思是什麼?要麼 ???
- 18. 裝配需要什麼?爲什麼我們使用它們?
- 19. 爲什麼我們需要.htaccess的worpdress?
- 20. 模型中有什麼?爲什麼我們需要使用它
- 21. 什麼是頂點着色?
- 22. 什麼是立體着色器?
- 23. 爲什麼我們需要simple_one_for_one?
- 24. 爲什麼我們需要TensorFlow tf.Graph?
- 25. 爲什麼我們需要使用prompt.start()?
- 26. 爲什麼我們需要scalaz.stream迭代?
- 27. 爲什麼我們需要WCF
- 28. 爲什麼我們需要Anaconda 2.7?
- 29. 爲什麼我們需要編寫log.isDebugEnabled?
- 30. 爲什麼我們需要ng-click?
因此,我們要在屏幕上繪製的每個對象都會經歷所謂的「渲染管線」,該渲染管線首先由頂點組成,然後是具有計算的片段着色器組成整體畫面。我對嗎? – Tommz
是的,頂點着色器首先工作,片段着色器稍後工作。渲染管道還有其他幾個步驟,例如剪切,柵格化等:http://www.opengl.org/wiki/Rendering_Pipeline_Overview – jh314
什麼是Pixel Shader?它是否與Vertex Shader同義? – anonymous