使用GL_RGBA颜色缓冲区设置Win32 OpenGL窗口

时间:2013-02-14 12:31:00

标签: winapi opengl window rgba

我正在尝试在其颜色缓冲区中设置一个带有alpha通道的OpenGL窗口。不幸的是,我目前的设置是创建一个GL_RGB后端和前端缓冲区(由gDEBugger报告,并且如我的实验所示)。

我像这样设置窗口:

PIXELFORMATDESCRIPTOR pfd;
ZeroMemory(&pfd,sizeof(pfd));
pfd.nSize = sizeof(pfd);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24; //note by docs that alpha doesn't go here (though putting 32 changes nothing)
pfd.cDepthBits = 24;
pfd.iLayerType = PFD_MAIN_PLANE;

我还特别尝试过:

PIXELFORMATDESCRIPTOR pfd = {
    sizeof(PIXELFORMATDESCRIPTOR),
    1,
    PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
    PFD_TYPE_RGBA,
    24,
    8,0, 8,8, 8,16, 8,24, //A guess for lil endian; usually these are 0 (making them 0 doesn't help)
    0, 0,0,0,0,
    24, //depth
    8,  //stencil
    0,  //aux
    PFD_MAIN_PLANE,
    0,
    0, 0, 0
};

我的理解是,当我稍后调用ChoosePixelFormat时,它会返回一个没有alpha通道的格式(虽然为什么,我不知道)。

我应该澄清一下,当我说alpha缓冲区时,我的意思是只是一个简单的alpha缓冲区用于渲染目的(每种颜色都有一个alpha值,片段可以对其进行测试,依此类推)。我不是指半透明窗口或其他一些效果。 [编辑:所以不,我此时并不感兴趣使窗口本身透明。我只想要一个默认帧缓冲区的alpha通道。]

[编辑:这是我正在编写的跨平台窗口后端的一部分。我的代码总是可移植的。我没有使用提供此功能的库,因为我需要更多控制。]

1 个答案:

答案 0 :(得分:2)

这里有两个要点需要考虑:

  • 可以使用默认的帧缓冲区执行此操作。但是,您需要正确地请求它。 Windows的默认选择机制似乎不具备非常高的RGBA权重。最好的课程似乎是枚举所有可能的像素模式,然后按原样选择你想要的“手动”像素模式。通过这样做,我还能够指定我想要一个24位深度缓冲区,一个累加缓冲区和一个8位模板缓冲区。

  • OpenGL上下文对于alpha混合,深度测试以及任何甚至远程高级技术都必须完全有效。奇怪的是,我能够在没有完全有效的OpenGL上下文的情况下获得渲染的三角形,导致我的困惑!也许它是用软件模拟的?当glewInit(更不用说制作一些VBO)惨遭失败时,我想通了。关键点是OpenGL上下文必须有效。就我而言,我没有正确设置。

这个问题出现在我目前正在编写轻量级跨平台窗口工具包的上下文中。目前,它通过Win32 API,Linux到X11支持Windows,我刚开始通过X11移植到Mac OS。

应评论中的一些人的要求,我特此提出我的谦卑努力,其他人可能会受益。 Mac支持还不起作用,Linux上没有实现菜单,Linux上的用户输入只有一半。截至2013年1月18日,可能会暂时找到here(未来的人,我可能会在my website上添加新版本(寻找“Portcullis”)。)