2011-08-31 48 views
12

後処理シェーダの場合、フレームバッファの色と深度バッファが必要です。カラーバッファへのアクセスはうまくいきますが、深度バッファを作成する際に問題があります。代わりに、テクスチャ作品のレンダを使用してWebGL - fboテクスチャへのレンダー深度が機能しない

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

を私はシェーダに渡すことができますので、私は、テクスチャに奥行きをしたい:深度テクスチャのためtexImage2Dを使用しようとすると、私はいつもINVALID_ENUMエラーを取得します。

深度テクスチャコードでフレームバッファ:

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); 
} 

答えて

7

のOpenGL ES 2.0仕様(それに対してWebGLのが指定された)は、深度テクスチャをサポートし、WebGLの仕様doesnのようにしないと思われるので、GL_DEPTH_COMPONENT(またはそのサイズバージョンのいずれか)の有効なテクスチャの内部形式としては表示されません。それが異なる動作をする場所であれば、深度テクスチャもサポートしていません。

しかし、おそらく、このlinkは、標準のrgbaテクスチャに深度値をパックすることでWebGLで深度テクスチャがエミュレートされる場合に役立ちます。

+0

これを指摘してくれてありがとう。私がそのことを理解していれば、奥行き情報を取得する唯一の方法は、奥行き値をrgba値として出力するシェーダーを使用してシーン全体をrgbaテクスチャにレンダリングする別のパスを追加することです。 私は後処理を捨てなければならないと思う。シーンを一度レンダリングするのは時間がかかりすぎるので、私はそれを2度レンダリングすることはできません。それは数百万点で構成されています。 – Markus

+0

@Markus複数のレンダーターゲットを使用することもできます(複数のカラーアタッチメントを持つFBOにレンダリングし、複数のカラーをフラグメントシェーダーから作成することもできます)。しかし、WebGLでこれがどれくらいサポートされているか分かりません。 –

+0

mrtsについての投稿は不可能であり、仕様は "COLOR_ATTACHMENT0"しか定義していないと言います。なんて哀れみ、それは素晴らしい機能だっただろう。 – Markus

-3

のOpenGL ESは、常にされているtexImage2D(TEXTURE_2D、0、DEPTH_COMPONENT16 1536、502、0、DEPTH_COMPONENT、UNSIGNED_BYTE、ヌル)

そのピクセル転送パラメータはデスクトップGLよりも制限的です。したがって、実際にデータをアップロードしていない場合でも、ピクセル転送パラメータが内部フォーマットと一致するようにする必要があります。 UNSIGNED_BYTEではなくUNSIGNED_SHORTを試してください。

+0

どちらも機能しません。 DEPTH_COMPONENTまたはDEPTH_COMPONENT16でSHORT、BYTE、UNSIGNED_INT、INTおよびFLOATを実行しないでください。 – Markus

関連する問題