在我当前基于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
有时它工作,有时不工作导致“总线错误:10”。以下是调试的一些详细信息:
^{pr2}$硬件:mac book pro retina(2013):
Date/Time: 2015-06-22 21:30:53.795 +0200
OS Version: Mac OS X 10.10.2 (14C109)
Report Version: 11
运行OpenGL core profile 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
在我研究这个问题的过程中,我发现了一个非常类似的堆栈溢出问题 EXC_BAD_ACCESS with glTexImage2D in GLKViewController。解决方案是在调用glTexImage2d时设置一个“锁”,这个问题之所以适合我的问题,是因为调用似乎随机崩溃了大约50%的时间,这可能表示某种竞争条件问题。在
有没有办法在python脚本中实现类似的锁呢,还是应该用另一种方式初始化纹理?请注意,纹理在初始化时为空,因为纹理将由帧缓冲区写入。在
更新已解决 因为我认为在glTexImage2d中,我尝试使用None而不是空字符串作为init值,所以我传递了这个空字符串。这个代码解决了这个问题
# 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的帮助!在
目前没有回答
相关问题 更多 >
编程相关推荐