[英]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");
}
}
}
我知道這可能是重復的,但是在其他大多數帖子中,錯誤是由於簡單的錯誤(例如在wglGetProcAddress
之前調用wglMakeCurrent
)引起的。 我處於一種特殊的情況-任何幫助將不勝感激。
您正在此代碼中請求32位Z緩沖區。 這可能會使您陷入GDI軟件光柵化器(它實現了0個擴展)的問題。 您可以在現代硬件上使用32位深度緩沖區,但是大多數情況下 ,您無法使用默認幀緩沖區來做到這一點,您必須使用FBO。
我已經看到一些驅動程序接受32位深度只是為了回退到最接近的匹配24位像素格式,而其他驅動程序根本拒絕提供硬件像素格式(這可能是您的情況)。 如果這實際上是您的問題,那么對您的GL字符串( GL_RENDERER
, GL_VERSION
, GL_VENDOR
)進行快速調查應該很明顯。
普遍支持24位深度+ 8位模板,這是您應該嘗試的第一個深度/模板大小。
您可以使用glew為您完成這類工作。 還是您不想要?
編輯:您也許可以使用glext.h。 或者至少查看一下並復制粘貼您感興趣的內容。
我不是專家,我只是記得曾經遇到過此類問題,並試圖提醒您要解決的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.