我正在尝试创建一个使用着色器的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
)。我有点独特的情况 - 任何帮助都会受到赞赏。
答案 0 :(得分:1)
您在此代码中请求32位Z缓冲区。这可能会让你进入GDI软件光栅化器(它实现了 0 扩展)。您可以在现代硬件上使用32位深度缓冲区,但大多数时候您无法使用 默认 帧缓冲区,您必须使用FBO。
我看到一些驱动程序接受32位深度只是为了回退到最接近的匹配24位像素格式,而其他驱动程序只是拒绝提供硬件像素格式(这可能是你的情况)。如果这实际上是您的问题,那么快速调查您的GL字符串(GL_RENDERER
,GL_VERSION
,GL_VENDOR
)应该会很明显。
24位深度+ 8位模板几乎得到普遍支持,这是您应该尝试的第一个深度/模板尺寸。
答案 1 :(得分:-3)
你可以用glew为你做那种工作。 或许你不想要?
编辑: 你可以使用glext.h然后。或者至少查看它并复制粘贴您感兴趣的内容。
我不是专家我只记得遇到过那种问题,并试着提醒一下这是什么问题。