Поддержка OpenGL вперед-совместимый контекст создания на Windows


Это правильный метод для создания на OpenGL 3.3+ вперед-совместимый контекст?

// Create window
WNDCLASSEX wc;
ZeroMemory( &wc, sizeof( wc ) );
wc.cbSize = sizeof( wc );
wc.lpfnWndProc = _eventHandler;
wc.hInstance = GetModuleHandle( NULL );
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor  = LoadCursor( NULL, IDC_ARROW );
wc.lpszClassName = "OpenGL 3.3";
if ( !RegisterClassEx( &wc ) ) Error( "Failed to register window class!" );
if ( !( _window = CreateWindowEx( WS_EX_CLIENTEDGE, "OpenGL 3.3", "OpenGL 3.3", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, GetModuleHandle( NULL ), NULL ) ) )
    Error( "Failed to create the window!" );
if ( !( _hdc = GetDC( _window ) ) ) Error( "Failed to retrieve device context!" );

// Choose pixel format
int pixelFormat;
PIXELFORMATDESCRIPTOR pfd;
ZeroMemory( &pfd, sizeof( pfd ) );
pfd.nSize = sizeof( pfd );
pfd.nVersion = 1; 
pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;  
pfd.iPixelType = PFD_TYPE_RGBA; 
pfd.cColorBits = 32;
pfd.cDepthBits = 32; 
pfd.iLayerType = PFD_MAIN_PLANE;
if ( !( pixelFormat = ChoosePixelFormat( _hdc, &pfd ) ) ) Error( "Failed to find suitable pixel format!" );
if ( !SetPixelFormat( _hdc, pixelFormat, &pfd ) ) Error( "Failed to set pixel format!" );

// Create temporary context and make sure we have support
HGLRC tempContext = wglCreateContext( _hdc );
if ( !tempContext ) Error( "Failed to create temporary context!" );
if ( !wglMakeCurrent( _hdc, tempContext ) ) Error( "Failed to activate temporary context!" );

int major, minor; glGetIntegerv( GL_MAJOR_VERSION, &major ); glGetIntegerv( GL_MINOR_VERSION, &minor );
if ( major < 3 || minor < 2 ) Error( "OpenGL 3.2 is not supported!" );

// Create forward compatible context
int attribs[] =
{
    WGL_CONTEXT_MAJOR_VERSION_ARB, major,
    WGL_CONTEXT_MINOR_VERSION_ARB, minor, 
    WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
    WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB,
    0
};
PFNWGLCREATEBUFFERREGIONARBPROC wglCreateContextAttribsARB = (PFNWGLCREATEBUFFERREGIONARBPROC)wglGetProcAddress( "wglCreateContextAttribsARB" );
if ( !wglCreateContextAttribsARB ) Error( "Failed to find pointer to wglCreateContextAttribsARB function!" );
if ( !( _context = wglCreateContextAttribsARB( _hdc, 0, (UINT)attribs ) ) ) Error( "Failed to create forward compatible context!" );

// Remove temporary context and activate forward compatible context
wglMakeCurrent( NULL, NULL );
wglDeleteContext( tempContext );
if ( !wglMakeCurrent( _hdc, (HGLRC)_context ) ) Error( "Failed to activate forward compatible context!" );

// Show window
ShowWindow( _window, SW_SHOW );
UpdateWindow( _window );

Это, кажется, работает (выдает GL_INVALID_OPERATION при использовании блоки glbegin), но я просто хочу убедиться, что это правильный способ пойти об этом.



5133
9
c++
задан 12 марта 2011 в 02:03 Источник Поделиться
Комментарии
2 ответа

Это выглядит правильным для меня. Я немного устал и, как правило, использовать GLFW.

Вы могли бы быть заинтересованы в этой странице на OpenGL Вики с описанием установка контекста после 3.1, который по существу ту же работу.

4
ответ дан 22 марта 2011 в 08:03 Источник Поделиться

Вы создаете профиль (WGL_CONTEXT_CORE_PROFILE_BIT_ARB), который означает, что все устаревшие функции будут недоступны. блоки glbegin/glEnd был устаревшим в OpenGL 3. Современный путь состоит в использовании вместо буферные объекты вершины (РВО).

Вы можете создать совместимость контексте, чтобы получить доступ к старому фиксированный API функции (включая блоки glbegin/glEnd).

Для получения дополнительной информации см. http://www.opengl.org/wiki/Core_And_Compatibility_in_Contexts

2
ответ дан 22 марта 2011 в 03:03 Источник Поделиться