후 처리 셰이더의 경우 프레임 버퍼의 색상과 깊이 버퍼가 필요합니다. 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);
}
감사합니다. 내가 깊이 이해할 수 있다면 깊이 정보를 얻는 유일한 방법은 rgba 값으로 깊이 값을 출력하는 셰이더를 사용하여 전체 장면을 rgba 텍스처로 렌더링하는 또 다른 패스를 추가하는 것입니다. 나는 사후 처리를해야한다고 생각합니다. 장면을 한 번 렌더링하는 데 너무 오래 걸리는 경우, 나는 그것을 두 번 렌더링하지 못한다. 그것은 수백만 점으로 구성되어 있습니다. – Markus
@Markus 여러 개의 렌더링 대상을 사용할 수도 있습니다 (여러 색상의 첨부 파일이있는 FBO로 렌더링하므로 여러 색상을 조각 쉐이더에서 작성).하지만 WebGL에서 이것이 얼마나 멀리 지원되는지는 잘 모릅니다. –
mrts에 대한 게시물은 불가능하다고 말하면서 사양은 "COLOR_ATTACHMENT0"만을 정의합니다. 이 얼마나 핏방울, 그것은 좋은 특징이었을 것입니다. – Markus