openGL深度缓冲的glReadPixels函数读取以及真实数值的计算
1glReadPixels保证glReadPixcels函数中的depthwidth*depthHeight大小和最后开辟的内存sceneDepthBuffer大小一样,要不然会报缺乏pdb文件的错误。if (hasVR)//头盔{depthWidth = vr.getVRHmdScreenWidth();depthHeigth = vr.getVRHmdScreenHeigth();sceneD
·
1 glReadPixels
保证glReadPixcels函数中的depthwidth*depthHeight大小和最后开辟的内存sceneDepthBuffer大小一样,要不然会报缺乏pdb文件的错误。
if (hasVR)//头盔
{
depthWidth = vr.getVRHmdScreenWidth();
depthHeigth = vr.getVRHmdScreenHeigth();
sceneDepthBuffer = (float *)malloc(sizeof(float)*depthWidth*depthHeigth);
memset(sceneDepthBuffer, 0, sizeof(float)*depthWidth*depthHeigth);//将开辟的内存清零
glReadPixels(0, 0, depthWidth, depthHeigth, GL_DEPTH_COMPONENT, GL_FLOAT, sceneDepthBuffer);
}
else//没有头盔的时候
{
depthWidth = curWidth;
depthHeigth = curHeight;
sceneDepthBuffer = (float *)malloc(sizeof(float)*curHeight*curWidth);
memset(sceneDepthBuffer, 0, sizeof(float)*curWidth*curHeight);//将内存清零
glReadPixels(0, 0, curWidth, curHeight, GL_DEPTH_COMPONENT, GL_FLOAT, sceneDepthBuffer);
}
2 深度真实值
https://www.cnblogs.com/bzyzhang/p/12667859.html
if (hasVR)
{
depthWidth = vr.getVRHmdScreenWidth();
depthHeigth = vr.getVRHmdScreenHeigth();
sceneDepthBuffer = (float *)malloc(sizeof(float)*depthWidth*depthHeigth);
memset(sceneDepthBuffer, 0, sizeof(float)*depthWidth*depthHeigth);//将开辟的内存清零
glReadPixels(0, 0, depthWidth, depthHeigth, GL_DEPTH_COMPONENT, GL_FLOAT, sceneDepthBuffer);
}
else
{
depthWidth = curWidth;
depthHeigth = curHeight;
sceneDepthBuffer = (float *)malloc(sizeof(float)*curHeight*curWidth);
memset(sceneDepthBuffer, 0, sizeof(float)*curWidth*curHeight);//将内存清零
glReadPixels(0, 0, curWidth, curHeight, GL_DEPTH_COMPONENT, GL_FLOAT, sceneDepthBuffer);
}
float sum = 0;
float tempMax = 0;
float tempMin=0;
for (int i = 0; i < depthHeigth; i++)//左半部分
{
for (int j = 0; j < depthWidth / 2; j++)
{
tempMax = 1 / (sceneDepthBuffer[0] * (1 / cameraNoVR.farClip - 1 / cameraNoVR.nearClip) + 1 / cameraNoVR.nearClip);
tempMin = 1/(sceneDepthBuffer[0] * (1 / cameraNoVR.farClip - 1 / cameraNoVR.nearClip) + 1 / cameraNoVR.nearClip);
/*if (temp< sceneDepthBuffer[i*depthWidth / 2 + j])
{
temp = sceneDepthBuffer[i*depthWidth / 2 + j];
}*/
//cout << "depth["<< i * depthWidth / 2 + j<< "]"<<sceneDepthBuffer[i*depthWidth / 2 + j] << endl;
float Denominator = sceneDepthBuffer[i*depthWidth / 2 + j] * (1 / cameraNoVR.farClip - 1 / cameraNoVR.nearClip) + 1 / cameraNoVR.nearClip;
float zValueReal = 1 / Denominator;
if (tempMax < zValueReal)
{
tempMax = zValueReal;
}
if (tempMin>zValueReal)
{
tempMin = zValueReal;
}
sum += zValueReal;
}
}
zMaxLeft = tempMax;
zMinLeft = tempMin;
//zMaxLeft = temp;
zAverageLeft = sum / (depthHeigth*depthWidth / 2);
//保存深度数据
ofstream recordDepth;
recordDepth.open("zMaxLeft.txt", ios::app);
recordDepth << zMaxLeft << endl;
recordDepth.close();
recordDepth.open("zMinLeft.txt", ios::app);
recordDepth << zMinLeft << endl;
recordDepth.close();
recordDepth.open("zAverageLeft.txt", ios::app);
recordDepth << zAverageLeft << endl;
recordDepth.close();
float sumRight = 0;
float tempRightMax = 0;
float tempRightMin = 0;
for (int i = depthWidth / 2; i < depthWidth; i++)//右半部分
{
for (int j = 0; j < depthHeigth; j++)
{
float Denominator = sceneDepthBuffer[i*depthWidth / 2 + j] * (1 / cameraNoVR.farClip - 1 / cameraNoVR.nearClip) + 1 / cameraNoVR.nearClip;
tempRightMax = 1 / (sceneDepthBuffer[0] * (1 / cameraNoVR.farClip - 1 / cameraNoVR.nearClip) + 1 / cameraNoVR.nearClip);
tempRightMin = 1 / (sceneDepthBuffer[0] * (1 / cameraNoVR.farClip - 1 / cameraNoVR.nearClip) + 1 / cameraNoVR.nearClip);
float zValueReal = 1 / Denominator;
if (tempRightMax < zValueReal)
{
tempRightMax = zValueReal;
}
if (tempRightMin > zValueReal)
{
tempRightMin = zValueReal;
}
sumRight += zValueReal;
}
}
zMaxRight = tempRightMax;
zMinRight = tempRightMin;
zAverageRight=sumRight/ (depthHeigth*depthWidth / 2);
//保存深度数据
recordDepth.open("zMaxRight.txt", ios::app);
recordDepth << zMaxRight << endl;
recordDepth.close();
recordDepth.open("zMinRight.txt", ios::app);
recordDepth << zMinRight << endl;
recordDepth.close();
recordDepth.open("zAverageRight.txt", ios::app);
recordDepth << zAverageRight << endl;
recordDepth.close();

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)