跨平台识别当前opengl渲染上下文的方式?

时间:2018-02-28 09:55:15

标签: opengl

我发现某些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 本身的跨平台句柄,但任何对每个上下文不变且唯一的识别数据都可以。

我可以使用什么?

1 个答案:

答案 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等框架。