【问题标题】:GLFW magenta color causes unexpected behaviorGLFW 洋红色会导致意外行为
【发布时间】: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:您可能想为您的问题写一个自我回答,因为这可能是更多人感兴趣的问题。

标签: c++ windows opengl glfw


【解决方案1】:

此行为的原因是当前透明度颜色键等于洋红色。以这种颜色绘制的所有像素都是透明的。

要更改颜色键(在 Windows 操作系统上),您可以调用函数 SetLayeredWindowAttributes

此示例将颜色键更改为红色: SetLayeredWindowAttributes(glfwGetWin32Window(window), RGB(255, 0, 0), NULL, LWA_COLORKEY);

函数的documentation 对颜色键的说明如下:

crKey

类型:COLORREF

一个 COLORREF 结构,用于指定要使用的透明度颜色键 组成分层窗口时使用。绘制的所有像素 这种颜色的窗口将是透明的。要生成 COLORREF,请使用 RGB 宏。

为了调用glfwGetWin32Window,您需要定义宏#define GLFW_EXPOSE_NATIVE_WIN32 并包含#include &lt;GLFW/glfw3native.h&gt;,如here 所述。

【讨论】:

  • 这适用于 GLFW 3.3.2 版,但不适用于 3.3.3 版。然而,最初的问题在 3.3.3 版上不再出现。
  • 我猜这个提交显示了最初问题的原因以及为什么它不再出现在版本 3.3.3 中:github.com/glfw/glfw/commit/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多