2012-11-13 15 views
0

我有一個WebGL的問題。隨機「位置不適用於當前程序」錯誤

有時,當我向應用程序中添加新着色器時,每次在每一幀中我都會在我的2D繪圖函數中設置圖像繪製着色器的統一圖標時,出現uniform4f: location not for current program錯誤(顯示在Chrome控制檯中)。

雖然我之前幾次得到同樣的錯誤,但通過做一些隨機的未知操作來解決它們並不是很困難。然而,當我添加一個屏幕變形着色器時,我盡我所能,甚至glFinish(我認爲錯誤是因爲失步而發生的),但沒有任何幫助。

當我嘗試在控制檯繪圖函數中設置2D 2D圖像shader的vec4制服時發生錯誤。如果我交換控制檯繪圖功能和菜單繪圖功能,菜單不繪製。

這是我的節目製作和交換功能的源代碼:http://pastebin.com/zDEWWgKV

錯誤停止,如果我做從以下列表中任何東西:

  • 關閉菜單。
  • 加載地圖並做一些3D渲染(導致程序切換至少4次)。
  • 啓用畫面變形(導致程序切換1次)。

有人能告訴我,什麼可能會導致錯誤,我該如何解決?

+2

我認爲這意味着你正在設置一個不是當前程序的程序(即最後一個傳遞給useProgram()')的程序。你可以添加一些檢查來確保。 – Thomas

回答

2

這意味着您使用的位置來自另一個程序。程序不共享位置,即使它們使用相同的着色器。例如:

// make a vertex and a fragment shader 
var vs = gl.createShader(gl.VERTEX_SHADER); 
gl.shaderSource(vs, vSource); 
gl.compileShader(vs); 

var fs = gl.createShader(gl.FRAGMENT_SHADER); 
gl.shaderSource(fs, fSource); 
gl.compileShader(fs); 

// now make 2 identical programs from those shaders 
var p1 = gl.createProgram(); 
gl.attachShader(p1, vs); 
gl.attachShader(p1, fs); 
gl.linkProgram(p1); 

var p2 = gl.createProgram(); 
gl.attachShader(p2, vs); 
gl.attachShader(p2, fs); 
gl.linkProgram(p2); 

// Get a uniform location from program1 
var location1 = gl.getUniformLocation(p1, "someUniform"); 

// Try to use that location on program2 
gl.useProgram(p2); 
gl.uniform4fv(location1, [1, 2, 3, 4]); // ERROR!!! 

試圖在程序2中使用程序1中的某個位置是不允許的。您必須獲得程序2的位置才能在程序2上設置制服。

+0

我知道你不能設置其他程序的位置。錯誤的原因是不同的,我已經修復它。但無論如何,謝謝你試圖幫助。 – Triang3l

0

有一個函數可設置投影矩陣並在代碼中運行每一幀。它在所有着色器上迭代並且它們都是useProgram,但不會更改GL.currentprogram,因此如果前一幀中的最後一個着色器爲Pic,並且當前幀中的第一個着色器也爲Pic,但循環已停止,例如,Warp,我的着色器選擇函數會認爲當前着色器是Pic,但它不是,也不會更改着色器。

我通過將GL.currentprogram設置爲null並在迭代所有着色器之前禁用當前屬性數組來修復它。