C++ openGL PBO使用wglcontext,而不是创建窗口
我的目标是从主窗口获取像素数据。没有任何渲染。 就像我们看到的屏幕截图一样 我试着让窗口透明,glReadPixel。 所以我有一个透明的窗口和上下文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
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);