3

我正在尝试在其颜色缓冲区中设置一个带有 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 通道。]

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

4

1 回答 1

2

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

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

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

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

应评论中某些人的要求,我特此提出我的谦虚努力,以供其他人受益。Mac 支持还不工作,Linux 上没有实现菜单,Linux 上的用户输入只有一半。截至 2013 年 1 月 18 日,它可能会暂时在这里找到(未来的人们,我可能在我的网站上放了新版本(寻找“Portcullis”))。

于 2013-02-19T02:49:02.743 回答