2015-04-30 25 views
4

我正在研究更高分辨率總是更好的應用程序。是否可以使用WebGL max紋理大小?

但我堅持WebGL max_texture_size的問題。我(對我的筆記本電腦16384x16384)創建大小正是這種尺寸的圖像和WebGL崩潰說:

GL_INVALID_ENUM:glBindFramebuffer:目標是GL_READ_FRAMEBUFFER_ANGLE GL_INVALID_ENUM:glBindFramebuffer:目標是GL_READ_FRAMEBUFFER_ANGLE 的WebGL:CONTEXT_LOST_WEBGL:loseContext:上下文丟失

而當我用0.75的最大值嘗試時也是如此。只能以最大分辨率的一半工作,但這意味着我的圖形內存中只有1/4的像素被使用!

所以我的問題是,是否有可能使用最大紋理尺寸,如果沒有,如何才能找到最大的紋理WebGL可以吃?我發現很少(如果有的話)關於這個在線文檔。

以防萬一,這是我如何綁定我的質地:

gl.activeTexture(glTexture); 
texture = gl.createTexture(); 
gl.bindTexture(gl.TEXTURE_2D, texture); 
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); 
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); 
with(gl){ 
    texParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, LINEAR); 
    texParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, NEAREST); 
    texParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE); 
    texParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE); 
} 
program.samplerUniform = gl.getUniformLocation(program, textureName); 
gl.uniform1i(program.samplerUniform, textureNb); 

回答

13

gl.getParameter(gl.MAX_TEXTURE_SIZE)返回最大尺寸的GPU能夠解決。換句話說,您可以製作1xMAXMAXx1紋理,如果您有內存,它應該一直工作到MAXxMAX

另一方面,您不能使(MAX+1)x1,因爲MAX+1是>MAX

但是,MAXxMAX,好了,你的情況

16384 * 16384 * 4 (RGBA) * UNSIGNED_BYTE = 1073741824 or 1GIG!!! 

請問您的GPU有1G的?事實上,它需要超過1Gig,因爲它使用的是操作系統和Chrome本身的內存以及mips等等。也許更好的例子

16384 * 16384 * 4 (RGBA) * FLOAT = 4294967296 or 4GIG!!! 

即使你的GPU有很多的內存瀏覽器可能會限制你可以訪問的內存量。很有可能你的瀏覽器內存不足,這就是它崩潰的原因。

至於知道任何設備的限制,可以說沒有辦法知道這一點。首先,你不能檢查用戶機器除Chrome之外的哪個GPU(其他瀏覽器認爲是隱私問題)。其次,你不知道在他們的機器上還有什麼東西在運行,並佔用內存。

+0

好的,謝謝,我錯過了這個最大值的含義。這實際上是有道理的。但我應該如何去尋找適合內存的最大紋理尺寸(有一定的餘量)我猜標籤是在沙箱中運行的,並且無法猜測它們的可用內存? – mrudelle

+0

即使它們未在沙箱中運行,您如何知道它們沒有在每個選項卡中使用WebGL應用程序打開的50個選項卡?除了分配逐漸變大的紋理和祈禱之外,我確實沒有辦法知道。如果你正在製作一個應用程序,儘量使用盡可能少的內存/合理的內存。你可能會看到'navigator.platform'猜測一點,至少移動與桌面。否則,請考慮爲用戶提供喜歡大多數PC遊戲的細節與低細節的選項。 – gman

+1

對不起,但我認爲這可能是一個錯誤。從Khronos規範: 「對於1D和2D紋理(以及任何使用類似維度的紋理類型,如立方圖),其最大尺寸爲E_MAX_TEXTURE_SIZE。」 – Jackalope