我试图在Linux中设置一个OpenGL 3.2核心configuration文件和GLEW的非常基本的程序。 我试过这篇文章的帮助。
这是我的代码:
#define GLEW_STATIC #include <iostream> #include <cstdio> #include <string> #include <GL/glew.h> #include <X11/Xlib.h> #include <X11/Xutil.h> #include <GL/gl.h> #include <GL/glx.h> //#include <GL/glut.h> #include "stb_image_write.h" #include <cstdlib> #include <GL/glfw.h> static float _viewPortHeight = 30; static float _viewPortWidth = 10; typedef GLXContext (*glXCreateContextAttribsARBProc)(Display*, GLXFBConfig, GLXContext, Bool, const int*); typedef Bool (*glXMakeContextCurrentARBProc)(Display*, GLXDrawable, GLXDrawable, GLXContext); static glXCreateContextAttribsARBProc glXCreateContextAttribsARB = NULL; static glXMakeContextCurrentARBProc glXMakeContextCurrentARB = NULL; int main (int argc, char *argv[]){ glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc) glXGetProcAddressARB( (const GLubyte *) "glXCreateContextAttribsARB" ); glXMakeContextCurrentARB = (glXMakeContextCurrentARBProc) glXGetProcAddressARB( (const GLubyte *) "glXMakeContextCurrent"); Display *display = XOpenDisplay(NULL); if (display == NULL){ std::cout << "error getting the X display"; return -1; } static int visualAttribs[] = {None}; int numberOfFrameBufferConfigurations; GLXFBConfig *fbConfigs = glXChooseFBConfig(display, DefaultScreen(display), visualAttribs, &numberOfFrameBufferConfigurations); int context_attribs[] = { GLX_CONTEXT_MAJOR_VERSION_ARB ,3, GLX_CONTEXT_MINOR_VERSION_ARB, 2, GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_DEBUG_BIT_ARB, GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,None }; std::cout << "initialising context..."; GLXContext openGLContext = glXCreateContextAttribsARB(display, fbConfigs[0], 0, True, context_attribs); int pBufferAttribs[] = { GLX_PBUFFER_WIDTH, 32, GLX_PBUFFER_HEIGHT, 32, None }; GLXPbuffer pbuffer = glXCreatePbuffer(display, fbConfigs[0], pBufferAttribs); XFree(fbConfigs); XSync(display, False); if(!glXMakeContextCurrent(display, pbuffer, pbuffer, openGLContext)){ std::cout << "error with content creation"; return -1; } glXMakeCurrent(display, pbuffer, openGLContext); GLenum error = glewInit(); if (error != GLEW_OK){ std::cout << "error with glew init()\n"; }else{ std::cout << "glew is ok\n\n"; } GLuint test; GLuint framebuffer; glGenFramebuffers(1, &framebuffer); glClearColor(1.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); std::string path("output.png"); exportToPath(path); return 0; }
我得到的输出是这样的:
初始化上下文… glew是好的
- 如何在Linux上自动下载和安装Java JDK?
- 如何调整内核模块以通过`无符号版本的module_layout`?
- linux和linux系统上的用户打开文件的数量是多less?
- Linux 2.6.18上IPC的延迟testing非常有趣
- 使用bfd数据结构的目标文件中的段数
分段错误(核心转储)
导致问题的线路是在glGenFrameBuffers
调用,这也是第一次调用GLEW产生的函数。 这里有什么是非常错误的,但我似乎无法弄清楚什么和为什么。
任何人都可以指向正确的方向吗?
glew.h
已经包含gl.h
和GLX可用的glx.h
…然后使用一些宏魔法来弯曲一些符号。 我建议你删除线条
#include <GL/gl.h> #include <GL/glx.h>
只是使用
#include <GL/glew.h>
在GLEW之后包含原始包含的某些宏魔法可能会丢失,并最终导致错误的相关符号导致崩溃。
在旁注:为什么你包含GLFW和GLUT头文件? 如果你的意图是使用裸GLX,那么你不需要他们,不应该包括他们。
发现问题,其解决方案似乎是在调用glewInit()之前添加“glewExperimental”= GL_TRUE;