2011-07-08 64 views
1

當我嘗試的屬性綁定到索引爲0時,着色器程序在鏈接失敗,且信息日誌給出的唯一信息是:glBindAttribLocation索引0

頂點着色器(一個或多個)未鏈接,片段着色器(s)鏈接。

根據OpenGL的文檔

此命令它使頂點着色器使用的屬性變量,而不是那些從0到-1 GL_MAX_VERTEX_ATTRIBS通用變量描述性名稱。

因此將屬性綁定到索引0應該起作用。雖然它不是很重要,但我很好奇爲什麼我不能將一個屬性綁定到索引0上。歡迎任何建議。

+0

您是否正在調用'glBindAttribLocation' _before_或_after_將頂點着色器附加到程序對象?另外,你是否在'glBindAttribLocation'之後立即檢查過'glGetError'? – Damon

+0

我打電話過後。 glGetError返回沒有錯誤。 glBindAttribLocation適用於其他指數。 (編輯:附加之後,鏈接之前) – Jonathan

+0

嗯聽起來像它應該工作:( – Damon

回答

0

引用OP的評論,因爲它救了我:

我發現這個問題(這是造成其他問題):在我的頂點着色器我已經從使用gl_Vertex切換到用自己的屬性,「頂點」 ,但在我的着色器的一個地方,我忘了更改變量名稱,因爲gl_Vertex使用0索引...

+0

注意:'gl_Vertex'不*使用屬性0.通用頂點屬性不允許使用內建的別名;這個規範很清楚。並不是說NVIDIA曾經堅持以這種方式打破規範。您不能同時使用屬性0和'gl_Vertex',因爲它們都是挑釁屬性。所以你必須選擇一個。 –

+0

@NicolBolas,我不明白你的意思。屬性0是一個特殊的屬性,在設置時會觸發頂點着色器的運行,並且如果在着色器中使用gl_Vertex,則gl_Vertex將獲得您爲屬性索引0設置的值。這很有意義,考慮到需要調用'glVertex *()'在使用'glBegin()'和'glEnd()'繪製時設置其他屬性後。 – lvella

+1

事實上,你描述的工作*在你的機器上*並不意味着它*應該*工作。 OpenGL規範對此很清楚。 'glVertexAttrib(0,...)'和'glVertex(...)'*是不同的*。它們都激發頂點的執行,但是'glVertexAttrib(0,...)'不應該在頂點着色器中提供'gl_Vertex'。 **永遠。** NVIDIA的司機這樣做,但這並不意味着他們是正確的。這是一個缺陷,NVIDIA尚未修復,並且有跡象表明他們不會修復它。他們甚至認爲這種別名是一個特徵,儘管規範禁止它。 –

相關問題