1

在我当前基于 python 的 OpenGL 项目中,我需要使用glTexImage2d创建一个 2d 纹理。当纹理宽度/高度大于 888x888 时,这样做我会遇到麻烦。

# crashes _sometimes_ when self._w * self._h > 888*888
glBindTexture(GL_TEXTURE_2D, self._id);
glTexImage2D(
    GL_TEXTURE_2D, 
    0, GL_RGB, 
    self._w, 
    self._h, 
    0, 
    GL_RGB, 
    GL_UNSIGNED_BYTE, 
    ''); # init an empty texture 

有时它工作,有时它不工作导致"Bus error: 10"。以下是调试中的一些细节:

Crashed Thread:        0  Dispatch queue: com.apple.main-thread
Exception Type:        EXC_BAD_ACCESS (SIGBUS)
Exception Codes:       KERN_PROTECTION_FAILURE at 0x0000000103694000

硬件:mac book pro 视网膜(2013):

Date/Time:             2015-06-22 21:30:53.795 +0200
OS Version:            Mac OS X 10.10.2 (14C109)
Report Version:        11

运行 OpenGL 核心配置文件 4.1:

localhost:py keksnicoh$ python -m demos.plotter
[...] init GLFW
[...] load OPENGL_CORE_PROFILE 4.10
  + Vendor             Intel Inc.
  + Opengl version     4.1 INTEL-10.2.46
  + GLSL Version       4.10
  + Renderer           Intel Iris OpenGL Engine
  + GLFW3              3.0.4 Cocoa NSGL chdir menubar dynamic
GL_MAX_TEXTURE_SIZE 16384

在我研究这个问题的过程中,我 在 GLKViewController 中使用 glTexImage2D 的堆栈溢出 EXC_BAD_ACCESS发现了一个非常相似的问题。解决方案是在调用 glTexImage2d 期间设置“锁”。这个问题似乎适合我的问题的原因是调用似乎随机崩溃了大约 50% 的时间,这可能表明某种竞争条件问题。

有没有办法在我的 python 脚本中实现类似的锁,或者我应该以另一种方式初始化纹理?请注意,纹理在初始化时为空,因为纹理将由帧缓冲区写入。

更新已解决 因为我认为我尝试使用 None 而不是空字符串作为 glTexImage2d 中的初始值,所以我传递了这个空字符串。这段代码解决了这个问题

# crashes _sometimes_ when self._w * self._h > 888*888
glBindTexture(GL_TEXTURE_2D, self._id);
glTexImage2D(
    GL_TEXTURE_2D, 
    0, GL_RGB, 
    self._w, 
    self._h, 
    0, 
    GL_RGB, 
    GL_UNSIGNED_BYTE, 
    None); # <<<<---------------------- 

感谢 derhass 和 datenwolf 的帮助!

4

0 回答 0