【发布时间】: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 可能会有所帮助。