2014-05-15 50 views
2

我正在開發iOS上的OpenGL ES 2項目來學習OpenGL ES 2.在線我發現了一個用於鏈接和編譯着色器的Objective-C實現,並且我使用這個實現作爲我自己的模板。不幸的是,我錯誤地鍵入上傳我的紋理數據爲glUniform1f而不是glUniform1i。看起來像這樣...glUniform1f vs glUniform1i混淆

glActiveTexture(GL_TEXTURE1);     
glBindTexture(GL_TEXTURE_2D, self.texture); 
glUniform1f(_texUniform, 1);  // this line should be glUniform1i 

我的項目有自己的紋理多個對象。這個錯字導致所有對象上只顯示最後繪製的對象的紋理。我懷疑我的紋理ID或類似的東西有問題,因此在每次繪製調用時註銷了紋理ID等,並且找不到任何錯誤。

這是一個很難找到的錯誤,我想了解這個錯誤是怎麼回事。我的問題是glUniform1f vs glUniform1i會導致這種行爲?我有點驚訝,着色器不僅沒有鏈接和編譯,也沒有繪製任何紋理。

回答

4

Uniformas只是(每個程序)OpenGL狀態。您設置統一值的方式完全獨立於將着色器鏈接到程序對象 - GL在着色器鏈接時對此一無所知,該程序只有一堆活動制服,您可以將它們設置爲任何您喜歡的任何內容時間。

制服總是有一個類型。並且必須使用與您的統一變量類型匹配的正確的glUniform*()函數,否則會生成GL錯誤GL_INVALID_OPERATION(並且操作不再有效果)。對於採樣器制服,您需要將紋理單元的索引設置爲整數,因此glUniform1i()是正確的函數,而glUniform1f() - 這是浮點數 - 將不起作用。因爲你沒有設置制服,所以這套制服的以前的價值將被使用 - 如果你從未設置,它將會是0。

所以發生了什麼是你從紋理單元GL_TEXTURE0,而不是你想要的紋理採樣。你可以在創建紋理時使用該紋理單元,這將解釋是否仍然存在「最後」的紋理邊界。

+0

謝謝 - 現在有道理。 – dloranz