简体   繁体   English

如何在NVidia Desktop上创建EGL上下文

[英]How to create EGL context on NVidia Desktop

I'm looking for a code snipet to create EGL context on desktop NVidia. 我正在寻找一个代码snipet来在桌面NVidia上创建EGL上下文。

I'm aware that on Windows, NVidia exposes EGL through extensions WGL_EXT_create_context_es_profile and WGL_EXT_create_context_es2_profile . 我知道在Windows上,NVidia通过扩展WGL_EXT_create_context_es_profileWGL_EXT_create_context_es2_profile公开EGL。

And on Linux NVidia allows EGL through GLX_EXT_create_context_es_profile and GLX_EXT_create_context_es2_profile extensions. 在Linux上,NVidia允许EGL通过GLX_EXT_create_context_es_profileGLX_EXT_create_context_es2_profile扩展。

But I was unable to find an example, or sample code, to get it running. 但我无法找到一个示例或示例代码来使其运行。

after some struggle, I've got something like below. 经过一番努力,我得到了类似下面的东西。

The basic thing is to get required extensions, by hand or using GLEW, create dummy context and then create your GL-ES context. 基本的是通过手动或使用GLEW获得所需的扩展,创建虚拟上下文,然后创建GL-ES上下文。 Error handling is omitted for clearance. 清除时忽略错误处理。

/**
 * adapted from
 * from https://www.opengl.org/wiki/Tutorial:_OpenGL_3.1_The_First_Triangle_%28C%2B%2B/Win%29
 */
bool CGLRenderer::CreateGLContext(CDC* pDC){
PIXELFORMATDESCRIPTOR pfd =
{
 sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,    //Flags
PFD_TYPE_RGBA,            //The kind of framebuffer. RGBA or palette.
32,                        //Colordepth of the framebuffer.
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
24,                        //Number of bits for the depthbuffer
8,                        //Number of bits for the stencilbuffer
0,                        //Number of Aux buffers in the framebuffer.
PFD_MAIN_PLANE,
0,
0, 0, 0
};  

int nPixelFormat = ChoosePixelFormat(pDC->m_hDC, &pfd); 
if (nPixelFormat == 0) return false;

BOOL bResult = SetPixelFormat (pDC->m_hDC, nPixelFormat, &pfd); 
if (!bResult) return false; 

HGLRC tempContext = wglCreateContext(pDC->m_hDC);
wglMakeCurrent(pDC->m_hDC, tempContext);

// Using GLEW. Init it after ctx creation
GLenum err = glewInit();
if (GLEW_OK != err){
    AfxMessageBox(_T("GLEW is not initialized!"));
}

// create OPENGL ES 2 profile. It may return a compatible, but higher GL-ES, as 3.0 or 3.1 
int attribList[] = {
            WGL_CONTEXT_MAJOR_VERSION_ARB, 2,
            WGL_CONTEXT_MINOR_VERSION_ARB, 0,
            WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_ES2_PROFILE_BIT_EXT,
            0,
};

if(wglewIsSupported("WGL_ARB_create_context") == 1){
    m_hrc = wglCreateContextAttribsARB(pDC->m_hDC,0, attribs);
    wglMakeCurrent(NULL,NULL);
    wglDeleteContext(tempContext);
    wglMakeCurrent(pDC->m_hDC, m_hrc);
}else{  //Failed to create a GL-ES context. 
    m_hrc = NULL;
}

//Debug info - print out GL version 
const GLubyte *glVersionString = glGetString(GL_VERSION); 
const char *vendorChar = (char*)glGetString(GL_VENDOR);
const char *rendererChar = (char*)glGetString(GL_RENDERER);

int glVersion[2] = {-1,-1};
glGetIntegerv(GL_MAJOR_VERSION,&glVersion[0]);
glGetIntegerv(GL_MINOR_VERSION,&glVersion[1]);

cout<<"GL version string: "<< glVersionString << <<endl;
cout<<"OpenGL version: "<<glVersion[0]<<"."<<glVersion[1]<<endl;
cout<<"GPU: "<<vendorChar<<" - "<<rendererChar<<endl;

if (!m_hrc) return false;

return true;
} // end of CreateGLContext

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM