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);
来源: http://www.bubuko.com/infodetail-2583695.html