【问题标题】:openGL PBO use wglcontext, Not create windowopenGL PBO 使用 wglcontext,不创建窗口
【发布时间】:2023-03-27 01:35:02
【问题描述】:

我的目标是从主窗口获取像素数据。没有任何渲染。 就像我们看到的屏幕截图之类的监视器。

我试图透明窗口,glReadPixel。 所以我有一个透明的窗口和上下文。

glfwSetErrorCallback(errorCallback);

if (!glfwInit()) {
    std::cerr << "Error: GLFW " << std::endl;
    exit(EXIT_FAILURE);
}
glfwWindowHint(GLFW_DEPTH_BITS, 16);
glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_TRUE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);  
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_SAMPLES, 4);


const int Monitor_count = GetMonitors();

GLwindow = glfwCreateWindow(
    nWidth, // width
    nHeight, // height
    "OpenGL_Test", // window title
    NULL, NULL);
if (!GLwindow) {
    glfwTerminate();
    exit(EXIT_FAILURE);
}
glfwSwapInterval(1);    
//glfwShowWindow(GLwindow);


if (glfwGetWindowAttrib(GLwindow, GLFW_TRANSPARENT_FRAMEBUFFER))
{
    // ..
}
glfwSetWindowOpacity(GLwindow, 0.0f);

glfwMakeContextCurrent(GLwindow);
glfwSetKeyCallback(GLwindow, keyCallback);
glewExperimental = GL_TRUE;
GLenum errorCode = glewInit();

但我想在不创建窗口的情况下从 GPU 获取像素数据。

所以我使用 wglcreatecontext 获取母窗口 DC,HGLRC。

当我设置绑定缓冲区时,它会给出运行时错误。

if (!glfwInit()) {
    std::cerr << "Error: GLFW" << std::endl;
    exit(EXIT_FAILURE);
}
HDCC = GetDC(m_hWndCopy);
// HDC TDC = CreateCompatibleDC(HDCC);
HGLRC DC = wglCreateContext(HDCC);

GLuint pbo;
glGenBuffersARB(1, &pbo);     <<Error Here
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pbo);

我该如何解决问题?

任何想法或链接?

【问题讨论】:

  • 如果你想在屏幕外渲染,那么创建一个隐藏窗口并使用 FBO。 AFAIK 您无法为没有窗口的 DC 创建 OpenGL 加速上下文。无论如何,您必须先致电SetPixelFormat,然后再致电wglCreateContext
  • @ybungalobill 谢谢回复。我不想创建任何额外的窗口。从主窗口创建上下文。我的目标是从主窗口获取像素数据。不渲染。
  • 那么创建额外的 DC 和渲染上下文有什么意义呢?
  • @ybungalobill 我的目标是从主窗口获取像素数据。没有任何渲染。我修改了问题。
  • 我曾经写过一个答案SO: OpenGL offscreen render 可能会有所帮助。

标签: c++ opengl glfw wgl


【解决方案1】:

从我收集到的您的问题和评论回复中,您想使用 OpenGL 来抓取任意窗口的屏幕截图?如果是这样,那么这不是 OpenGL 的目的。 您不能可靠地使用 OpenGL 进行屏幕截图。

glReadPixels对您最初使用 OpenGL 绘制的内容可靠地工作!

【讨论】:

  • 感谢您的明智回答。独立地,有没有办法通过初始化wglcontext(glew glfw ...)而不创建窗口来创建和绑定PBO?
  • @Birds:OpenGL 规范本身并没有定义上下文创建的工作方式,而是由操作系统决定。在某些操作系统(例如 Linux,具有某些驱动程序)上,确实可以创建纯粹的屏幕外上下文。还有一些供应商特定的 API 可以在 Windows 上执行相同的操作。 然而自 OpenGL-3.3 以来,规范实际上声明,一旦创建了上下文,它也应该可以在没有附加可绘制对象的情况下使用。
  • @Birds:不过,在 Windows 上,要以适用于所有环境的方式创建 OpenGL 上下文,它总是需要创建至少一个临时窗口。您需要此窗口来创建初始代理 OpenGL 上下文,该上下文可用于加载执行 OpenGL-1.1 之后添加的操作所需的所有扩展函数;在这些函数中,还有创建 OpenGL-3.3 核心或更高版本上下文所需的函数。
  • @Birds: 所以操作顺序是: 1. 创建不可见的临时窗口 2. 创建临时代理OpenGL上下文 3. 加载扩展函数 4. 使用扩展函数创建OpenGL-3.x或更高版本版本上下文 5. 处理临时窗口和代理上下文。
猜你喜欢
  • 1970-01-01
  • 2014-01-18
  • 2014-02-19
  • 2016-07-11
  • 1970-01-01
  • 2014-09-29
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多