基于VC++ Win32+CUDA+OpenGL组合与VC++ MFC SDI+CUDA+OpenGL组合两种方案的遥感影像显示:获得的重要结论!
1、基于VC++ Win32+CUDA+OpenGL组合的遥感影像显示
在该组合方案下,初始化时将OpenGL设置为下面两种方式,效果一样
//设置方式1 glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA); //设置方式2 glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
从遥感影像数据中提取出像素数据,可将其中的R、G、B三通道依次赋值给OpenGL的像素缓冲区对象 (PBO,Pixel Buffer Object)所指定的像素数据内存的R、G、B三通道。下面是测试用的产生像素数据的测试代码,实际遥感影像显示中该段代码会被CUDA核函数取代,用于从遥感影像数据文件中提取真正的像素数据。
//创建红色的纹理像素数据 void CRSQuickLookView::CreateTexturePixel() { int aSwathLengthDownsampled = 1024 * 3 * 512; pPixelData =new unsigned char[aSwathLengthDownsampled]; ZeroMemory(pPixelData,aSwathLengthDownsampled); for (int i = 0; i < 512; i++) { for (int j = 0; j < 1024; j++) { int offset=i*1024*3+j*3; pPixelData[offset] = 255;//红色 pPixelData[offset + 1] = 0; pPixelData[offset + 2] = 0; } } }
绘制时的代码:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
函数glTexImage2D()中的GL_RGB设置一定要与CreateTexturePixel()函数中像素域严格保持一致,否则显示的图像会呈现花块状。
2、基于VC++ MFC SDI+CUDA+OpenGL组合的遥感影像显示
在该组合方案下,初始化时按照下面的方式完成OpenGL参数的设置:
static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, //标志 PFD_TYPE_RGBA, //颜色模式 24, //颜色位数 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, //深度位数 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0 };
事实证明在MFC SDI中结构体PIXELFORMATDESCRIPTOR的字段iPixelType中设置为PFD_TYPE_RGBA,包含Alpha通道,而后续绘制纹理时指定纹理的像素域为GL_RGBA或者GL_RGB,均可以得到同样的绘制结果,与是否包含Alpha通道无关,也与前面的结构体中的iPixelType字段的设置值无关,即绘制纹理时采用下面两种代码形式,均可得到一样的效果。唯一的要求是:函数glTexImage2D()中的GL_RGB设置一定要与CreateTexturePixel()函数中像素域严格保持一致,否则显示的图像会呈现花块状。
//方式1 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); //方式2 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);