Merge remote-tracking branch 'bp/master'

This commit is contained in:
erwincoumans 2017-11-17 16:21:09 -08:00
commit b2a1eeb754
2 changed files with 17 additions and 12 deletions

View File

@ -772,12 +772,13 @@ void TinyRendererVisualShapeConverter::resetCamera(float camDist, float yaw, flo
void TinyRendererVisualShapeConverter::clearBuffers(TGAColor& clearColor) void TinyRendererVisualShapeConverter::clearBuffers(TGAColor& clearColor)
{ {
float farPlane = m_data->m_camera.getCameraFrustumFar();
for(int y=0;y<m_data->m_swHeight;++y) for(int y=0;y<m_data->m_swHeight;++y)
{ {
for(int x=0;x<m_data->m_swWidth;++x) for(int x=0;x<m_data->m_swWidth;++x)
{ {
m_data->m_rgbColorBuffer.set(x,y,clearColor); 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_shadowBuffer[x+y*m_data->m_swWidth] = -1e30f;
m_data->m_segmentationMaskBuffer[x+y*m_data->m_swWidth] = -1; 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[2] = 255;
clearColor.bgra[3] = 255; clearColor.bgra[3] = 255;
clearBuffers(clearColor);
float near = projMat[14]/(projMat[10]-1); float near = projMat[14]/(projMat[10]-1);
float far = projMat[14]/(projMat[10]+1); float far = projMat[14]/(projMat[10]+1);
m_data->m_camera.setCameraFrustumNear( near); m_data->m_camera.setCameraFrustumNear( near);
m_data->m_camera.setCameraFrustumFar(far); m_data->m_camera.setCameraFrustumFar(far);
clearBuffers(clearColor);
ATTRIBUTE_ALIGNED16(btScalar modelMat[16]); ATTRIBUTE_ALIGNED16(btScalar modelMat[16]);
@ -1025,16 +1026,20 @@ void TinyRendererVisualShapeConverter::copyCameraImageData(unsigned char* pixels
{ {
if (depthBuffer) if (depthBuffer)
{ {
float distance = -m_data->m_depthBuffer[i+startPixelIndex];
float farPlane = m_data->m_camera.getCameraFrustumFar(); float farPlane = m_data->m_camera.getCameraFrustumFar();
float nearPlane = m_data->m_camera.getCameraFrustumNear(); 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];
// the depth buffer value is between 0 and 1 // float distance = (farPlane - nearPlane) / (farPlane + nearPlane) * (z_c + 2. * farPlane * nearPlane / (farPlane - nearPlane));
float a = farPlane / (farPlane - nearPlane);
float b = farPlane * nearPlane / (nearPlane - farPlane); // The depth buffer value is between 0 and 1
depthBuffer[i] = a + b / distance; // 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) if (segmentationMaskBuffer)
{ {

View File

@ -182,7 +182,7 @@ void triangle(mat<4,3,float> &clipc, IShader &shader, TGAImage &image, float *zb
bool discard = shader.fragment(bc_clip, color); bool discard = shader.fragment(bc_clip, color);
if (frag_depth<-shader.m_farPlane) if (frag_depth<-shader.m_farPlane)
discard=true; discard=true;
if (frag_depth>-shader.m_nearPlane) if (frag_depth>shader.m_nearPlane)
discard=true; discard=true;
if (!discard) { if (!discard) {