我发现某些OpenGL对象(如着色器)不会在渲染上下文之间共享,如果在错误的上下文中使用,则会引发GL_INVALID_VALUE
错误。
所以我的库有这样的东西(假设围绕OpenGL ID的C ++包装器):
const char * const VERTEX_SHADER_LIB = "...";
const char * const FRAGMENT_SHADER_LIB = "...";
ShaderProgram shader (FragmentShader plugin)
{
ShaderProgram p;
p .attach (VerexShader (VERTEX_SHADER_LIB));
p .attach (FragmentShader (FRAGMENT_SHADER_LIB));
p .attach (plugin);
p .link ();
return p;
}
为了提高效率,我按照以下几点重写:
VertexShader vertex_shader_lib ()
{
static VertexShader SHADER (VERTEX_SHADER_LIB);
return SHADER;
}
FragmentShader fragment_shader_lib ()
{
static FragmentShader SHADER (FRAGMENT_SHADER_LIB);
return SHADER;
}
ShaderProgram shader (FragmentShader plugin)
{
ShaderProgram p;
p .attach (vertex_shader_lib ());
p .attach (fragment_shader_lib ());
p .attach (plugin);
p .link ();
return p;
}
但是这个更有效的版本仅在用于单个渲染上下文时才有效。
因此我需要像这样重写它:
VertexShader vertex_shader_lib ()
{
static Map <RenderContextID, VertexShader> SHADERS;
SHADERS .insert_if_key_does_not_exist (
current_render_context (),
VertexShader (VERTEX_SHADER_LIB));
return SHADERS [current_render_context ()];
}
但是,我无法找到一种跨平台的方式来描述current_render_context()
。有吗?我不一定需要渲染上下文 object 本身的跨平台句柄,但任何对每个上下文不变且唯一的识别数据都可以。
我可以使用什么?
答案 0 :(得分:0)
使用适合平台的*GetCurrentContext()
函数:
// Windows
HGLRC wglGetCurrentContext(void)
// X11
GLXContext glXGetCurrentContext(void)
// OSX
CGLContextObj CGLGetCurrentContext(void)
// EGL
EGLContext eglGetCurrentContext(void)
它会稍微考虑#ifdef
但不会太繁重。
如果您使用SDL2 you can avoid even that等框架。