【发布时间】:2021-06-04 00:49:13
【问题描述】:
当我使用 GLFW(在 Windows 操作系统上)创建一个窗口并通过 glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, 1); 将 GLFW_TRANSPARENT_FRAMEBUFFER 设置为 1 时,我无法使用洋红色 glColor3f(1.f, 0.f, 1.f); 绘制矩形。这种颜色使矩形变得透明,让我能够点击窗口的这一部分。
我没想到会出现这种行为,也没有找到任何解释这一点的文档。
我使用GLFW homepage 上的示例代码并添加了一个灰色、黄色和洋红色矩形,其中只有灰色和黄色矩形会产生预期的行为。
Screenshot that shows the window
#include <GLFW/glfw3.h>
int main(void)
{
GLFWwindow* window;
/* Initialize the library */
if (!glfwInit())
return -1;
// ADDED THIS LINE
glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, 1);
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
/* Make the window's context current */
glfwMakeContextCurrent(window);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
// ADDED THE FOLLOWING LINES
// background
glColor3f(0.1f, 0.1f, 0.1f); // gray
glRectf(-0.75f, 0.75f, 0.75f, -0.75f);
// unexpected behavior: makes part of the window transparent and click through
glColor3f(1.f, 0.f, 1.f); // magenta
glRectf(-0.1f, -0.1f, 0, 0);
// draws yellow rect
glColor3f(1.0f, 1.f, 0.f); // yellow
glRectf(-0.1f, 0.1f, 0, 0);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
glfwTerminate();
return 0;
}
当GLFW_TRANSPARENT_FRAMEBUFFER 设置为0 时,洋红色会正确绘制。
【问题讨论】:
-
您使用的是哪个 Windows 版本?根据您的操作系统,glfw 可能仅支持通过透明度键颜色的透明度。
-
还有哪个glfw版本,我觉得老版本用
LWA_COLORKEY,新版本用LWA_ALPHA -
@BDL 我使用的是 Windows 10 专业版 20H2。
-
glfwGetWin32Window 是一个更好的函数来获取 glfw 窗口句柄,应该用来代替 GetActiveWindow,我猜它也可能得到错误的窗口句柄。发表了额外的评论,因为我不能再编辑我的旧评论了。
-
@dareun:您可能想为您的问题写一个自我回答,因为这可能是更多人感兴趣的问题。