2012-04-28 66 views
2

我正在使用WebGL(≈OpenGL ES 2.0)。目前,我的應用程序使用紋理單元0作爲每個模型的紋理,以及1和2作爲着色器使用的常量紋理。我應該如何在初始化紋理時管理glActiveTexture?

爲了加載和設置紋理,我

var texture = gl.createTexture(); 
gl.bindTexture(gl.TEXTURE_2D, texture); 
gl.texImage2D(...); 
gl.texParameteri(...); 

然而,這跺腳在其上的紋理結合到當前的紋理單元的狀態。爲了避免這個程序中,我添加

gl.activeTexture(gl.TEXTURE0); 

上述代碼的開始,以使得它僅影響針對其無論如何繪製任何幾何形狀之前重置紋理單元0的結合。

是否有更好的方法,即不涉及發生有「劃痕」紋理單元的情況?對於這種國家管理問題,是否有一個確定的最佳做法?

回答

1

對於我來說,這個問題與其他幾個屬於同一個類別:在程序中的某些點上,你可以假定GL狀態?

AFAICT你基本上有兩種選擇:

  1. 麻痹大意,並設置狀態,你需要的方式。即撥打glActiveTextrure(),因爲您目前正在做
  2. 爲您的程序中的某些點設置GL應該處於什麼狀態的規則。例如對於您的情況,繪圖部分在完成時調用glActiveTexture(gl.TEXTURE0),因此預繪圖部件可以假定它是以這種方式設置的。

但是真的不要太想太多。在OpenGL中,您可以通過最大化(在某些實際限制內)多邊形與函數調用的比例來優化程序,您可以通過傳遞大量多邊形來調用glDrawArrays()調用等。

+0

謝謝,但我不是問「主動紋理單元的策略應該是什麼?」 - 我已經遵循了你所描述的原則 - 但是「我應該如何初始化紋理,儘量不干擾我對紋理單元的其他用途?」,這可能意味着對規則的限制。 – 2012-04-28 17:26:56

+0

你可以把它當作我正在談論的另一個實例。在GL中有很多狀態可以像這樣「踩踏」。你可以爲該工作使用單獨的紋理單元,這意味着你不必重置任何東西,但必須調用'glActiveTextureUnit()'兩次。或者你可以摧毀當前的紋理單元,然後將設置紋理狀態的責任傳遞給繪圖部分。無論哪種方式,你的程序的一部分(有點)有一些額外的工作要做。 – 2012-04-28 17:35:12

+0

從某種角度來看,它可以歸結爲效率和可維護性之間的一個小的折衷。 – 2012-04-28 17:37:34