OpenGL:wglGetProcAddress始终返回NULL

时间:2014-04-17 11:13:34

标签: c++ opengl

我正在尝试创建一个使用着色器的OpenGL程序。我尝试使用以下代码加载着色器函数,但无论我做什么,wglGetProcAddress 始终都会返回0。 不使用着色器功能时,程序的其余部分正常工作。

HDC g_hdc;
HGLRC g_hrc;

PFNGLATTACHSHADERPROC   glpf_attachshader;
PFNGLCOMPILESHADERPROC  glpf_compileshader;
PFNGLCREATEPROGRAMPROC  glpf_createprogram;
PFNGLCREATESHADERPROC   glpf_createshader;
PFNGLDELETEPROGRAMPROC  glpf_deleteprogram;
PFNGLDELETESHADERPROC   glpf_deleteshader;
PFNGLDETACHSHADERPROC   glpf_detachshader;
PFNGLLINKPROGRAMPROC    glpf_linkprogram;
PFNGLSHADERSOURCEPROC   glpf_shadersource;
PFNGLUSEPROGRAMPROC     glpf_useprogram;

void GL_Init(HDC dc)
{
    //create pixel format
    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,
        32, 0, 0,
        PFD_MAIN_PLANE,
        0, 0, 0, 0
    };

    //choose + set pixel format
    int pixfmt = ChoosePixelFormat(dc, &pfd);
    if (pixfmt && SetPixelFormat(dc, pixfmt, &pfd))
    {
        //create GL render context
        if (g_hrc = wglCreateContext(dc))
        {
            g_hdc = dc;

            //select GL render context
            wglMakeCurrent(dc, g_hrc);

            //get function pointers     
            glpf_attachshader   = (PFNGLATTACHSHADERPROC)   wglGetProcAddress("glAttachShader");
            glpf_compileshader  = (PFNGLCOMPILESHADERPROC)  wglGetProcAddress("glCompileShader");
            glpf_createprogram  = (PFNGLCREATEPROGRAMPROC)  wglGetProcAddress("glCreateProgram");
            glpf_createshader   = (PFNGLCREATESHADERPROC)   wglGetProcAddress("glCreateShader");
            glpf_deleteprogram  = (PFNGLDELETEPROGRAMPROC)  wglGetProcAddress("glDeleteProgram");
            glpf_deleteshader   = (PFNGLDELETESHADERPROC)   wglGetProcAddress("glDeleteShader");
            glpf_detachshader   = (PFNGLDETACHSHADERPROC)   wglGetProcAddress("glDetachShader");
            glpf_linkprogram    = (PFNGLLINKPROGRAMPROC)    wglGetProcAddress("glLinkProgram");
            glpf_shadersource   = (PFNGLSHADERSOURCEPROC)   wglGetProcAddress("glShaderSource");
            glpf_useprogram     = (PFNGLUSEPROGRAMPROC)     wglGetProcAddress("glUseProgram");
        }
    }
}

我知道这可能是重复的,但在大多数其他帖子上,错误是因为简单的错误(比如在wglGetProcAddress之前调用wglMakeCurrent)。我有点独特的情况 - 任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

您在此代码中请求32位Z缓冲区。这可能会让你进入GDI软件光栅化器(它实现了 0 扩展)。您可以在现代硬件上使用32位深度缓冲区,但大多数时候您无法使用 默认 帧缓冲区,您必须使用FBO。

我看到一些驱动程序接受32位深度只是为了回退到最接近的匹配24位像素格式,而其他驱动程序只是拒绝提供硬件像素格式(这可能是你的情况)。如果这实际上是您的问题,那么快速调查您的GL字符串(GL_RENDERERGL_VERSIONGL_VENDOR)应该会很明显。

24位深度+ 8位模板几乎得到普遍支持,这是您应该尝试的第一个深度/模板尺寸。

答案 1 :(得分:-3)

你可以用glew为你做那种工作。 或许你不想要?

编辑: 你可以使用glext.h然后。或者至少查看它并复制粘贴您感兴趣的内容。

我不是专家我只记得遇到过那种问题,并试着提醒一下这是什么问题。