2011-08-31 4 views
12

후 처리 셰이더의 경우 프레임 버퍼의 색상과 깊이 버퍼가 필요합니다. colorbuffer에 액세스하면 잘 작동하지만 depthbuffer를 만드는 데 문제가 있습니다. 텍스처 작품 대신 renderbuffer를 사용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이 지정됨)은 GL_DEPTH_COMPONENT (또는 해당 크기 버전)을 유효한 텍스처 내부 형식으로 나열하지 않으므로 심도 텍스처를 지원하지 않는 것으로 보입니다. WebGL 사양과 달리 다르게 동작하는 곳이라면 깊이 텍스처를 지원하지 않습니다.

하지만 어쩌면이 link은 깊이 값을 표준 rgba 텍스처에 압축하여 WebGL에서 깊이 txture를 에뮬레이션하는 데 도움이됩니다.

+0

감사합니다. 내가 깊이 이해할 수 있다면 깊이 정보를 얻는 유일한 방법은 rgba 값으로 깊이 값을 출력하는 셰이더를 사용하여 전체 장면을 rgba 텍스처로 렌더링하는 또 다른 패스를 추가하는 것입니다. 나는 사후 처리를해야한다고 생각합니다. 장면을 한 번 렌더링하는 데 너무 오래 걸리는 경우, 나는 그것을 두 번 렌더링하지 못한다. 그것은 수백만 점으로 구성되어 있습니다. – Markus

+0

@Markus 여러 개의 렌더링 대상을 사용할 수도 있습니다 (여러 색상의 첨부 파일이있는 FBO로 렌더링하므로 여러 색상을 조각 쉐이더에서 작성).하지만 WebGL에서 이것이 얼마나 멀리 지원되는지는 잘 모릅니다. –

+0

mrts에 대한 게시물은 불가능하다고 말하면서 사양은 "COLOR_ATTACHMENT0"만을 정의합니다. 이 얼마나 핏방울, 그것은 좋은 특징이었을 것입니다. – Markus

-3

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

OpenGL은 ES 항상왔다 데스크톱 GL보다 픽셀 전송 매개 변수가 더 제한적입니다. 따라서 실제로 데이터를 업로드하지 않는 경우에도 픽셀 전송 매개 변수가 내부 형식과 일치하는지 확인해야합니다. 따라서 UNSIGNED_BYTE 대신 UNSIGNED_SHORT를 시도하십시오.

+0

작동하지 않습니다. DEPTH_COMPONENT 또는 DEPTH_COMPONENT16을 사용하여 SHORT, BYTE, UNSIGNED_INT, INT 및 FLOAT도 수행하지 마십시오. – Markus

관련 문제