我正在尝试创建一个不可见的覆盖层来捕获触摸事件(它将负责使用
oscpack
发送数据包)。因此,我需要创建一个透明的全屏窗口。 (编辑:如果交叉兼容性有问题,win32 就可以了)
在官方文档中,
ofBackground
好像是接受alpha blending的,但是我写的ofBackground(0, 255, 0, 10);
运行项目的时候,窗口不透明。
我也尝试使用ofEnableAlphaBlending();
,但结果是一样的。 (我认为它只能为新绘制的东西启用 alpha 混合)
我试图挖掘更多,我在这个方法中发现了一点评论:
ofAppGlutWindow::setupOpenGL(int w, int h, int screenMode)
{
//code
}
/*
ofBackground(200,200,200); // default bg color
ofSetColor(0xFFFFFF); // default draw color
// used to be black, but
// black + texture = black
// so maybe grey bg
// and "white" fg color
// as default works the best...
*/
这并没有像我最初想象的那样帮助我,我仍然被困住了。
您不能直接使用 openFrameworks 执行此操作。您需要创建一个具有透明背景的 OpenGL 上下文。这很难做到,我不知道你是否可以将它与 oF 集成,但你可以测试this.
但是如果你在 OSX 上,有这个插件:ofxTransparentWindow
一个肮脏的技巧是抓取桌面图像并将其作为背景放在您的应用程序中。
截至 2023 年 3 月!对于 Windows、macOS 和 Linux,您现在可以使用以下设置在 GLFW openFrameworks 中启用透明度。
ofGLFWWindowSettings settings;
settings.transparent = true;
所以以下是 main.cpp 的示例:
int main( ){
//Use ofGLFWWindowSettings for more options like multi-monitor fullscreen
ofGLFWWindowSettings settings;
settings.setSize(1024, 768);
settings.windowMode = OF_WINDOW; //can also be OF_FULLSCREEN
settings.glVersionMajor = 3.0;
settings.glVersionMinor = 3.0;
settings.transparent = true;
auto window = ofCreateWindow(settings);
ofRunApp(window, make_shared<ofApp>());
ofRunMainLoop();
}
然后您需要做的就是通过 ofClear 方法清除每帧的后备缓冲区。
ofClear(0.0f, 0.0f, 0.0f, 0.0f);
所以在 App::draw() 的例子中,开始时清除缓冲区
void ofApp::draw(){
ofClear(0.0f, 0.0f, 0.0f, 0.0f);
// other draw code after clear
}
从技术上讲,这是通过 GLFW 提示 - GLFW_TRANSPARENT_FRAMEBUFFER 实现的,它现在使用 settings.transparent 作为它的值。