为什么我不能使用 EGL 创建无头 OpenGl 上下文?
Why can't I create a headless OpenGl context with EGL?
我目前正在开发一个程序,需要一个无头的opengl上下文。理想情况下,在Linux上可以在没有X服务器的情况下运行。我的研究告诉我EGL是实现这一点的唯一方法(请告诉我是否还有其他方法,因为我强烈地更喜欢C++API而不是像EGL这样的C API(。通过查看本教程和EGL参考资料,我以一个最小且完整的示例的形式提出了以下代码:
#include <EGL/egl.h>
#include <glad/glad.h>
#include <iostream>
#include <exception>
class GlException : public std::exception{
public:
GlException(const std::string &message) : m_message(message) {}
const char *what() const noexcept override { return m_message.c_str(); }
private:
std::string m_message;
};
void createOpenGlContext() {
constexpr EGLint configAttribs[] = {
EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
EGL_NONE
};
constexpr EGLint pbufferAttribs[] = {
EGL_WIDTH, 1600,
EGL_HEIGHT, 900,
EGL_NONE,
};
EGLDisplay m_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
EGLBoolean result = eglInitialize(m_display, nullptr, nullptr);
if(result != EGL_TRUE){
switch(eglGetError()){
case EGL_BAD_DISPLAY:
throw GlException("Failed to initialize EGL Display: EGL_BAD_DISPLAY");
case EGL_NOT_INITIALIZED:
throw GlException("Failed to initialize EGL Display: EGL_NOT_INITIALIZED");
default:
throw GlException("Failed to initialize EGL Display: unknown error");
}
}
EGLint numConfigs;
EGLConfig eglConfig;
result = eglChooseConfig(m_display, configAttribs, &eglConfig, 1, &numConfigs);
if(result != EGL_TRUE){
switch(eglGetError()){
case EGL_BAD_DISPLAY:
throw GlException("Failed to configure EGL Display: EGL_BAD_DISPLAY");
case EGL_BAD_ATTRIBUTE:
throw GlException("Failed to configure EGL Display: EGL_BAD_ATTRIBUTE");
case EGL_NOT_INITIALIZED:
throw GlException("Failed to configure EGL Display: EGL_NOT_INITIALIZED");
case EGL_BAD_PARAMETER:
throw GlException("Failed to configure EGL Display: EGL_BAD_PARAMETER");
default:
throw GlException("Failed to configure EGL Display: unknown error");
}
}
EGLSurface surface = eglCreatePbufferSurface(m_display, eglConfig, pbufferAttribs);
eglBindAPI(EGL_OPENGL_API);
EGLContext context = eglCreateContext(m_display, eglConfig, EGL_NO_CONTEXT, nullptr);
}
int main(){
createOpenGlContext();
if(!gladLoadGL()){
std::cerr << "Failed to load OpenGl function pointers" << std::endl;
return -1;
}
return 0;
}
当我在该代码中调用gladLoadGl
时,它失败了,这可以通过它的返回值来确定,这表明尽管几乎完全使用了英伟达博客中的代码,但上下文还没有创建(据推测,英伟达知道他们在用OpenGl.做什么(。我试图用我喜欢的搜索引擎找到其他有同样错误的人,但没有找到任何有用的结果。我的代码出了什么问题?
我正在使用这种令人愉快的配置。我使用的是完全更新的Arch Linux。我有一台Gtx 1070,里面有来自英伟达的最新驱动程序。上面的代码在使用可用的X服务器运行时失败。我没有在无头环境中测试过它。
@G.M.的建议奏效了,在现有的createOpenGlContext
函数解决问题之前添加了对eglMakeCurrent的调用。
相关文章:
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- 当要求兼容性时,核心OpenGL上下文?
- GTKmm Opengl 上下文未初始化
- Electron中神秘无效的OpenGL上下文
- 是多个线程渲染到单个OpenGL上下文线程安全的线程
- 如何为 QtQuick 应用程序选择 OpenGL 上下文
- SetPixelFormat() 中的第三个参数对于 OpenGL 上下文创建有什么意义?
- 使用WGL创建现代OpenGL上下文
- 如何为第三方渲染提供空的QML项目的OpenGL上下文
- 用于在许多Qopenglwidget中显示的FBO渲染的全局OpenGL上下文
- 在 Mac OS X 10.9 中使用 GLFW 创建 OpenGL 3.3 上下文
- SDL_net没有创建OpenGL上下文
- 在运行时从OpenGL上下文切换到D3D/DX上下文(或其他上下文)
- 如何检查当前的 OpenGL 上下文是否在 Geforce 卡上运行
- GLFW无法在Mavericks上获取OpenGL 4.1上下文
- 如何使用SFML 2.2切换OpenGL上下文的线程
- 创建OpenGL 4.3上下文崩溃GLX
- SDL2要么丢失OpenGL上下文或未定义的函数
- OpenGL 上下文创建期间未记录的错误
- 在渲染以外的另一个线程中初始化 OpenGL 上下文