本文主要是介绍openni example NiViewer opengl block,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在linux ubuntu 16.04 LTS 上测试,发现openNI 的NiViewer 会阻塞在opengl的函数,如:glclear。
void drawFrame()
{// calculate locationsg_DrawConfig.DepthLocation.uBottom = 0;g_DrawConfig.DepthLocation.uTop = g_NonFullWinSize.Y - 1;g_DrawConfig.DepthLocation.uLeft = 0;g_DrawConfig.DepthLocation.uRight = g_NonFullWinSize.X - 1;g_DrawConfig.ColorLocation.uBottom = 0;g_DrawConfig.ColorLocation.uTop = g_NonFullWinSize.Y - 1;g_DrawConfig.ColorLocation.uLeft = 0;g_DrawConfig.ColorLocation.uRight = g_NonFullWinSize.X - 1;if (g_DrawConfig.Streams.ScreenArrangement == SIDE_BY_SIDE){g_DrawConfig.DepthLocation.uRight = g_NonFullWinSize.X / 2 - 1;g_DrawConfig.ColorLocation.uLeft = g_NonFullWinSize.X / 2;}// Texture map initopenni::VideoFrameRef* pDepthMD = &getDepthFrame();if (isDepthOn() && pDepthMD->isValid()){TextureMapInit(&g_texDepth, pDepthMD->getVideoMode().getResolutionX(), pDepthMD->getVideoMode().getResolutionY(), 4, pDepthMD->getWidth(), pDepthMD->getHeight());fixLocation(&g_DrawConfig.DepthLocation, pDepthMD->getVideoMode().getResolutionX(), pDepthMD->getVideoMode().getResolutionY());}openni::VideoFrameRef* pImageMD = NULL;if (isColorOn()){pImageMD = &getColorFrame();}else if (isIROn()){pImageMD = &getIRFrame();}if (pImageMD != NULL && pImageMD->isValid()){TextureMapInit(&g_texColor, pImageMD->getVideoMode().getResolutionX(), pImageMD->getVideoMode().getResolutionY(), 4, pImageMD->getWidth(), pImageMD->getHeight());fixLocation(&g_DrawConfig.ColorLocation, pImageMD->getVideoMode().getResolutionX(), pImageMD->getVideoMode().getResolutionY());}// check if pointer is over a mapbool bOverDepth = (pDepthMD != NULL && pDepthMD->isValid()) && isPointInRect(g_DrawUserInput.Cursor, &g_DrawConfig.DepthLocation);bool bOverImage = (pImageMD != NULL && pImageMD->isValid()) && isPointInRect(g_DrawUserInput.Cursor, &g_DrawConfig.ColorLocation);bool bDrawDepthPointer = false;bool bDrawImagePointer = false;int imagePointerRed = 255;int imagePointerGreen = 0;int imagePointerBlue = 0;IntPair pointerInDepth = {0,0};IntPair pointerInColor = {0,0};if (bOverImage){pointerInColor.X = (double)(g_DrawUserInput.Cursor.X - g_DrawConfig.ColorLocation.uLeft) / (g_DrawConfig.ColorLocation.uRight - g_DrawConfig.ColorLocation.uLeft + 1) * pImageMD->getVideoMode().getResolutionX();pointerInColor.Y = (double)(g_DrawUserInput.Cursor.Y - g_DrawConfig.ColorLocation.uBottom) / (g_DrawConfig.ColorLocation.uTop - g_DrawConfig.ColorLocation.uBottom + 1) * pImageMD->getVideoMode().getResolutionY();bDrawImagePointer = true;}if (bOverDepth){pointerInDepth.X = (double)(g_DrawUserInput.Cursor.X - g_DrawConfig.DepthLocation.uLeft) / (g_DrawConfig.DepthLocation.uRight - g_DrawConfig.DepthLocation.uLeft + 1) * pDepthMD->getVideoMode().getResolutionX();pointerInDepth.Y = (double)(g_DrawUserInput.Cursor.Y - g_DrawConfig.DepthLocation.uBottom) / (g_DrawConfig.DepthLocation.uTop - g_DrawConfig.DepthLocation.uBottom + 1) * pDepthMD->getVideoMode().getResolutionY();bDrawDepthPointer = true;if (!bOverImage && g_DrawConfig.bShowPointer &&pointerInDepth.X >= pDepthMD->getCropOriginX() && pointerInDepth.X < (pDepthMD->getCropOriginX() + pDepthMD->getWidth()) &&pointerInDepth.Y >= pDepthMD->getCropOriginY() && pointerInDepth.Y < (pDepthMD->getCropOriginY() + pDepthMD->getHeight())){// try to translate depth pixel to imageopenni::DepthPixel* pDepthPixels = (openni::DepthPixel*)pDepthMD->getData();openni::DepthPixel pointerDepth = pDepthPixels[(pointerInDepth.Y - pDepthMD->getCropOriginY()) * pDepthMD->getWidth() + (pointerInDepth.X - pDepthMD->getCropOriginX())];if (convertDepthPointToColor(pointerInDepth.X, pointerInDepth.Y, pointerDepth, &pointerInColor.X, &pointerInColor.Y)){bDrawImagePointer = true;imagePointerRed = 0;imagePointerGreen = 0;imagePointerBlue = 255;}}} glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);// Setup the opengl env for fixed location viewglMatrixMode(GL_PROJECTION);glPushMatrix();glLoadIdentity();glOrtho(0,g_NonFullWinSize.X,g_NonFullWinSize.Y,0,-1.0,1.0);glDisable(GL_DEPTH_TEST); if (g_DrawConfig.Streams.Depth.Coloring == CYCLIC_RAINBOW_HISTOGRAM || g_DrawConfig.Streams.Depth.Coloring == LINEAR_HISTOGRAM || g_DrawConfig.bShowPointer)calculateHistogram();drawColor(&g_DrawConfig.ColorLocation, bDrawImagePointer ? &pointerInColor : NULL, imagePointerRed, imagePointerGreen, imagePointerBlue);drawDepth(&g_DrawConfig.DepthLocation, bDrawDepthPointer ? &pointerInDepth : NULL);printRecordingInfo();if (g_DrawConfig.bShowPointer){drawPointerMode(bOverDepth ? &pointerInDepth : NULL);drawUserInput(!bOverDepth && !bOverImage);}if(isPointInRect(g_DrawUserInput.Cursor, &g_DrawConfig.DepthLocation)){drawUserdrag(bOverDepth ? &pointerInDepth : NULL);}drawUserMessage();drawPlaybackSpeed();if (g_DrawConfig.strErrorState[0] != '\0')drawErrorState();if (g_DrawConfig.bHelp)drawHelpScreen();glutSwapBuffers();
}
这篇关于openni example NiViewer opengl block的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!