解决方案 »

  1.   

    看来我可能又发错版块了,不知道OpenGL相关的知识应该发到哪里?
      

  2.   

    这是一个解决方案,不过我的程序最终是在linux服务器下跑的,没有显示器,通过SSH远程控制。
    现在程序运行报错:GLUT: failed to open display. 也就是说程序不能创建窗口。
      

  3.   

    opengl窗口是通过啥创建的?我记得是不是gtk还是啥的,这个你得查查
      

  4.   

    如果不创建窗口就不能实现截图的功能,那么如何解决“GLUT: failed to open display”的错误呢?这个错误产生的背景是:1.程序运行在Linux服务器(没有显示器);2.我通过Debian远程控制服务器运行程序。
      

  5.   

    现在的解决思路有了,使用OpenGL的FBO(frame buffer object)进行离屏渲染,可是这需要使用glGenRenderbuffers等函数,而想使用这些函数又必须使用glew,使用glew就必须创建窗口后对其初始化(glewInit()),结果还是没办法用。
    我就想知道,不使用glew,就不能使用FBO吗?
      

  6.   

     你可以将图像画在内存中啊 然后一样的用glReadPixels就行了
    CDC MemImg;
    CBitmap MemBitmap;
    HGLRC hRC;
    MemImg.CreateCompatibleDC(NULL);
    MemBitmap.CreateCompatibleBitmap(this->GetDC(), XPIXEL, YPIXEL);
    MemImg.SelectObject(&MemBitmap);
    int PixelFormat;
    PIXELFORMATDESCRIPTOR pfd =
    {
        sizeof(PIXELFORMATDESCRIPTOR), // Structure size.
        1,                             // Structure version number.
        PFD_DRAW_TO_WINDOW |           // Property flags.
        PFD_SUPPORT_OPENGL |
        PFD_SUPPORT_GDI,
        PFD_TYPE_RGBA,
        24,                            // 24-bit color.
        0, 0, 0, 0, 0, 0,              // Not concerned with these.
        0, 0, 0, 0, 0, 0, 0,           // No alpha or accum buffer.
        32,                            // 32-bit depth buffer.
        0, 0,                          // No stencil or aux buffer.
        PFD_MAIN_PLANE,                // Main layer type.
        0,                             // Reserved.
        0, 0, 0                        // Unsupported.
    };
    PixelFormat = ChoosePixelFormat(MemImg, &pfd);
    SetPixelFormat(MemImg, PixelFormat, &pfd); //设置设备描述表的像素格式
    hRC = wglCreateContext(MemImg); //指定的设备描述表产生一个图形操作描述表
    wglMakeCurrent(MemImg, hRC); //指定当前的DC,RC
    //画图
    glFlush();
    SwapBuffers(MemImg);
    //glReadPixels
    wglMakeCurrent(NULL, NULL);
      

  7.   


    你说的本身是没有错的,只是不能实现我的要求:1)我不想创建窗口,你这里用到了DC,应该需要创建窗口;2)我的程序需要跨平台(主要实在linux下),所以不能使用windows下的API,因此我选择了使用glut;3)我现在的疑问是,OpenGL能否不创建窗口进行渲染(按我目前所知,不能!不知道有没有大神可以给个肯定的答复)。
    依然谢谢你。
      

  8.   


    *(FARPROC *)&qwglGetProcAddress = GetProcAddress(hOpenGL, "wglGetProcAddress");
    const char *extension = (const char *)qglGetString(GL_EXTENSIONS);
    if (strstr(extension, "GL_EXT_framebuffer_object"))
    {
    qglDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)qwglGetProcAddress("glDeleteFramebuffersEXT");
    qglDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)qwglGetProcAddress("glDeleteRenderbuffersEXT");
    qglGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)qwglGetProcAddress("glGenFramebuffersEXT");
    qglBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)qwglGetProcAddress("glBindFramebufferEXT");
    qglGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)qwglGetProcAddress("glGenRenderbuffersEXT");
    qglBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)qwglGetProcAddress("glBindRenderbufferEXT");
    qglFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)qwglGetProcAddress("glFramebufferRenderbufferEXT");
    qglCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)qwglGetProcAddress("glCheckFramebufferStatusEXT");
    qglRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)qwglGetProcAddress("glRenderbufferStorageEXT");
    qglFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)qwglGetProcAddress("glFramebufferTexture2DEXT"); gl_framebuffer_object = true;
    }
    直接用不行吗?为什么非得glew?
    顺便这个直接渲染到纹理就行了吧,没必要开FBO