Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 没有hWnd如何使用glReadPixels?_Windows_Opengl_Pixels - Fatal编程技术网

Windows 没有hWnd如何使用glReadPixels?

Windows 没有hWnd如何使用glReadPixels?,windows,opengl,pixels,Windows,Opengl,Pixels,我成功地从DC读取OpenGL渲染的像素。 这是我代码的一部分 void COpenGLWnd::OffscreenRender (/* IN parameters */ int transitionID, int counts, int directionID, /* OUT parameters */ BYTE* pPixelArray) { HDC hDC = ::GetDC(m_hWnd); SetDCPixelFormat(hDC); HGLR

我成功地从DC读取OpenGL渲染的像素。 这是我代码的一部分

void COpenGLWnd::OffscreenRender
    (/* IN parameters */ int transitionID, int counts, int directionID,
    /* OUT parameters */ BYTE* pPixelArray)
{
    HDC hDC = ::GetDC(m_hWnd);
    SetDCPixelFormat(hDC);

    HGLRC hRC = wglCreateContext(hDC);
    VERIFY(wglMakeCurrent(hDC, hRC));

    for(int i = 0; i < counts; i++)
    {
        GLFadeinRender((GLfloat)(i+1) / (GLfloat)counts);

        BYTE* data = (BYTE*) malloc(m_BmpSize);
        glReadBuffer(GL_BACK);
        glReadPixels(0,0,m_BmpWidth,m_BmpHeight,GL_BGR_EXT,GL_UNSIGNED_BYTE, data);

        memcpy(&pPixelArray[i * m_BmpSize], data, m_BmpSize);
        free(data);
    }

    wglMakeCurrent(hDC, NULL);
    wglDeleteContext(hRC);
    ::ReleaseDC(m_hWnd, hDC);
}
它工作得很好,但我想使用glReadPixels而不使用hWnd。我听说PBO或FBO可能会对这种情况有所帮助,但我做不到。下面是我试图用PBO呈现的代码

void COpenGLWnd::OffscreenRender
    (/* IN parameters */ int transitionID, int counts, int directionID,
    /* OUT parameters */ BYTE* pPixelArray)
{
    GLuint pbo;
    glGenBuffersARB(1,&pbo);
    glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pbo);
    glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, m_BmpSize, NULL, GL_STREAM_READ_ARB);
    glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);

    for(int i = 0; i < counts; i++)
    {
        glReadBuffer(GL_BACK);
        glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pbo);

        GLFadeinRender((GLfloat)(i+1) / (GLfloat)counts);

        glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pbo);
        //glReadBuffer(GL_BACK);
        glReadPixels(0,0,m_BmpWidth,m_BmpHeight,GL_BGR_EXT,GL_UNSIGNED_BYTE, 0);
        BYTE* data = (BYTE*) glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB);

        memcpy(&pPixelArray[i * m_BmpSize], data, m_BmpSize);

        if(data)
        {
            glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
        }

        glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB,0);
    }

    glDeleteBuffers(1,&pbo);
}
但当时什么也没发生。没有像素读取。
因此,我可以不使用hWnd进行屏幕外渲染和读取像素吗?

首先,在这段代码中,您需要hWnd的唯一原因是为您的窗口设置渲染上下文。如果使用非屏幕解决方案(如FBO),则仍然需要渲染上下文。我得到的印象是,您的实际问题是:在没有窗口的情况下如何渲染?您可以使用内存设备上下文/WGL pbuffer,以免与PBO或隐藏窗口混淆。但从根本上说,您仍然需要渲染上下文,而这正是您第二次尝试编写此代码所缺少的。谢谢您的回答!那么你的意思是我仍然需要使用HGLRC和HDC,并使用WGL_ARB_缓冲区?你能告诉我如何使用WGL\u ARB\u缓冲区吗?谢谢