簡體   English   中英

透明的 OpenGL 窗口繪制怪異

[英]Transparent OpenGL Window draws weird

所以我有一個帶有 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。

任何想法我該如何解決這個問題?

對於那些可能關心的人:我終於找到了答案。

所以基本上,我做了這些步驟:

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)然后我像這樣設置blurbehind:

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

我認為這欺騙了模糊,因為該區域完全錯誤。

那么這一切看起來就像我想要的

在此處輸入圖片說明

希望這可以幫助某人。

今天剛遇到同樣的問題。 我試圖通過使用DwmExtendFrameIntoClientArea制作一個透明窗口,然后將窗口邊框設置為隱藏。 這樣做時,除純白色外的所有顏色都呈現為半透明。

原因是:我使用的是 24 位顏色格式(紅色:8,綠色:8,藍色:8, alpha:0

DwmEnableBlurBehindWindow 函數

...

評論

窗口中的 alpha 值受到尊重,模糊頂部的渲染將使用這些 alpha 值。 確保窗口中所有像素的 alpha 值正確是應用程序的責任。 ...

來源 (doc.microsoft.com)

似乎在使用 24 位顏色模式時,alpha 值被視為 0(透明)而不是 255(不透明)。 因此,只需更改為 32 位顏色模式即可解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM