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();

Logo

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

更多推荐