基于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 = * * ;
pPixelData =new unsigned char[aSwathLengthDownsampled];
ZeroMemory(pPixelData,aSwathLengthDownsampled);
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
int offset=i**+j*;
pPixelData[offset] = ;//红色
pPixelData[offset + ] = ;
pPixelData[offset + ] = ;
}
}
}

  绘制时的代码:

glTexImage2D(GL_TEXTURE_2D, , GL_RGB, width, height, , GL_RGB, GL_UNSIGNED_BYTE, NULL);

  函数glTexImage2D()中的GL_RGB设置一定要与CreateTexturePixel()函数中像素域严格保持一致,否则显示的图像会呈现花块状。

2、基于VC++ MFC SDI+CUDA+OpenGL组合的遥感影像显示

  在该组合方案下,初始化时按照下面的方式完成OpenGL参数的设置:

static PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR),
,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, //标志
PFD_TYPE_RGBA, //颜色模式
, //颜色位数
, , , , , ,
, , , , , , ,
, //深度位数
,
,
PFD_MAIN_PLANE,
,
, ,
};

  事实证明在MFC SDI中结构体PIXELFORMATDESCRIPTOR的字段iPixelType中设置为PFD_TYPE_RGBA,包含Alpha通道,而后续绘制纹理时指定纹理的像素域为GL_RGBA或者GL_RGB,均可以得到同样的绘制结果,与是否包含Alpha通道无关,也与前面的结构体中的iPixelType字段的设置值无关,即绘制纹理时采用下面两种代码形式,均可得到一样的效果。唯一的要求是:函数glTexImage2D()中的GL_RGB设置一定要与CreateTexturePixel()函数中像素域严格保持一致,否则显示的图像会呈现花块状。

//方式1
glTexImage2D(GL_TEXTURE_2D, , GL_RGBA, width, height, , GL_RGBA, GL_UNSIGNED_BYTE, NULL);
//方式2
glTexImage2D(GL_TEXTURE_2D, , GL_RGB, width, height, , GL_RGB, GL_UNSIGNED_BYTE, NULL);
上一篇:Tesseract-OCR4.0识别中文与训练字库实例


下一篇:【Java】解析Java对XML的操作