我正在使用nvidia 1060 gtx
板卡linux
與最新的驅動程序。但是ELG
完全不起作用,實際上它在第一次調用opengl
函數時崩潰,例如glGenBuffers()
。使用GLFW
創建上下文時,一切正常。但是這裏需要不依賴於x-server
的存在。 gcc testegl.cpp -lGLEW -lGL -lEGL_nvidia -lEGL -lstdc++ -o testegl
EGL在第一個opengl函數崩潰時崩潰
輸出是:
下面的代碼使用編譯
- 開始...
- 分割故障(核心轉儲)
testegl.cpp:
#include <EGL/egl.h>
#include <GL/glew.h>
#include <exception>
#include <string>
#include <iostream>
class GLEGLContext {
private:
EGLDisplay mDisplay;
EGLSurface mSurface;
EGLContext mContext;
public:
GLEGLContext();
~GLEGLContext();
GLEGLContext (const GLEGLContext&) = delete;
GLEGLContext& operator = (const GLEGLContext&) = delete;
public:
virtual void makeCurrent();
virtual void releaseCurrent();
};
GLEGLContext::GLEGLContext() {
const EGLint configAttribs[] = {
EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_DEPTH_SIZE, 0,
EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
EGL_NONE
};
const EGLint pbufferAttribs[] = {
EGL_WIDTH, 1920,
EGL_HEIGHT, 1080,
EGL_NONE,
};
mDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (mDisplay == EGL_NO_DISPLAY)
throw StdException(__PRETTY_FUNCTION__, "eglGetDisplay() failed");
EGLint major, minor;
if (!eglInitialize(mDisplay, &major, &minor))
throw StdException(__PRETTY_FUNCTION__, "eglInitialize() failed");
EGLint numConfigs;
EGLConfig eglCfg;
if (!eglChooseConfig(mDisplay, configAttribs, &eglCfg, 1, &numConfigs))
throw StdException(__PRETTY_FUNCTION__, "eglChooseConfig() failed");
mSurface = eglCreatePbufferSurface(mDisplay, eglCfg, pbufferAttribs);
if (mSurface == EGL_NO_SURFACE)
throw StdException(__PRETTY_FUNCTION__, "eglCreatePbufferSurface() failed");
if (!eglBindAPI(EGL_OPENGL_API))
throw StdException(__PRETTY_FUNCTION__, "eglBindAPI() failed");
mContext = eglCreateContext(mDisplay, eglCfg, EGL_NO_CONTEXT, NULL);
if (mContext == EGL_NO_CONTEXT)
throw StdException(__PRETTY_FUNCTION__, "eglCreateContext() failed");
makeCurrent();
}
GLEGLContext::~GLEGLContext() {
eglTerminate(mDisplay);
}
void GLEGLContext::makeCurrent() {
if (!eglMakeCurrent(mDisplay, mSurface, mSurface, mContext))
throw StdException(__PRETTY_FUNCTION__, "eglMakeCurrent() create failed");
}
void GLEGLContext::releaseCurrent() {
if (!eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT))
throw StdException(__PRETTY_FUNCTION__, "eglMakeCurrent() release failed");
}
int main(int argc, char** argv) {
GLEGLContext ctx;
ctx.makeCurrent();
std::cout << "Starting..." << std::endl;
GLuint vertexBuffer = 0;
glGenBuffers(1, &vertexBuffer);
std::cout << "done" << std::endl;
ctx.releaseCurrent();
return 0;
}
你必須'glewInit'見[未定義參考使用GLEW和MinGW什麼時候?](https://stackoverflow.com/questions/45473091/undefined-reference-when-using -glew-and-mingw/45476269#45476269) – Rabbid76
請編輯您的問題並顯示錯誤消息。 – Ripi2