2012-06-03 43 views
2

我有一系列紋理堆疊在一起(使用mip-map樣式的分辨率金字塔)以獲得最終圖像。嘗試將WebGL紋理清除爲純色

因爲他們堆棧的方式,這是必要的,當他們沒有被有意義的圖像數據填充到它們初始化到128的無符號int值。 IE 128的值爲零,因爲渲染着色器會從每個紋理值中減去.5,從而允許後續的金字塔圖層通過正值或負值偏移最終圖像。

我似乎無法弄清楚如何(單聲道GL_LUMINANCE)質地初始化值!

我試着將它設置爲渲染目標和渲染多邊形到它,但FBO似乎被標記爲未完成。我也嘗試將其定位爲渲染緩衝區目標並使用gl.clear(gl.COLOR_BUFFER_BIT),但它又被認爲是不完整的。

最明顯的一點是,使用gl.texSubImage2D(複製值),但似乎很慢......也許這是唯一的辦法?我希望有一些更優雅的東西,它不需要分配太多的內存(至少是一幀值得一個值),而且太慢了(因爲所有數據都必須寫入緩衝區,只要它是單個值)。

將紋理設置爲WebGL的一個(默認)值的唯一方法似乎是調整其大小,或者將它分配,它設置爲全零。

此外,似乎沒有像gl.SIGNED_BYTE這樣允許零爲零(IE,有符號值進來)的複製模式......但這也不能解決初始化問題紋理到單個值(在這種情況下,爲零)。

任何想法?如何將WebGL紋理初始化爲值,而不僅僅是將值複製到其中?

回答

2

作爲能夠呈現於特定類型的紋理不幸不通過在其上WebGL是基於OpenGL ES 2.0規範保證。判斷它是否有效的唯一方法是創建紋理,將其附加到幀緩衝區,然後調用checkFramebufferStatus並查看它是否返回FRAMEBUFFER_COMPLETE。不幸的是,它不會在很多情況下。

如果您使用RGBA紋理機率是否會起作用。所以,關閉我的頭頂,你的選擇是

  1. 使用RGBA紋理和渲染128,128,128,???它在FBO
  2. 使用亮度紋理,並呼籲texImage2D
  3. 使用後備緩衝或清除到你想要的顏色的正確尺寸的FBO使用亮度質地和調用copyTexImage2D(雖然沒有保證,這是快AFAIK)
0

根據我的經驗(主要是使用OSX中的Chrome),使用Canvas初始化紋理很快。我想這是因爲瀏覽器分配Canvas並在GPU上繪製所有內容,並且其WebGL實現使用與Canvas相同的GL上下文,因此不存在巨大的CPU到GPU內存傳輸。

 // Quickly init texture to (128,128,128) 
     var canvas = this._canvas = document.createElement("canvas"); 
     canvas.width = wTex; 
     canvas.height = hTex; 
     var ctx = this._ctx = canvas.getContext("2d"); 
     ctx.fillStyle = "#808080"; 
     ctx.fillRect(0, 0, wTex, hTex); 
     gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, canvas);