From 5138fe2c55548be736374978ca74538137de66c1 Mon Sep 17 00:00:00 2001 From: Michel Breyer Date: Fri, 17 Nov 2017 14:45:37 +0100 Subject: [PATCH 1/4] Fix wrong depth values returned by TinyRenderer --- .../SharedMemory/TinyRendererVisualShapeConverter.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp b/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp index 8274e0bc3..b237e412c 100644 --- a/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp +++ b/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp @@ -1025,12 +1025,13 @@ void TinyRendererVisualShapeConverter::copyCameraImageData(unsigned char* pixels { if (depthBuffer) { - float distance = -m_data->m_depthBuffer[i+startPixelIndex]; float farPlane = m_data->m_camera.getCameraFrustumFar(); float nearPlane = m_data->m_camera.getCameraFrustumNear(); - - btClamp(distance,nearPlane,farPlane); - + + // TinyRenderer returns clip coordinates, transform to eye coordinates first + float z_c = -m_data->m_depthBuffer[i+startPixelIndex]; + float distance = (farPlane - nearPlane) / (farPlane + nearPlane) * (z_c + 2. * farPlane * nearPlane / (farPlane - nearPlane)); + // the depth buffer value is between 0 and 1 float a = farPlane / (farPlane - nearPlane); float b = farPlane * nearPlane / (nearPlane - farPlane); From 8257429964814b953a168d6b345b8ef2f2469f24 Mon Sep 17 00:00:00 2001 From: Michel Breyer Date: Fri, 17 Nov 2017 14:49:12 +0100 Subject: [PATCH 2/4] Fix error discarding fragments in our_gl --- examples/TinyRenderer/our_gl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/TinyRenderer/our_gl.cpp b/examples/TinyRenderer/our_gl.cpp index a47bfe2cb..8ea08f00b 100644 --- a/examples/TinyRenderer/our_gl.cpp +++ b/examples/TinyRenderer/our_gl.cpp @@ -182,7 +182,7 @@ void triangle(mat<4,3,float> &clipc, IShader &shader, TGAImage &image, float *zb bool discard = shader.fragment(bc_clip, color); if (frag_depth<-shader.m_farPlane) discard=true; - if (frag_depth>-shader.m_nearPlane) + if (frag_depth>shader.m_nearPlane) discard=true; if (!discard) { From bb2ee12b861ba56682059f3c11e30b90c9f08e80 Mon Sep 17 00:00:00 2001 From: Michel Breyer Date: Fri, 17 Nov 2017 14:59:24 +0100 Subject: [PATCH 3/4] Initialize TinyRenderer's depth buffer properly. --- examples/SharedMemory/TinyRendererVisualShapeConverter.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp b/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp index b237e412c..31c0ff6d0 100644 --- a/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp +++ b/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp @@ -772,12 +772,13 @@ void TinyRendererVisualShapeConverter::resetCamera(float camDist, float yaw, flo void TinyRendererVisualShapeConverter::clearBuffers(TGAColor& clearColor) { + float farPlane = m_data->m_camera.getCameraFrustumFar(); for(int y=0;ym_swHeight;++y) { for(int x=0;xm_swWidth;++x) { m_data->m_rgbColorBuffer.set(x,y,clearColor); - m_data->m_depthBuffer[x+y*m_data->m_swWidth] = -1e30f; + m_data->m_depthBuffer[x+y*m_data->m_swWidth] = -farPlane; m_data->m_shadowBuffer[x+y*m_data->m_swWidth] = -1e30f; m_data->m_segmentationMaskBuffer[x+y*m_data->m_swWidth] = -1; } @@ -806,13 +807,13 @@ void TinyRendererVisualShapeConverter::render(const float viewMat[16], const flo clearColor.bgra[2] = 255; clearColor.bgra[3] = 255; - clearBuffers(clearColor); float near = projMat[14]/(projMat[10]-1); float far = projMat[14]/(projMat[10]+1); m_data->m_camera.setCameraFrustumNear( near); m_data->m_camera.setCameraFrustumFar(far); - + + clearBuffers(clearColor); ATTRIBUTE_ALIGNED16(btScalar modelMat[16]); From f7e593f8e9f8f32e4cbb74756133c2b89c97f58d Mon Sep 17 00:00:00 2001 From: Michel Breyer Date: Fri, 17 Nov 2017 15:15:11 +0100 Subject: [PATCH 4/4] Simplify the depth value transformations to reduce the number of operations --- .../TinyRendererVisualShapeConverter.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp b/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp index 31c0ff6d0..d44defa34 100644 --- a/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp +++ b/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp @@ -1031,12 +1031,15 @@ void TinyRendererVisualShapeConverter::copyCameraImageData(unsigned char* pixels // TinyRenderer returns clip coordinates, transform to eye coordinates first float z_c = -m_data->m_depthBuffer[i+startPixelIndex]; - float distance = (farPlane - nearPlane) / (farPlane + nearPlane) * (z_c + 2. * farPlane * nearPlane / (farPlane - nearPlane)); + // float distance = (farPlane - nearPlane) / (farPlane + nearPlane) * (z_c + 2. * farPlane * nearPlane / (farPlane - nearPlane)); - // the depth buffer value is between 0 and 1 - float a = farPlane / (farPlane - nearPlane); - float b = farPlane * nearPlane / (nearPlane - farPlane); - depthBuffer[i] = a + b / distance; + // The depth buffer value is between 0 and 1 + // float a = farPlane / (farPlane - nearPlane); + // float b = farPlane * nearPlane / (nearPlane - farPlane); + // depthBuffer[i] = a + b / distance; + + // Simply the above expressions + depthBuffer[i] = farPlane * (nearPlane + z_c) / (2. * farPlane * nearPlane + farPlane * z_c - nearPlane * z_c); } if (segmentationMaskBuffer) {