Windows 没有hWnd如何使用glReadPixels?
我成功地从DC读取OpenGL渲染的像素。 这是我代码的一部分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
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缓冲区吗?谢谢