首页
登录 | 注册

OpenGL根据当前窗口句柄、DC创建OpenGL的HGLDC

在创建一个图形操作表(HGLDC)之前,首先必须设置像素格式(PIXELFORMATDESCRIPTOR)。像素格式含有设备绘图界面的属性,这些属性包括绘图界面是用RGBA模式还是颜色表模式,像素缓存是用单缓存还是双缓存,以及颜色位数、深度缓存和模板缓存所用的位数,还有其它一些属性信息。

首先创建像素格式描述表(PIXELFORMATDESCRIPTOR)对象,该对象决定了窗口的配置参数。

例如:在OpenGL对窗口渲染之前,必须根据渲染需要对窗口进行配置,
需要硬件渲染还是软件渲染?
渲染使用单缓冲还是双缓冲?
是否需要深度缓冲区?
是否需要模板、目标Alpha或积累缓冲区?
.......
当为窗口设置这些参数之后,就无法对它们进行修改。为了从一个只有深度缓冲和颜色缓冲区的窗口切换到一个带有模板缓冲区的窗口,必须首先销毁第一个窗口,然后根据需要重新创建一个窗口。

PIXELFORMATDESCRIPTOR像素格式描述表参数说明:https://blog.csdn.net/vanlin5566/article/details/21407259

实现代码(节选自张立铜代码):

class   GLContext
{
protected:
    int         _format;
    //! 窗口句柄
    HWND        _hWnd;
    //! 绘制设备上下文
    HDC         _hDC;
    //! OpenGL上下文
    HGLRC       _hRC;
public:
    GLContext()
    {
        _format     =   0;
        _hWnd       =   0;
        _hDC        =   0;
        _hRC        =   0;
    }

    ~GLContext()
    {
        shutdown();
    }
    /**
    *   初始化GL
    */
    bool    setup( HWND hWnd,HDC hDC )
    {
        _hWnd   =   hWnd;
        _hDC    =   hDC;
        unsigned PixelFormat;
        PIXELFORMATDESCRIPTOR pfd = 
        {
            sizeof(PIXELFORMATDESCRIPTOR),
            1, 
            PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
            PFD_TYPE_RGBA,
            32, 
            0,
            0,
            0, 
            0,
            0,
            0, 
            0,
            0,
            0, 
            0, 
            0, 
            0, 
            0, 
            24,
            8, 
            0,
            PFD_MAIN_PLANE, 
            0,
            0, 
            0, 
            0
        };
        if(_format == 0)
        {
            PixelFormat =   ChoosePixelFormat( _hDC, &pfd );
        }
        else
        {
            PixelFormat	=	_format;
        }
        if(!SetPixelFormat( _hDC, PixelFormat, &pfd ))
        {
            return  false;
        }
        _hRC        =   wglCreateContext( _hDC );
        if(!wglMakeCurrent( _hDC, _hRC ))
        {
            return  false;
        }
        return  true;
    }

    /**
    *   销毁EGL
    */
    void    shutdown()
    {
        if( _hRC != NULL )
        {
            wglMakeCurrent( NULL, NULL );
            wglDeleteContext( _hRC );
            _hRC = NULL;							
        }
        if( _hDC != NULL )
        {
            ReleaseDC( _hWnd, _hDC );
            _hDC = NULL;
        }
    }

    /**
    *   交换缓冲区
    */
    void    swapBuffer()
    {
        SwapBuffers(_hDC);
    }

};

wglCreateContext函数创建一个新的OpenGL渲染描述表,此描述表必须适用于绘制到由hdc返回的设备.这个渲染描述表将有和设备上下文(dc)一样的像素格式.

wglCreateContext可见:https://blog.csdn.net/xuqiang918/article/details/8916293

wglMakeCurrent 函数设定OpenGL当前线程的渲染环境。以后这个线程所有的OpenGL调用都是在这个hdc标识的设备上绘制。你也可以使用wglMakeCurrent 函数来改变调用线程的当前渲染环境,使之不再是当前的渲染环境。

wglMakeCurrent 可见https://blog.csdn.net/shenshen211/article/details/52494454



2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.008 s.
京ICP备10005923号