【问题标题】:Cross platrform way to identify current opengl rendering context?跨平台识别当前opengl渲染上下文的方法?
【发布时间】: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


    【解决方案1】:

    使用适合平台的*GetCurrentContext()函数:

    // Windows
    HGLRC wglGetCurrentContext(void)
    
    // X11
    GLXContext glXGetCurrentContext(void)
    
    // OSX
    CGLContextObj CGLGetCurrentContext(void)
    
    // EGL
    EGLContext eglGetCurrentContext(void)
    

    这需要一点#ifdefing,但不会太繁重。

    如果你使用像 SDL2 you can avoid even that 这样的框架。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多