2011-08-31 9 views
12

Para un sombreador de procesamiento posterior, necesito el color y el búfer de profundidad de mi framebuffer. El acceso al buffer de color funciona bien, pero tengo problemas para crear el buffer de profundidad. Siempre sale un error INVALID_ENUM al intentar utilizar texImage2D para la profundidad de textura:WebGL: la profundidad de procesamiento para la textura fbo no funciona

WebGL error INVALID_ENUM in texImage2D(TEXTURE_2D, 0, DEPTH_COMPONENT16, 1536, 502, 0, DEPTH_COMPONENT, UNSIGNED_BYTE, null) 

utilizando un renderbuffer en lugar de una textura de las obras pero quiero profundidad en una textura por lo que puede pasar a un shader.

framebuffer con el código de profundidad de textura:

Framebuffer.prototype.initBufferStuffTexture = function(width, height){ 
    if(this.width == width && this.height == height){ 
     return; 
    } 

    this.width = width; 
    this.height = height; 

    // remove existing buffers 
    gl.bindFramebuffer(gl.FRAMEBUFFER, null); 
    if(this.texture != null){ 
     gl.deleteTexture(this.texture.glid); 
     this.texture = null; 
    } 
    if(this.renderbuffer != null){ 
     gl.deleteRenderbuffer(this.renderbuffer); 
     this.renderbuffer = null; 
    } 
    if(this.framebuffer != null){ 
     gl.deleteFramebuffer(this.framebuffer); 
     this.framebuffer = null; 
    } 

    // create new buffers 
    this.framebuffer = gl.createFramebuffer(); 
    this.texture = new Texture(); 
    this.texture.glid = gl.createTexture(); 
    this.depth = new Texture(); 
    this.depth.glid = gl.createTexture(); 

    // framebuffer 
    gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer); 
    this.framebuffer.width = width; 
    this.framebuffer.height = height; 

    // colorbuffer 
    gl.bindTexture(gl.TEXTURE_2D, this.texture.glid); 
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); 
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); 
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); 
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); 
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.framebuffer.width, this.framebuffer.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); 

    // depthbuffer 
    gl.bindTexture(gl.TEXTURE_2D, this.depth.glid); 
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); 
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); 
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); 
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); 
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT16, this.framebuffer.width, this.framebuffer.height, 0, gl.DEPTH_COMPONENT, gl.UNSIGNED_BYTE, null); 

    // assemble buffers 
    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture.glid, 0); 
    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, this.depth.glid, 0); 

    this.checkBuffer(); 

    gl.bindTexture(gl.TEXTURE_2D, null); 
    gl.bindRenderbuffer(gl.RENDERBUFFER, null); 
    gl.bindFramebuffer(gl.FRAMEBUFFER, null); 
} 

Respuesta

7

La especificación OpenGL ES 2.0 (contra la que se especificó WebGL) no enumera GL_DEPTH_COMPONENT (ni ninguna de sus versiones de tamaño) como un formato interno de textura válido, por lo que parece no admitir texturas de profundidad y no cumple con la especificación WebGL En cualquier lugar donde se comporta de manera diferente, tampoco admite texturas de profundidad.

Pero quizás esto link sea de ayuda, donde las texturas de profundidad se emulan en WebGL empacando el valor de profundidad en una textura de rgba estándar.

+0

Gracias por señalarlo. Si entendí bien, la única forma de obtener información de profundidad es agregar otra pasada que represente toda la escena en una textura rgba usando un sombreador que emite valores de profundidad como valores de rgba. Supongo que tengo que abandonar el procesamiento posterior. Renderizar la escena una sola vez lleva demasiado tiempo, no puedo esforzarme por renderizarla dos veces. Está compuesto por algunos millones de puntos. – Markus

+0

@Markus También puede usar múltiples objetivos de renderizado (representación en un FBO con archivos adjuntos de múltiples colores y, por lo tanto, escribir nuestros múltiples colores desde el sombreador de fragmentos), pero no sé hasta qué punto esto es compatible con WebGL. –

+0

Las publicaciones sobre mrts dicen que no es posible y la especificación solo define "COLOR_ATTACHMENT0". Qué lástima, esa habría sido una buena característica también. – Markus

-3

texImage2D (TEXTURE_2D, 0, DEPTH_COMPONENT16, 1536, 502, 0, DEPTH_COMPONENT, UNSIGNED_BYTE, null)

OpenGL ES ha sido siempre más restrictivo en sus parámetros de transferencia de píxeles que el escritorio GL. Por lo tanto, debe asegurarse de que los parámetros de transferencia de píxeles coincidan con su formato interno, incluso si no está cargando datos. Por lo tanto, pruebe UNSIGNED_SHORT en lugar de UNSIGNED_BYTE.

+0

No funciona tampoco. Tampoco hacen CORTO, BYTE, UNSIGNED_INT, INT y FLOAT con DEPTH_COMPONENT o DEPTH_COMPONENT16 – Markus

Cuestiones relacionadas