2012-03-14 37 views
3

我試圖在我的WebGL程序中實現拾取(使用顏色和readPixels)。當我開始我的程序時,我創建了獨立的shaderProgram。一個用於phong陰影,另一個用於形成一種顏色以用於檢測哪個形狀被點擊。使用兩個或多個具有不同數量屬性的着色器時發生衝突

phong着色器有2個屬性。頂點位置和頂點法線。揀貨人員只需擁有該職位。

現在我發現,由於一些奇怪的原因,當這兩個着色器存在於同一個程序中,而我正在使用picking時,我的drawArray調用似乎失敗了。最後發生的事情是我的gl.vertexAttribPointer調用。我一直在搞亂,發現當我使用以下命令檢查活動屬性數組時: gl.getVertexAttrib(index,gl.VERTEX_ATTRIB_ARRAY_ENABLED);

兩個0,1返回true,如果我禁用1 gl.disableVertexAttribArray(這是當採摘着色器是活動的,gl.useProgram(採摘))

現在(1);一切再次運作。另一個解決方法是先用phong着色器繪製,然後使用着色器,並以某種方式神奇地使它正常。我猜測在這種情況下,當使用phong着色器時附加頂點法線緩衝區時,它會以某種方式停留在切換到拾取着色器和drawArray調用時。

我想知道如果我使用gl.enableAttribArray錯誤,並應切換着色器或類似的東西時禁用它們。

我也試着以不同的順序創建着色器程序,但沒有成功。

回答

3

正如你可能已經知道的那樣,useProgram不會影響任何東西,但程序(着色器代碼)應該在下一次繪製調用中運行。您必須確保僅啓用當前程序使用的屬性。

如果你以某種方式包裝了你的WebGL代碼,一個提示是保存包裝器中某個地方存儲的每個程序的最高可用屬性號,然後與最新使用的程序進行比較,並在繪製調用之前相應地啓用/禁用。

+0

這就是我決定要做的事情,我知道每個着色器存在哪些頂點屬性,以及哪個着色器是活躍的,所以我只是包裝我的gl.useProgram調用,以便我可以先清理。 – nkassis 2012-03-15 15:52:50

+0

其實useProgram影響制服。您可以通過製作同一程序的多個副本來模擬GL_ARB_uniform_buffer_object,實際上驅動程序可以在GL_ARB_uniform_buffer_object的底層進行此操作。 – gman 2012-03-19 20:07:16

+0

你的意思是制服受到了什麼影響?據我瞭解,由於安全原因,一個程序的制服不能在另一個程序中使用 - 但是他們的狀態不應該受GL.useProgram影響,不是? – MikaelEmtinger 2012-03-20 10:08:02

1

OpenGL是一個狀態機。通過選擇採摘着色器,您可以將OpenGL置於不再具有phong着色器附加屬性的狀態。

很多人陷入了錯誤和壞習慣,認爲有一些OpenGL的「一次初始化」。不是這種情況。您應該設置繪圖操作所需的所有狀態,就在繪圖操作之前,理想情況下還可以在完成後恢復設置。這意味着:在綁定着色器之後,您還應該啓用並綁定所需的着色器輸入,即頂點屬性。

+0

我在每個gl.useProgram後立即啓用了我的頂點屬性數組,但沒有解決它。我仍然必須顯式禁用gl的第二個屬性數組。disableAttributeArray(1) – nkassis 2012-03-14 16:47:25

+0

@nkassis:然後只是禁用它。無論如何,這就是你應該做的。 – datenwolf 2012-03-14 17:20:39

+0

@nkassis只是一個澄清,被調用的函數拼寫gl.disableVertexAttribArray – 2016-09-02 22:42:42

1

很難說沒有看到你的代碼,但...... WebGL要求所有將被訪問的屬性都有足夠的數據來滿足繪製調用。所以,如果你設置了兩個屬性,每個屬性有3個頂點數據並繪製3個頂點,然後切換着色器和設置1屬性的6個頂點,並保留第二個屬性只有3個頂點,然後嘗試繪製6頂點,如果着色器'當前正在使用訪問這兩個屬性進行繪製WebGL將失敗繪製調用。

如果您運行Chrome 19,它應該在JavaScript控制檯中告訴您這是否是問題所在。

+0

是啊鉻19沒有抱怨「INVALID_OPERATION:drawArrays:attribs沒有設置正確」(順便說一句:OMG感謝格雷格的加法:P)我在當我使用其他着色器運行gl.useProgram時,啓用的頂點屬性會重置。現在我有兩個頂點屬性被啓用,當我爲這個特定的着色器應該有一個。顯示代碼有點困難,因爲我將它包裝在一堆對象和函數中,以使我的生活更輕鬆; p – nkassis 2012-03-14 20:16:19

相關問題