2012-04-27 48 views

回答

0

首先,gl_Position輸出位置從頂點着色器,而不是輸入。這不是頂點屬性,它從來沒有。你可能正在考慮gl_Vertex

最重要的是其次,內置屬性如gl_Vertexgl_Color等沒有通用屬性索引。 gl_Vertex而不是與通用屬性0相同。OpenGL規範明確禁止這兩者相同。通用屬性(具有屬性索引的東西)和內置屬性不會彼此「別名」。他們不共享相同的資源或空間。

現在,NVIDIA的OpenGL實現允許別名,違反OpenGL規範。但是這樣的代碼是不可移植的(可怕的)。如果你想確切地知道NVIDIA如何進行映射,我確信NVIDIA網站上的文檔會將它拼出來。

+0

但我認爲這是要指定的,通用屬性0確實與內置頂點位置(至少在舊的非棄用天)的別名。那麼,至少*橙皮書*說明了這一點,我相信這一點。 – 2012-04-27 20:21:22

+0

@ChristianRau:在渲染時(在兼容性規則下),您可能會被混淆爲需要使用屬性0或'gl_Vertex'。它們都起到「激發」glBegin/glEnd下的頂點的作用,所以你必須在其中一箇中有東西,並且你不能在同一個渲染調用中使用它們。但如果這就是它所說的話,那麼橙皮書是錯誤的。從OpenGL 3.3兼容性規範來看:「不可能用常規屬性替代通用屬性。」 'gl_Vertex'和屬性0沒有例外。 – 2012-04-27 20:26:39

+0

看着它。 2.1規範說(在第2.7章中):*「設置通用頂點屬性零指定一個頂點;四個頂點座標取自屬性零的值,Vertex2,Vertex3或Vertex4命令完全等效於相應的VertexAttrib命令的索引值爲0設置任何其他通用頂點屬性都會更新屬性的當前值頂點屬性零沒有當前值「*要*」完全等價「*,是否必須發送值到相同的屬性通道? – 2012-04-27 20:26:52