gpt4 book ai didi

c++ - OpenGL:wglGetProcAddress 总是返回 NULL

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:03:51 24 4
gpt4 key购买 nike

我正在尝试创建一个使用着色器的 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 缓冲区。这可能会让您转向 GDI 软件光栅器(它完全实现了 0 扩展)。您可以在现代硬件上使用 32 位深度缓冲区,但大多数时候您不能使用默认 帧缓冲区,您必须使用 FBO。

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

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

关于c++ - OpenGL:wglGetProcAddress 总是返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23131612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com