glBindFramebuffer 上的标志

Posted

技术标签:

【中文标题】glBindFramebuffer 上的标志【英文标题】:sigill on glBindFramebuffer 【发布时间】:2013-10-27 16:21:09 【问题描述】:

程序在 glBindFramebuffer(GL_FRAMEBUFFER, fb); 处崩溃;在函数 gen_texture

gdb 告诉我“程序收到信号 SIGILL,非法指令。”

void gen_texture(GLuint &color, int width, int height)

   GLuint fb;

   glGenFramebuffers(1, &fb);
   glGenTextures(1, &color);

   glBindFramebuffer(GL_FRAMEBUFFER, fb);
...



int main(int argc, char **argv)

   glutInit (&argc, argv);
   glutInitContextVersion(4, 3);
   glutInitContextProfile(GLUT_CORE_PROFILE);

   std::cout << std::hex << glGetError() << "\n" << std::flush;

   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);
   glutInitWindowSize (500, 500);
   glutCreateWindow ("");
   glutDisplayFunc (display);
   glutIdleFunc (display);

   std::cout << std::hex << glGetError() << "\n" << std::flush;


   glewExperimental=GL_TRUE;
   GLenum err=glewInit();
   if(err!=GLEW_OK)
   
      std::cerr << "glewInit fehlgeschlagen, aborting." << std::endl;
   

   gen_texture(texture, 100, 60);
...

【问题讨论】:

我在这里没有看到问题,只有几个陈述。你在问为什么你的程序崩溃了?如果是这样,glGenFramebuffers() 是否返回有效值? glGetError() 是否在致电 glBindFramebuffer() 之前报告任何问题? 【参考方案1】:

在这段代码中

GLenum err=glewInit();
if(err!=GLEW_OK)

      std::cerr << "glewInit fehlgeschlagen, aborting." << std::endl;

仅仅因为 GLEW 为初始化返回 OK 并不意味着所有扩展都已加载。同时检查glGetError 不会向您报告 GLUT 错误(例如不支持您请求的上下文。在glGetError 中仅报告 OpenGL 错误(GLUT 不是 OpenGL 的一部分),此外必须在循环中调用,直到它返回GL_NO_ERROR

我建议您添加更详细的错误诊断并报告。

【讨论】:

@user2798943:您是否对错误报告进行了任何更改?您还添加了 glGetError 获取循环吗?无论如何,你得到一个错误可能表明你没有得到你所要求的那种上下文。确保您有支持您要求的 OpenGL 实现(即 GPU + 匹配驱动程序);您要求提供 OpenGL-4.3 核心配置文件,该 ATM 仅受不超过 2 年且具有最新驱动程序的 NVidia 硬件支持,直接从 NVidia 网站下载。 我已经添加了 glGetError 获取循环,并且我正在使用带有最新 nvidia 驱动程序的 gtx 660m。 我已将代码更改为 OpenGL-3.1 核心配置文件,GL_INVALID_ENUM​消失了,但它仍然在 glBindFramebuffer 函数处崩溃。 @user2798943: 没有 3.1 核心配置文件之类的东西 :) 这个问题是由 GL_EXTENSIONS 是 OpenGL 3.2 核心中 glGetString (...) 的无效枚举数造成的。有一个新函数可以查询单个扩展而不是大量字符串列表,但 GLEW 不会使用此行为,除非您在调用 glewInit (...) 之前设置了 glewExperimental = true;。它必须这样做,因为 OpenGL 3.2 核心中所需的功能本身是使用扩展机制加载的……鸡和蛋的情况只能通过手动告诉 GLEW 你有 3.2 核心来解决。 @user2798943:核心配置文件的概念是在 3.2 版本中引入的,以供将来参考。

以上是关于glBindFramebuffer 上的标志的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 不会通过调用 glBindFramebuffer(GL_FRAMEBUFFER,0) 渲染到屏幕

使用 GL_DRAW_FRAMEBUFFER 目标时,glBindFramebuffer 会导致“无效操作”GL 错误

为啥 glBindFramebuffer(GL_FRAMEBUFFER, 0) 会导致 cocos2D-iphone 出现黑屏?

ios上的帧缓冲区对象渲染

电路板上各种标志的含义

无法点击地图上的标志