【发布时间】: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 互操作部分的显示部分的更多信息吗?