3D 엔진에 후 처리 효과를 통합하는 과정에 있습니다. 나는 FrameBuffer Object를 사용하여 깊이 데이터를 캡처하여로드 블록을 때렸다. WebGL. FrameBuffer에 색상 데이터를 캡처하는 데 문제가 없습니다. 그러나 Chrome/Firefox 용 깊이 확장 기능을 사용하는 경우에도 깊이 데이터을 얻을 수 없습니다.WebGL FrameBuffer - 렌더링 깊이 텍스처
var DepthEXT = webGLContext.getExtension("WEBKIT_WEBGL_depth_texture") ||
webGLContext.getExtension("MOZ_WEBGL_depth_texture");
설정에 문제가 있는지 확인하기 위해 여러 가지 설정을 시도했지만 시도해 본 결과 아무 것도 볼 수 없었습니다. 게시물 끝에있는 스크린 샷은 텍스처로 렌더링 된 색상 첨부와 텍스처로 렌더링 된 깊이 첨부를 보여줍니다. FrameBuffer를 초기화 할 때 문제가 있습니까? 아니면 다른 곳에서이 문제를 해결해야합니까? 여기
// Frame Buffer
this.m_frameBuffer = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, this.m_frameBuffer);
// Render Buffer
this.m_renderBuffer = gl.createRenderbuffer();
gl.bindRenderbuffer(gl.RENDERBUFFER, this.m_renderBuffer);
gl.renderbufferStorage(
gl.RENDERBUFFER,
gl.DEPTH_COMPONENT16,
sharedRenderer.canvasDOMElement.width,
sharedRenderer.canvasDOMElement.height);
// Diffuse Component
this.m_diffuseComponentTexture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, this.m_diffuseComponentTexture);
gl.texParameteri(
gl.TEXTURE_2D,
gl.TEXTURE_MAG_FILTER,
gl.LINEAR);
gl.texParameteri(
gl.TEXTURE_2D,
gl.TEXTURE_MIN_FILTER,
gl.LINEAR);
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,
sharedRenderer.canvasDOMElement.width,
sharedRenderer.canvasDOMElement.height,
0,
gl.RGBA,
gl.UNSIGNED_BYTE,
null);
// Depth
this.m_depthComponentTexture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, this.m_depthComponentTexture);
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_COMPONENT,
sharedRenderer.canvasDOMElement.width,
sharedRenderer.canvasDOMElement.height,
0,
gl.DEPTH_COMPONENT,
gl.UNSIGNED_SHORT,
null);
// FrameBuffer
// Diffuse
gl.framebufferTexture2D(
gl.FRAMEBUFFER,
gl.COLOR_ATTACHMENT0,
gl.TEXTURE_2D,
this.m_diffuseComponentTexture,
0);
// Depth
gl.framebufferTexture2D(
gl.FRAMEBUFFER,
gl.DEPTH_ATTACHMENT,
gl.TEXTURE_2D,
this.m_depthComponentTexture,
0);
// RenderBuffer
gl.framebufferRenderbuffer(
gl.FRAMEBUFFER,
gl.DEPTH_ATTACHMENT,
gl.RENDERBUFFER,
this.m_renderBuffer);
// Unbind buffers and textures
gl.bindTexture(gl.TEXTURE_2D, null);
gl.bindRenderbuffer(gl.RENDERBUFFER, null);
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
나는 프레임 버퍼에 현재 장면을 렌더링하는 코드입니다 :
다음은 프레임 버퍼 개체를 초기화 내 코드입니다.
CBRenderer.prototype.renderSceneToGBuffer = function(sceneToRender, GBufferTarget, deltaSeconds)
{
CBMatrixStack.clearMatrixStackAndPushIdentityMatrix();
this.applyProjectionMatrix();
GBufferTarget.bindGBufferFrameBuffer();
this.renderer.enable(this.renderer.DEPTH_TEST);
this.renderer.depthMask(true);
this.renderer.clearDepth(1.0);
this.renderer.clearColor(0.1, 0.1, 0.1, 0.0);
this.renderer.clear(this.renderer.COLOR_BUFFER_BIT | this.renderer.DEPTH_BUFFER_BIT);
sceneToRender.render(deltaSeconds);
this.renderer.flush();
GBufferTarget.m_dirty = false;
GBufferTarget.unbindGBufferFrameBuffer();
this.renderer.clearColor(0.0, 0.0, 0.0, 0.0);
this.renderer.clear(this.renderer.COLOR_BUFFER_BIT | this.renderer.DEPTH_BUFFER_BIT);
this.renderer.bindTexture(this.renderer.TEXTURE_2D, null);
}
당신의 'near-plane'이 '1.0'이고 원거리 평면이'1000.0' 인 경우, 단지 8bit에서 깊이의 차이를 출력 할 수 없습니다. 따라서 깊이 버퍼가 정확할 수도 있지만 출력물을 시각화 할 수 없습니다. 왜 당신의 깊이를'1.0', 당신은'depthFunc'를 사용하고 있습니까? –
비행기 근처가 1.0이고 먼 거리가 1000.0입니다. 내 depthFunc는 depthFunc (LEQUAL)입니다. 나는 1.0에 가까운 값을 100.0으로 조정했고 여전히 흰 텍스처를 보았습니다. –
깊이 버퍼에 흰색 화면이있는 사용자 : https://stackoverflow.com/a/44357374/3012928 –