OpenGL:wglGetProcAddress始终返回NULL
OpenGL: wglGetProcAddress always returns NULL
我正在尝试创建一个使用着色器的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");
}
}
}
我知道这可能是重复的,但在大多数其他帖子中,错误是因为简单的错误(比如在wglMakeCurrent
之前调用wglGetProcAddress
)。我的处境有点特殊,如果有任何帮助,我将不胜感激。
您在这段代码中请求一个32位的Z-Buffer。这可能会让你陷入GDI软件光栅化器(它恰好实现0扩展)。您可以在现代硬件上使用32位深度缓冲区,但大多数时候无法使用默认帧缓冲区,您必须使用FBO。
我看到一些驱动程序接受32位深度,只是为了回退到最匹配的24位像素格式,而其他驱动程序则根本拒绝提供硬件像素格式(可能就是这种情况)。如果这实际上是您的问题,那么快速调查GL字符串(GL_RENDERER
、GL_VERSION
、GL_VENDOR
)应该会发现这一点。
24位深度+8位模版几乎得到了普遍支持,这是你应该尝试的第一个深度/模版大小。
您可以使用glew为您做这类工作。或者你可能不想要?
编辑:那你也许可以用glext.h。或者至少看一下,复制粘贴你感兴趣的东西。
我不是专家,我只记得有过这样的问题,并试图提醒与之相关的原因。
相关文章:
- 如何在映射中返回null
- 为什么返回 NULL 不会破坏函数?
- fopen 在 gdb 中返回 NULL
- 为什么要从main()返回NULL?
- 为什么TinyXML2的XMLDocument::FirstChild()函数在尝试解析这个有效的XML文件时返回NULL?
- Box2D World.GetBodyList() 返回 NULL,但 World 显然正在更新对象
- boost::p ython:PyErr_Fetch始终返回 NULL 回溯
- 如何在 Visual C++ 中从返回类型为 map 的函数返回 null?
- 如何在C++中返回Null作为引用
- 从模板化函数返回Null对象
- GDALOpen 在 GEOTiff 文件上返回 null
- PyThreadState_GET() 从 PyImport_GetModuleDict() 中返回 NULL
- (位图)LoadImage() 返回 NULL,GetLastError() 返回 0
- 在构造函数处将类对象强制转换为接口始终返回 NULL
- 如何为迭代器返回"null"值?
- 具有 4 个指针的节点的递归插入函数返回 null
- winAPI FindResource 仅在 DLL 中返回 NULL
- 使用 dlopen/dlsym 打开C++共享库 - dlsym 返回 NULL
- SetWindowsHookEx 在挂接到其他线程时返回 NULL
- 尚未归shared_ptr所有的实例的 shared_from_this() 总是返回 null?