2011-08-26 61 views
8

我的背景:幾個月前我開始嘗試使用OpenGL,沒有什麼特別的目的,只是好玩而已。我開始閱讀OpenGL紅皮書,並且製作了一個具有許多不同光照的行星系統。持續了一個月,我對openGL的興趣消失了。它在一個星期前再次醒來,而且從我的一些SO帖子收集來的,紅皮書已經過時了,OpenGL Superbible是一個更好的學習來源。所以我開始閱讀它。我喜歡着色器的概念,但是由於從固定管道的舊記憶和着色器的新概念的轉變,我腦中出現了一場真正的混亂。固定功能比。着色器 - 幫助理解概念差異

問題:我想寫一些我認爲是真實的陳述,我要求OpenGL專家驗證它們(即我是否正確理解,不太正確或絕對不正確)。所以......

1)如果我們不這樣做使用任何着色器程序,沒有什麼變化。我們有當前的顏色,當前正常的,當前的變換矩陣,當前的一切,並且只要我們調用glVertex**(...)這些當前值被採用並且頂點被饋送到......我不知道是什麼。事實是,它與當前的矩陣,當前顏色變換和正常被只要我們使用着色器程序,所有的上述停止工作施加到其等

2)。也就是說,glColor,glRotate等沒有意義(他們?)。我的意思是,glColor仍然設置當前顏色,glRotate仍然將當前矩陣乘以旋轉矩陣,但這些根本沒有使用。相反,我們通過glVertexAttrib提供頂點屬性。哪個屬性意味着什麼完全依賴於我們的頂點着色器和變量綁定。我們還發現ans設置了制服的值,然後調用glVertex並着色器被執行(我不知道是立即還是在調用glEnd()之後)。實際的頂點和片段處理完全是在着色器程序中手動完成的。

3)着色器不向深度測試添加任何東西。也就是說,我不需要在着色器中處理它。我只是撥打glEnable(GL_DEPTH_TEST)。面部撲殺也不受影響。

4)Alpha着色和抗鋸齒不需要在着色器中處理。 glEnable調用就足夠了。

5)是否使用gluPerspective,glRotate,glPushMatrix和其他矩陣函數是一個好主意,然後檢索當前矩陣並將其作爲統一信息提供給着色器?因此,不需要使用第三方矩陣庫。

+0

我不能直接回答這些問題,但我會說,不學習和使用着色器會導致近10年的GPU技術進步失敗。爲什麼從OpenGL 2.0開始,添加了着色器是一個很好的理由。你自己幫忙,並熟悉它們。一旦你開始使用它們,你會想知道你是如何得到我的,沒有它們。 –

+2

@邁克爾:正如你所看到的,我致力於學習它們,這就是我困惑的原因。我確實想要使用它們,只是我不明白關於它們的一些基本信息,這些信息在固定管道中更加清晰 –

回答

6
  1. 這取決於你在說什麼版本的OpenGL。通過OpenGL 3.0,所有固定功能仍然存在,所以是的,如果您決定使用固定功能,它會像以往一樣繼續工作。從3.0開始,很多固定管道都被棄用,從3.1開始,它完全消失。使用這些,你不再真的可以選擇使用固定管道。

  2. 同樣,這取決於。例如,通過OpenGL 3.0,即使使用着色器,glColor仍然受支持。不同之處在於,不是自動應用於繪製的內容,而是將其提供給着色器,該着色器可以不改變地使用它,修改它看起來合適的或者完全忽略它。所以,你的片段着色器接收gl_FrontColor和gl_BackColor,並將實際的片段顏色寫入gl_FragColor。但是,如果您使用的是OpenGL 3.1或更高版本,則glColor(例如)不再存在 - 顏色將只是您提供給着色器的另一個值,就像您可以/將做的任何其他值一樣。

  3. 這是正確的,至少要達到OpenGL 3.1。從4.0開始,有一種新的計算着色器(我相信)可以參與深度測試等事情(但我沒有使用它,所以我對此有點不確定)。

  4. 是的,你仍然可以使用內置的alpha混合。根據您的硬件,您可能還需要考慮使用gl_ARB_draw_buffers_blend擴展名(如果我正確記得,它是OpenGL 4的必備項)。

  5. 還是,它取決於你所說的OpenGL版本。目前的OpenGL完全消除了對矩陣的所有支持,所以你別無選擇,只能使用其他矩陣庫。較早的版本將諸如gl_ModelViewMatrix和gl_NormalMatrix之類的東西作爲制服提供給着色器,因此如果您選擇的話,您可以使用該路線。

+0

非常感謝您的回答。我的視頻卡支持OpenGL 4.0,而且我正在使用Qt(QGLWidget),所以核心和兼容性功能都在這裏,我有點困難,搞清楚哪些是可以使用,哪些不是...... :)啊,我我現在很困惑......我將專注並在未來提出更精確的問題:) –

+3

請注意,上述有關刪除功能的討論僅適用於創建_core_上下文。你可以爲3.2或更高版本創建一個_compatibility_ context,並且你仍然擁有所有的舊東西。除非您使用MacOSX Lion,這是唯一不支持兼容性上下文的GL實現。 –

+1

沒有「可以參與深度測試的新計算着色器」,您從哪裏得到這些信息?否則很好的答案。 –

1

2)在現代的OpenGL中,沒有glColor,glBegin,glVertex,glRotate等,所以它們沒有意義。

5)在現代OpenGL中沒有內置矩陣,所以你必須使用第三方庫或自己寫。所以要回答你的問題,不,這不是一個好主意。