C++ openGL PBO使用wglcontext,而不是创建窗口

C++ openGL PBO使用wglcontext,而不是创建窗口,c++,opengl,glfw,wgl,C++,Opengl,Glfw,Wgl,我的目标是从主窗口获取像素数据。没有任何渲染。 就像我们看到的屏幕截图一样 我试着让窗口透明,glReadPixel。 所以我有一个透明的窗口和上下文 glfwSetErrorCallback(errorCallback); if (!glfwInit()) { std::cerr << "Error: GLFW " << std::endl; exit(EXIT_FAILURE); } glfwWindowHint(GLFW_DEPTH_BITS, 1

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

我试着让窗口透明,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();
glfwSetErrorCallback(errorCallback);
如果(!glfwInit()){

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


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

如果您要在屏幕外渲染,请创建一个隐藏窗口并使用FBO。否则,您无法为没有窗口的DC创建OpenGL加速上下文。在任何情况下,您必须在
之前首先调用
SetPixelFormat
>wglCreateContext
@ybungalobill谢谢回复。我不想创建任何其他窗口。从主窗口创建上下文。我的目标是从主窗口获取像素数据。不渲染。那么创建其他DC和渲染上下文有什么意义?@ybungalobill我的目标是从主窗口获取像素数据。没有任何渲染。我修改了这个问题。我曾经写过一个可能会有帮助的答案。感谢您明智的回答。单独来说,没有办法通过初始化wglcontext(glew glfw…)来创建和绑定PBO吗不创建窗口?@Birds:OpenGL规范本身并不定义上下文创建的工作方式,而是将其留给操作系统。在某些操作系统上(例如Linux,带有某些驱动程序)确实可以创建一个纯屏幕外的上下文。也有一些特定于供应商的API在Windows上执行同样的操作。但是,自从OpenGL-3.3规范开始,该规范实际上规定,一旦创建了上下文,它也可以在没有可绘制附件的情况下使用。@Birds:在Windows上,在如果在所有环境中都能运行,则始终需要至少创建一个临时窗口。您需要此窗口来创建初始代理OpenGL上下文,该上下文可用于加载执行OpenGL-1.1之后添加的操作所需的所有扩展函数;这些函数中还包括创建Ope所需的函数nGL-3.3核心或更高版本上下文。@Birds:因此操作顺序是:1.创建不可见的临时窗口2.创建临时代理OpenGL上下文3.加载扩展函数4.使用扩展函数创建OpenGL-3.x或更高版本上下文5.处理临时窗口和代理上下文。
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);