【问题标题】:Transparent OpenGL Window draws weird透明的 OpenGL 窗口画得很奇怪
【发布时间】:2014-07-09 14:28:20
【问题描述】:

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

片段着色器是

#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。

有什么办法可以解决这个问题吗?

【问题讨论】:

  • 我对你在问什么感到困惑。图像中的绿色框是完全不透明的。它也是纯绿色的。我不知道你为什么说“它必须是绿色的,但它不是”显然是绿色的。此外,您是否尝试使绿色框透明?
  • 添加您可能想查看我的wglarb 库的“分层”测试程序。这是一个有效的 DWM 模糊/透明示例。我知道它并不能真正解决您的问题,但您可能会发现这为您提供了一个不错的开端。 github.com/datenwolf/wglarb
  • @Freddy 这个绿框不是不透明的,看看底部的文字:当背景是白色的时候,绿框的alpha突然变成了0。
  • @datenwolf 谢谢,我试试看。

标签: c++ opengl dwm


【解决方案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);

我认为这欺骗了模糊,因为该区域完全是错误的。

所以一切看起来就像我想要的那样

希望这可能对某人有所帮助。

【讨论】:

    【解决方案2】:

    今天刚遇到同样的问题。我试图通过使用DwmExtendFrameIntoClientArea 制作一个透明窗口,然后将窗口边框设置为隐藏。这样做时,除了纯白色之外的所有颜色都呈现为半透明。

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

    DwmEnableBlurBehindWindow 函数

    ...

    备注

    遵守窗口中的 alpha 值,并且模糊顶部的渲染将使用这些 alpha 值。确保窗口中所有像素的 alpha 值正确是应用程序的责任。 ...

    source (doc.microsoft.com)

    似乎在使用 24 位颜色模式时,alpha 值被视为 0(透明)而不是 255(不透明)。所以,只要改成 32 位颜色模式就可以解决问题了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 2018-07-08
      • 2012-06-29
      • 1970-01-01
      • 2020-08-18
      相关资源
      最近更新 更多