跨平台方式识别当前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)
它需要一点点#ifdef
ing但没有太繁重。
如果您使用像SDL2 you can avoid even that这样的框架。
以上是关于跨平台方式识别当前opengl渲染上下文?的主要内容,如果未能解决你的问题,请参考以下文章