openGL深度缓冲的glReadPixels函数读取以及真实数值的计算

tech2022-10-26  86

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();
最新回复(0)