基于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);

猜你喜欢

转载自www.cnblogs.com/rainbow70626/p/8978186.html