2011-01-12 51 views
5

在新版本的OpenGL(3.0和4.0)中,內置頂點屬性(如gl_Vertex)將被棄用。實際渲染任何東西的「新方法」是爲位置,顏色等指定自己的頂點屬性,然後將這些自定義屬性綁定到緩衝區。應該如何編寫現代OpenGL着色器以便相互兼容?

我的問題是:如何在不緊密耦合渲染代碼和着色器的情況下做到這一點?如果我編寫一個使用「位置」作爲頂點位置的着色器,則使用着色器的主機代碼必須知道並將頂點數據作爲「位置」傳遞。如果我想使用不同的着色器來寫入「vertex_pos」中的頂點數據,我必須首先重寫該着色器,或者修改我的主機代碼來將頂點數據發送爲「vertex_pos」。

是否有一套適用於所有着色器應該使用的標準頂點和片段屬性的最佳實踐名稱?或者是否存在Balkanized特定於引擎的標準,例如爲一個引擎編寫的着色器無法修改而無法在另一個引擎上工作?或者根本沒有標準,因此,一般來說,每個對象都需要自己的自定義渲染代碼來匹配自定義着色器。

回答

3

只要不斷稱他們爲舊名稱。如果您擁有核心配置文件(即無向後兼容性),舊版GLSL規格的保留名稱是,釋放,聲明爲不可用;重新聲明它們的綁定頂點屬性。似乎改變他們的可用性屬性。在兼容性配置文件中,這些變量名稱是預分配和綁定的。

所以歸結爲:在着色器中保留舊的命名是一個方便,似乎與當前的GLSL編譯器一起工作。如果您想安全使用預處理器將gl_前綴保留名稱重寫爲自選前綴並將其綁定。

+2

其實並非如此。 GLSL保留**以「gl_」開頭的任何**名稱。如果核心編譯器允許使用「gl_Vertex」,那麼它不符合規範。 1.50規範將重新聲明語法闡明爲僅對聲明類型的屬性進行更改有效。所以它不應該讓你重新聲明它們。 – 2011-06-11 21:54:16

+0

@Nicol:現在這裏開始語言lawery:有些人可能會看到不贊成的變量名稱作爲預定義的標識符從兼容性配置文件,並在1.50 GLSL程序中使用它們是一個屬性更改重新聲明;恕我直言規範不清楚這一點,雖然§#版本#3.3似乎表明核心的意思是「沒有兼容性名稱可用」。如果想要安全,他可以使用預處理程序`#define gl_Vertex glVertex`並在核心配置文件中使用該名稱。 – datenwolf 2011-06-11 22:18:08

1

首先,回答你的問題。我不知道任何這樣的標準命名約定。

但是...它比屬性名稱更復雜。這個問題隱藏的是屬性語義的概念。每個輸入屬性都具有某種形式的每個着色器所期望的語義。

我從固定的gl_名字中學到的是他們低於他們的語義。

  • 哪個空間是gl_Position? (回答:它完全取決於主機通過什麼東西。引擎不必傳入本地空間,例如,如果它已經轉換它,因爲它需要世界空間出於不同的原因)。
  • gl_TexCoord1是一個紋理座標,還是真的是一個切線?它的範圍呢?它是否被編碼?

目前還不清楚是否可以找到真正解決所有這些問題的特定術語,但需要使各種引擎兼容。

更有問題的是,特定的引擎(或特定的資產)能夠提供來自不同引擎的着色器所需的特定屬性的能力並不明顯。然後怎樣呢 ?

這些都是我們爲什麼最終選擇了巴爾幹化shader環境的原因。

0

請參閱我的question以獲取屬性/統一語義的可能實現列表。即使使用OpenGL 3.4,我也擔心這個問題不會得到解決,您幾乎可以在自己的設備上定義着色器和代碼之間的契約。