透明的OpenGL窗口很奇怪

时间:2014-07-09 14:28:21

标签: c++ opengl dwm

所以我有一个带OpenGL 3.3 Context的透明窗口(Windows 8)。每当我尝试绘制某些东西时,为什么会像这样绘制半透明,但我希望它不透明:

enter image description here

片段着色器是

#version 330 core

uniform sampler2D Texture;
uniform sampler2D Texture2;

in vec2 fragTexcoord;
out vec4 color;

void main(void)
{
    color = vec4(0.0, 1.0, 0.0, 1.0);
}

所以它只是绿色,但它不是;

我也试图通过两种方式实现透明度:使用MARGINS和DWM_BLURBEHIND:

    DWM_BLURBEHIND bb = {0};
    bb.dwFlags = DWM_BB_ENABLE;
    bb.fEnable = true;
    bb.fTransitionOnMaximized = 1;
    bb.hRgnBlur = CreateRectRgn(-0, -0, 1000, 1000);


    DwmEnableBlurBehindWindow(_hWnd, &bb);


    SendMessage(_hWnd, WM_PAINT, NULL, NULL);


    UpdateWindow(_hWnd);

    // The second way
    MARGINS margins;
    margins.cxLeftWidth = 0;
    margins.cyTopHeight = 0;
    margins.cxRightWidth = _Options.width;
    margins.cyBottomHeight = _Options.height;
    DwmExtendFrameIntoClientArea(_hWnd, &margins);

但两种方式都是一样的。

这里我设置了像素格式:

    PIXELFORMATDESCRIPTOR pfd;
    int format;

    memset(&pfd, 0, sizeof(pfd));
    pfd.nSize = sizeof(pfd);
    pfd.nVersion = 1;
    pfd.dwFlags =  PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_SUPPORT_COMPOSITION;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 24;
    pfd.cDepthBits = 24;
    pfd.iLayerType = PFD_MAIN_PLANE;

该窗口具有WS_EX_COMPOSITED和WS_POPUP样式。 glClearColor设置为0.0f,0.0f,0.0f,0.0f。

任何想法我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

对于那些可能关心的人:我终于找到了答案。

基本上,我做了那些步骤:

1)像这样设置像素格式

int format;

memset(&pfd, 0, sizeof(pfd));
pfd.nSize = sizeof(pfd);
pfd.nVersion = 1;
pfd.dwFlags =  PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_SUPPORT_COMPOSITION;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 24;
pfd.cAlphaBits = 8;
pfd.cGreenBits = 8;
pfd.cRedBits = 8;
pfd.cStencilBits = 8;
pfd.cBlueBits = 8;
pfd.iLayerType = PFD_MAIN_PLANE;

2)然后我像这样设置模糊:

DWM_BLURBEHIND bb = {0};
bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;
bb.fEnable = true;
bb.fTransitionOnMaximized = 1;
bb.hRgnBlur = CreateRectRgn(0, 0, -1, -1);

我认为这会导致模糊,因为该地区完全错误。

那么它看起来就像我想要的那样

enter image description here

希望这可能有助于某人。

答案 1 :(得分:0)

今天刚遇到同样的问题。我试图使用DwmExtendFrameIntoClientArea来创建透明窗口,然后将窗口边框设置为隐藏。这样做时,除纯白色以外的所有颜色都将变为半透明。

原因是:我使用的是24位颜色格式(红色:8,绿色:8,蓝色:8, alpha:0

  

DwmEnableBlurBehindWindow函数

     

...

     

备注

     

窗口中的alpha值被接受,并且在模糊之上的渲染将使用这些alpha值。应用程序有责任确保窗口中所有像素的alpha值正确。 ...

source (doc.microsoft.com)

似乎在使用24位彩色模式时,alpha值被视为0(透明)而不是255(不透明)。因此,只需更改为32位彩色模式即可解决该问题。