2011-06-01 69 views
12

我一直在使用OpenGL編寫程序。最近,我開始學習OpenGL着色語言。我是新手;所以請在你的答案中詳細說明。OpenGL着色語言不同類型的變量(限定符)

我的問題是:

  1. 什麼是不同類型的變量(預選賽)在GLSL?
  2. 它們用於什麼?
  3. 它們有什麼不同?

我只熟悉從「頂點着色器」傳遞到要在頂點之間進行插值的片段着色器的「變化」變量。除此之外,我什麼都不知道。

+1

謝謝大家的回答。從一些在線資源中,我找到了關於兩個限定符「in」和「out」的信息,它們也可以用於頂點 - 片段着色器通信。它們與「不同」限定符非常相似。他們是一個單獨的「限定詞」級別還是僅僅是「不同」限定詞的替代? – Einiosaurus 2011-06-01 05:09:33

回答

21

在OpenGL中3+:

  • varying已被棄用
  • const是......嗯,常量!
  • uniform爲每繪圖調用(至多)如果使用glAttribDivisor和硬件instanciation
  • in是用於從前面的流水線級,至多即每個頂點(或每片段)值的輸入,每原始out是用於輸出到下一階段

關於用於片段着色器輸出:在OpenGL3和向上,大多數內置的片段着色器輸出(如gl_FragColor,具有gl_FragDepth顯着的例外)變量被棄用的並應予以更換用戶定義的out變量。

如果要輸出到默認幀緩衝區,則無論您聲明爲片段着色器的輸出結果在顏色緩衝區中。如果您將FBO綁定到多個顏色緩衝區(即多個渲染目標),則需要通過glBindFragDataLocationIndexed手動將每個out變量綁定到正確的顏色緩衝區索引。

所有你所能想約兩個GLSL(「服務器」)端和OpenGL的細節(「客戶」)側,可以發現:

+0

太好了,非常感謝!只有一個小問題,片段着色器的下一個階段是什麼?如果你的片段着色器定義了一個「out」變量,那個變量的值被傳遞給哪個變量? – Einiosaurus 2011-06-01 08:33:55

+0

編輯我的答案,以澄清片段着色器輸出的問題! – 2011-06-01 09:10:36

+0

「片段着色器的下一個階段是什麼?」 - > 2011年沒有,但每個人都期待「混合着色器」而不是醜陋的glBlendFunc。編輯:+1用精確頁面引用規格。 – Calvin1602 2011-06-01 19:08:18

3
  • 統一:每次繪製調用的常量數據,通常用於參數化着色器。
  • 變化:在VS和FS之間傳輸數據,沿着過程中的基元進行插值。
  • 屬性:這是頂點屬性數據,即頂點着色器的輸入。它是爲原語中的每個頂點指定的。