// init tex
glGenTextures(1, &m_depthMapTex);
glBindTexture(GL_TEXTURE_2D, m_depthMapTex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, m_width, m_height,
0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
// init frame buffer
glGenFramebuffersEXT(1, &m_depthMapFBO);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_depthMapFBO);
glBindTexture(GL_TEXTURE_2D, m_depthMapTex);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_depthMapTex, 0);
// render depth
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDisable(GL_LIGHTING);
glDepthMask(GL_TRUE);
glEnable(GL_DEPTH_TEST);
glViewport(0, 0, m_width, m_height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
Eigen::Matrix4f proj = Eigen::projectFromInstrincs<float>(
m_raster->shot.m_intrinsics, m_width, m_height, m_zNear, m_zFar);
if (proj.IsRowMajor) {
proj.transposeInPlace();
}
glMultMatrixf(proj.data());
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
Eigen::Matrix4f modelview = m_modelMat * m_raster->shot.m_extrinsics;
if (modelview.IsRowMajor) {
modelview.transposeInPlace();
}
glMultMatrixf(modelview.data());
glBegin(GL_TRIANGLES);
glColor3ub(127, 127, 127);
for (int cnt = 0; cnt < m_mesh->m_faces.rows(); cnt++) {
int idx1 = m_mesh->m_faces(cnt, 0);
int idx2 = m_mesh->m_faces(cnt, 1);
int idx3 = m_mesh->m_faces(cnt, 2);
glVertex3f(m_mesh->m_vertices(idx1, 0),
m_mesh->m_vertices(idx1, 1), m_mesh->m_vertices(idx1, 2));
glVertex3f(m_mesh->m_vertices(idx2, 0),
m_mesh->m_vertices(idx2, 1), m_mesh->m_vertices(idx2, 2));
glVertex3f(m_mesh->m_vertices(idx3, 0),
m_mesh->m_vertices(idx3, 1), m_mesh->m_vertices(idx3, 2));
}
glEnd();
// make sure matrix is column major storage, to meet OpenGL requirement
Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor> teximage(m_width, m_height);
glGetTexImage(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, GL_FLOAT, teximage.data());
if (!m_outDepthFile.empty()) {
cv::Mat outDepthImage(m_height, m_width, CV_32FC1);
float* pOutDepthImage = (float*)outDepthImage.data;
float min = teximage.minCoeff();
float max = teximage.maxCoeff();
float scale = float(UINT16_MAX - 1) / (max - min);
std::cout << min << " min - (visibility - depth) - max " << max << std::endl;
Eigen::Map<Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor>> texOut(pOutDepthImage, m_width, m_height);
texOut = (teximage.array() - min) * scale;
cv::Mat out, flipped;
outDepthImage.convertTo(out, CV_16UC1);
cv::flip(out, flipped, 0);
cv::imwrite(m_outDepthFile, flipped);
}