2013-02-24 65 views
4

我在GPU上生成紋理並將其渲染到我自己的幀緩衝區對象。它工作正常,紋理渲染爲可傳遞給其他着色器的WebGLTexture。不過,我想訪問JavaScript中的WebGLTexture像素。有沒有辦法做到這一點?閱讀WebGLTexture中的像素(將WebGL渲染爲紋理)

目前我使用gl.ReadPixels在將紋理繪製到幀緩衝區後讀取像素。這很好,但如果我可以直接訪問WebGLTextureObject中的像素,會不會更好?

我想要完成的是:我有GLSL perlin噪聲着色器,可以在GPU上渲染高清高度圖和法線貼圖。我想將高度圖傳遞給CPU,以便我可以生成網格的頂點。我當然可以將頂點放置在頂點着色器中,但我需要在CPU中進行碰撞檢測。

我希望我的問題很清楚。歡迎任何反饋!

謝謝!

+0

我認爲這是唯一的解決方案,因爲'glGetTexImage'不存在。但無論如何,我不認爲這是一個不好的解決方案。可能你應該考慮一下,如果有可能在GPU上進行碰撞檢測。 – 2013-02-24 23:34:21

回答

11

通過將像素附加到幀緩衝區,您可以讀出大多數紋理中的像素。

var fb = gl.createFramebuffer(); 
gl.bindFramebuffer(gl.FRAMEBUFFER, fb); 
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0); 
if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE) { 
    var pixels = new Uint8Array(width * height * 4); 
    gl.readPixels(x, y, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels); 
} 
+1

這就是我現在正在做的,正如我在我的問題中所描述的那樣。我想知道是否有其他方式,比如直接從WebGLTexture中讀取。謝謝。 – raRaRa 2013-02-25 19:10:13

+0

好的,從您的描述中不清楚。 「我已經將紋理繪製到我的幀緩衝區中了」。您不必繪製紋理。您只需將紋理附加到幀緩衝區,然後調用readPixels。很抱歉對於這個誤會。 WebGL中沒有其他直接的方法。 – gman 2013-02-26 05:04:04

+1

好的非常感謝! :-)你可能想要更新你的答案,並說明WebGL中沒有其他可用的直接方式(對於其他人)。 – raRaRa 2013-02-26 21:09:18