gpt4 book ai didi

c++ - OpenGL glCreateProgram() 总是返回 1 并删除之前的程序

转载 作者:行者123 更新时间:2023-11-27 23:53:09 24 4
gpt4 key购买 nike

我正在使用 RAD Studio C++ Builder XE7 和 OpenGL 创建一个应用程序,在该应用程序上使用多个 TPanel 对象作为渲染目标。这些面板中的每一个都使用自己的渲染上下文。使用 OpenGL 直接模式,我可以毫无问题地在它们中的每一个上绘制场景。

现在我希望每个场景都有自己的着色器程序。如果我的应用程序中只有一个面板利用着色器,则一切都运行良好。但是,一旦我选择一个新的渲染上下文来生成和链接一个新程序,用以前的上下文生成的程序似乎被删除,并且 glCreateProgram() 函数返回与以前的上下文中生成的标识符相同的标识符,如如果新程序取代现有程序。

我不明白为什么 OpenGL 会这样,但这个问题在我的渲染中产生了严重的困惑。似乎只涉及着色器程序,当我选择另一个上下文时,属于一个上下文的所有其他值似乎都是保守的。我是否应该在每次选择另一个上下文时保存和恢复我的上下文?有人可以解释我做错了什么吗?

这是一个简化的代码示例,说明了我面临的问题。 (我为我的每个目标面板调用了一个这样的函数)

bool TMainForm::InitGL(HWND hWnd, HDC& hDC, HGLRC& hRC)
{
// get the device context (DC)
hDC = ::GetDC(hWnd);

// failed to get device context?
if (!hDC)
return false;

::PIXELFORMATDESCRIPTOR pfd =
{
sizeof(::PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
24,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0,
0,
};

// get best available pixel format
const int pixelFormat = ::ChoosePixelFormat(hDC, &pfd);

// set pixel format to use
if (!::SetPixelFormat(hDC, pixelFormat, &pfd))
return false;

// create OpenGL render context
hRC = wglCreateContext(hDC);

// succeeded?
if (!hRC)
return false;

// enable OpenGL render context
if (!wglMakeCurrent(hDC, hRC))
return false;

glewExperimental = GL_TRUE;

// (re)initialize GLEW, as described here:
// https://stackoverflow.com/questions/35683334/call-glewinit-once-for-each-rendering-context-or-exactly-once-for-the-whole-app
if (glewInit() != GLEW_OK)
return false;

GLuint programID = glCreateProgram();

// here the returned programID is always equal to 1!!!
::OutputDebugString((L"==> Newly generated shader ID - " + ::IntToStr((int)programID)).c_str());
}

问候

最佳答案

每个 gl-context 都拥有它的对象,包括 gl-programs。参见 https://www.khronos.org/opengl/wiki/OpenGL_Context

如果你想在多个context之间共享,你可以在创建gl-context时设置。

关于c++ - OpenGL glCreateProgram() 总是返回 1 并删除之前的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44767025/

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