2013-07-22 60 views
11

我不是母語爲英語的人,當我試圖通過www.learnopengl.com上的OpenGL wiki和教程時,通過直覺瞭解整個概念的工作原理永遠不會變得可以理解。有人可以用更抽象的方式解釋我的工作原理嗎?什麼是頂點着色器和片段着色器,以及我們將它們用於什麼?什麼是openGL中的着色器,我們需要什麼?

回答

12

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的模型中,僅在以下圖的藍色階段是可編程的:

enter image description here

Image source

着色器從前一個流水線階段(例如頂點位置,顏色和柵格化像素)獲取輸入,並將輸出定製到下一個階段。

的兩個最重要的有:

  • 頂點着色器:
  • 片段着色器:
    • 輸入:一個三角形+(彩色邊緣或紋理圖像)+閃電的所有像素的2D位置參數
    • 輸出:每一個像素的顏色三角形(如果它不是由另一個更接近三角形遮擋)的,通常是頂點

    名稱SHA之間

插der對於當前的結構體系並不是非常具有描述性:GLSL中的「着色器」還管理頂點位置,更不用說OpenGL 4.3 GL_COMPUTE_SHADER,它允許與OpenCL完全無關的任意計算。

TODO能否使用OpenCL單獨有效地實現OpenGL,即讓所有階段都可編程?當然,必須有性能/靈活性的折衷。

具有着色器的第一個GPU使用不同的專用硬件進行頂點和片段着色,因爲這些工作負載差異很大。但是,當前的體系結構爲所有着色器使用單一類型的硬件(基本上都是小型CPU),這可以節省一些硬件重複。這個概念被稱爲:https://en.wikipedia.org/wiki/Unified_shader_model

enter image description here

Image source

要真正瞭解着色器和他們所能做的所有事情,您必須查看許多示例並學習API。例如https://github.com/JoeyDeVries/LearnOpenGL是一個很好的來源。

在現代的OpenGL 4中,甚至hello world triangle程序都使用超級簡單的着色器,而不是像以前那樣不贊成的直接API,如glBeginglColor。下面是一個例子:https://stackoverflow.com/a/36166310/895245

一個典型非平凡着色器涼爽應用是動態陰影:

Image source

15

着色器基本上根據幾個光照方程爲您提供想要渲染的對象的正確着色。所以如果你有一個球體,一個燈光和一個攝像機,那麼即使球體只有一種顏色,攝像機也應該看到一些陰影,一些閃亮的部分等等。着色器執行輕方程式計算來爲您提供這些效果。

頂點着色器將虛擬空間中的每個頂點的3D位置(您的3D模型)轉換爲它出現在屏幕上的2D座標。

片段着色器通過做輕量計算基本上給你每個像素的着色。

+3

因此,我們要在屏幕上繪製的每個對象都會經歷所謂的「渲染管線」,該渲染管線首先由頂點組成,然後是具有計算的片段着色器組成整體畫面。我對嗎? – Tommz

+3

是的,頂點着色器首先工作,片段着色器稍後工作。渲染管道還有其他幾個步驟,例如剪切,柵格化等:http://www.opengl.org/wiki/Rendering_Pipeline_Overview – jh314

+0

什麼是Pixel Shader?它是否與Vertex Shader同義? – anonymous

相關問題