【问题标题】:Displaying images with different sizes on a single window using CUDA OpenGL使用 CUDA OpenGL 在单个窗口上显示不同大小的图像
【发布时间】:2014-08-06 16:44:53
【问题描述】:

我有两张不同尺寸的图像(图像 1 的尺寸:W1*H1,图像 2 的尺寸:W2*H2)。通过启动两个 Cuda 内核正确处理了这些图像。现在我想使用 CUDA-OpenGL 互操作将它们显示在一个寡妇中。水平显示还是垂直显示都可以。该应用程序适用于窗口上的一个图像。如果有人能告诉我如何在一个窗口上正确显示多个图像,我将不胜感激?

unsigned int ScreenWidth = W1+W2;
unsigned int ScreenHeight = H1+H2;    
static void display (void)
 {
   unsigned char *ImPtr;
   size_t mapped_size;
   checkCudaErrors(cudaGraphicsMapResources(1, &pbo_r, 0));
   checkCudaErrors(cudaGraphicsResourceGetMappedPointer((void **)&ImPtr, &mapped_size,pbo_r));

   CrossSectionKernel<<<grid1, block1>>>(ImPtr, W1, H1);

   EnFaceKernel<<<grid2, block2>>> &ImPtr[W1*H1], W2, H2);

   checkCudaErrors(cudaGraphicsUnmapResources(1, &pbo_r, 0));

   glClear(GL_COLOR_BUFFER_BIT);

   glBindTexture(GL_TEXTURE_2D, textureID);
   glBindBuffer(GL_PIXEL_UNPACK_BUFFER, bufferObj);
   glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, ScreenWidth, ScreenHeight,GL_LUMINANCE, GL_UNSIGNED_BYTE, 0);
   glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);

   glDisable(GL_DEPTH_TEST);
   glEnable(GL_TEXTURE_2D);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

   glBegin(GL_QUADS);
     glVertex2f(0, 0);
     glTexCoord2f(0, 0);
     glVertex2f(0, 1);
     glTexCoord2f(0, 1);
     glVertex2f(1, 1);
     glTexCoord2f(1, 1);
     glVertex2f(1, 0);
     glTexCoord2f(1, 0);
   glEnd();
  glBindTexture(GL_TEXTURE_2D, 0);
  glutSwapBuffers();
  glutPostRedisplay();
 }

void initGL(int *argc, char **argv)
{
  glutInit(argc, argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
  glutInitWindowSize(ScreenWidth, ScreenHeight);
  glutCreateWindow("One Frame");

  glewInit();
} 

void createPBO()
{
  glGenBuffers(1, &bufferObj);
  glBindBuffer(GL_PIXEL_UNPACK_BUFFER, bufferObj);
  glBufferData(GL_PIXEL_UNPACK_BUFFER, (W1*H1 + W2*H2)*sizeof(unsigned char), NULL, GL_STREAM_DRAW);
  glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0 );
  checkCudaErrors(cudaGraphicsGLRegisterBuffer(&pbo_r, bufferObj, cudaGraphicsMapFlagsWriteDiscard));
}

void createTexture()
{
 glGenTextures(1,&textureID);
 glBindTexture( GL_TEXTURE_2D, textureID);
 glTexImage2D( GL_TEXTURE_2D, 0, GL_LUMINANCE, ScreenWidth, ScreenHeight, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
 glBindTexture( GL_TEXTURE_2D, 0);

 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
 glPixelStorei(GL_PACK_ALIGNMENT, 1);
}

int main(int argc, char **argv)
{
  initGL(&argc, argv);

  cudaDeviceProp prop;
  int dev;

  memset(&prop, 0, sizeof(cudaDeviceProp));
  prop.major = 1;
  prop.minor = 0;
  checkCudaErrors(cudaChooseDevice(&dev, &prop));

  cudaGLSetGLDevice(dev);

  glutDisplayFunc(display);

  createPBO();
  createTexture();
  glutMainLoop();  

  return 0;
}  

【问题讨论】:

  • 横截面?面对?您碰巧使用 OCT 图像吗?
  • 是的!我计划在一个窗口中显示横截面和正面图像。非常感谢您的提示。我分别创建了两个 PBO 和纹理,还通过使用分离的目标(指向分离的 PBO 的两个不同指针)复制了横截面和正面图像数据。现在我的问题是:如何在一个窗口中显示这两个 PBO?
  • 对不起,我有法律义务不再告诉你任何事情。我是 Optores optores.com 的联合创始人,我们专注于超高速 OCT。今天我们关于实时 MHz-OCT 的论文也发表了:dx.doi.org/10.1364/BOE.5.002963 所以你的问题涉及到一个我不能发布信息的主题,这可能是我们公司的商业机密。
  • 我知道显示图像与那部分并不真正相关,但你正在做 OCT 工作,所以这就是为什么我必须在这里遮住我的臀部。
  • 感谢您的回答。我明白。您可以向我介绍一些有用的书籍/资源,我可以获得有关 CUDA-OpenGL 互操作部分的显示部分的更多信息吗?

标签: opengl cuda


【解决方案1】:

我会给你一个提示:你正在执行两种不同的操作,但你只使用了一个目标位置ImPtr。在每次 CUDA 内核执行后立即将内存 ImPtr 指向的内容复制到 OpenGL 纹理,或者使用两个不同的 PBO。无论如何,您都应该使用两种纹理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多