【发布时间】: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 谢谢,我试试看。