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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跨平台方式识别当前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()。有吗?我不一定需要渲染上下文对象本身的跨平台句柄,但任何一个对每个上下文不变且唯一的标识数据都可以。

我可以用什么?

答案

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

// Windows
HGLRC wglGetCurrentContext(void)

// X11
GLXContext glXGetCurrentContext(void)

// OSX
CGLContextObj CGLGetCurrentContext(void)

// EGL
EGLContext eglGetCurrentContext(void)

它需要一点点#ifdefing但没有太繁重。

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

以上是关于跨平台方式识别当前opengl渲染上下文?的主要内容,如果未能解决你的问题,请参考以下文章

视频渲染

OpenGL 渲染上下文-context

创建跨平台 OpenGL 离屏上下文

ios的opengl究竟能不能在非主线程渲染

opengl 渲染方式在屏 离屏 CPU

正在渲染opengl的随机屏幕片段-这表明啥错误?