【发布时间】:2018-02-28 09:55:15
【问题描述】:
我发现某些 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 本身的跨平台句柄,但是对于每个上下文而言不变且唯一的任何标识数据都可以。
我可以使用什么?
【问题讨论】:
标签: opengl