Estoy transfiriendo una aplicación C++/OpenGL a WebGL y estoy tratando de crear y configurar un framebuffer.
El framebuffer tiene 3 texturas en las que podemos escribir de tipos: vec2, vec2, uint. (gl.RG32F, gl.RG32F, gl.R32UI)
Así es como inicializo el framebuffer:
var gbuffer = gl.createFramebuffer(); gl.bindFramebuffer(gl.FRAMEBUFFER, gbuffer); var z0_texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, z0_texture); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RG32F, output_canvas.width, output_canvas.height, 0, gl.RG, gl.FLOAT, null); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, z0_texture, 0); var zn_texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, zn_texture); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RG32F, output_canvas.width, output_canvas.height, 0, gl.RG, gl.FLOAT, null); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT1, gl.TEXTURE_2D, zn_texture, 0); var n_texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, n_texture); gl.texImage2D(gl.TEXTURE_2D, 0, gl.R32UI, output_canvas.width, output_canvas.height, 0, gl.RED_INTEGER, gl.UNSIGNED_INT, null); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT2, gl.TEXTURE_2D, n_texture, 0); gl.drawBuffers([gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1, gl.COLOR_ATTACHMENT2]); El framebuffer está incompleto: gl.checkFramebufferStatus(gl.FRAMEBUFFER) devuelve gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT y muestra una advertencia: Framebuffer not complete. (status: 0x8cd6) COLOR_ATTACHMENT1: Attachment has an effective format of RG32F, which is not renderable.
¿Alguna idea de lo que está mal con mi código?
No quiero renderizar estas texturas. Los estoy usando en el post-procesamiento. Eso es lo que hice en C++ pero no puedo hacer lo mismo en WebGL.
No. No puedes hacer lo mismo en WebGL.
El mensaje de error "El archivo adjunto tiene un formato efectivo de RG32F, que no es renderizable" - significa que gl.RG32F no es un formato renderizable. Por lo tanto, no puede usarlo para un framebuffer. Debe utilizar un formato renderizable en color. Consulte la especificación OpenGL ES 3.0 - Tabla 3.13 ( WebGL 2.0 se ajusta estrechamente a OpenGL ES 3.0).
No puede hacer lo mismo en WebGL que en OpenGL de escritorio . En el escritorio , OpenGL RG32F es renderizable en color. Sin embargo, WebGL se basa en OpenGL ES. En OpenGL ES RG32 no es un formato de representación en color. "color renderizable" no significa que puedas renderizar estas texturas. Eso significa que puede renderizar en una textura usando este formato.