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 出现黑屏?