【问题标题】:Segfault on glBlendFuncglBlendFunc 上的段错误
【发布时间】:2016-08-16 14:03:50
【问题描述】:

我有以下代码来开始一个框架:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

如果没有最后一行,程序会运行(但显然不会混合),但会出现段错误。 GDB 帮助不大,因为看起来堆栈已损坏,并且在段错误之后,正在运行:

set $pc = *(void**)$rsp
set $rsp = $rsp+8

指向函数的结束大括号作为最后一帧。

我有点怀疑这是驱动程序中的错误,但在他们的跟踪器上找不到错误报告。驱动程序是在 Ubuntu 上运行的 flgrx-updates。 GLXInfo 给出:

OpenGL vendor string: Advanced Micro Devices, Inc.
OpenGL renderer string: AMD Radeon R9 200 Series
OpenGL core profile version string: 4.3.13399 Core Profile Context 15.201.1151
OpenGL core profile shading language version string: 4.40
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile

【问题讨论】:

  • 你看到glGetError() 在调用glEnable(GL_BLEND) 后返回什么了吗?您是否尝试过其他混合模式,例如glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA)?
  • 你有最新版本的视频驱动吗?
  • @AntonMalyshev glGetError() 在启用后返回0。更改混合模式仍会导致崩溃
  • @Unick 存储库中的最新版本 - 我不愿意手动更新它们。以前使用混合对我有用,所以肯定是我的代码或驱动程序对我所做的事情反应不佳这次
  • 尝试重启机器:)

标签: c++ opengl segmentation-fault


【解决方案1】:

好的,我仍然不知道为什么会修复它 - 但 seg 错误是由于我更改了链接命令中指定的目标文件的顺序造成的。但是在使用这些函数的文件之前指定将函数指针加载到 OpenGL 的目标文件会使一切正常运行。

【讨论】:

  • 这实际上听起来像是您在使用 GL 加载程序时犯了一些错误。如果之前放了文件,解析后面的obj文件的符号时就不用了。如果你在那之后加上 -lGL,你将直接链接到 GL 符号,而不是加载器。所以这听起来是在加载器初始化之前调用了这段代码,或者加载器在加载指针时遇到了一些问题。
  • @derhass 加载器肯定在初始化函数指针(从表面上看,它们都是有效的),智能链接是否有可能把符号搞砸了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 2012-09-07
  • 2014-06-16
相关资源
最近更新 更多