【问题标题】:How to make the background transparent in fullscreen mode (in OpenGL)?如何在全屏模式下(在 OpenGL 中)使背景透明?
【发布时间】:2020-11-01 13:29:02
【问题描述】:

我想创建一个透明背景,但它只有在第 4 个(监视器)参数设置为 NULL 时才有效。如果我将窗口修改为全屏(如下面的代码所示),背景就会变成黑色而没有任何透明度。有什么解决办法吗?

注意:我只希望背景是透明的。不是整个窗口及其内容。

//at configuring  
glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, 1);       

...  

//at window creation  
GLFWmonitor* primary = glfwGetPrimaryMonitor();  
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Application",primary, NULL);

...

//in render loop  
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

【问题讨论】:

  • Windows 上所有“独家全屏”恶作剧的要点之一是绕过桌面合成器(以消除额外的延迟和额外的复制步骤),如果你绕过对于合成器,透明度不再有意义,因为没有背景,也没有实例可以将您的输出混合到该背景上。
  • @derhass 所以主要问题是我不明白全屏的真正工作原理以及它对构图的作用。现在我已经设法使用 glfwWindowHint(GLFW_DECORATED, GL_FALSE); 在无边框窗口中运行应用程序;提示,它就像我想象的那样工作。谢谢你的回答!

标签: c++ windows opengl visual-studio-2019 glfw


【解决方案1】:

我尝试了一些东西,如果您在 OS 主题上支持透明,则默认情况下看起来透明正在工作(某些 Windows 7 主题只是纯色,所以要小心,因为您的 OS 主题将禁用 OS 透明支持)。
main.cpp 文件:

// INCLUDE
#include "main.h"

// DECLARATION
static void key_event(GLFWwindow*, int, int, int, int);

// GLOBAL VARIABLES
int app_width = 512;
int app_height = 256;

// RUN
void main(void)
{
    if (!glfwInit()) { exit(EXIT_FAILURE); }

    //glfwWindowHint(GLFW_DECORATED, GLFW_FALSE);
    glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_TRUE);

    GLFWmonitor* monitor = glfwGetPrimaryMonitor();
    const GLFWvidmode* mode = glfwGetVideoMode(monitor);
    GLFWwindow* window = glfwCreateWindow(mode->width, mode->height, "GLFW Test", monitor, NULL);

    glfwSetKeyCallback(window, key_event);
    glfwMakeContextCurrent(window);
    glfwSwapInterval(1);

    while (!glfwWindowShouldClose(window))
    {
        glfwGetFramebufferSize(window, &app_width, &app_height);
        glViewport(0, 0, app_width, app_height);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

        // TO DO
        glBegin(GL_TRIANGLES);
        glVertex2f(-0.5f, -0.5f);
        glVertex2f(0.0f, 0.5f);
        glVertex2f(0.5f, -0.5f);
        glEnd();

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwDestroyWindow(window);
    exit(EXIT_SUCCESS);
}

static void key_event(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) { 
        glfwSetWindowShouldClose(window, GLFW_TRUE); 
        glfwTerminate();
        exit(EXIT_SUCCESS);
    }
}


main.h 文件:

#pragma once

// INCLUDE
#include <iostream>
#include <conio.h>
#include <GLFW/glfw3.h>

对我来说正在工作。 (我看看如果 glClearColor 没有完整的 0.0f 值,背景将不会完全透明...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    相关资源
    最近更新 更多