调用glShaderSource()时出现'int' object is not iterable错误
PyOpenGL中glShaderSource触发TypeError的解决方法
问题场景
在Python 3.9环境下使用PyOpenGL 3.3编写着色器代码时,调用glShaderSource时触发TypeError: 'int' object is not iterable错误。
出错代码
vertexShader = glCreateShader(GL_VERTEX_SHADER) glShaderSource(vertexShader, 1, open("assets\\vertexSrc.glsl", "r").read(), None) # 错误发生处 glCompileShader(vertexShader)
错误回溯信息
Traceback (most recent call last): File "C:\Users\admin\Desktop\OpenGL\Python\Exploring\main.py", line 44, in <module> glShaderSource(vertexShader, 1, vertex_src, None) # Defining the vertex shader source File "src/latebind.pyx", line 39, in OpenGL_accelerate.latebind.LateBind.__call__ File "src/wrapper.pyx", line 299, in OpenGL_accelerate.wrapper.Wrapper.__call__ File "src/wrapper.pyx", line 161, in OpenGL_accelerate.wrapper.PyArgCalculator.c_call File "src/wrapper.pyx", line 128, in OpenGL_accelerate.wrapper.PyArgCalculatorElement.c_call File "src/wrapper.pyx", line 122, in OpenGL_accelerate.wrapper.PyArgCalculatorElement.c_call File "C:\Users\admin\AppData\Local\Programs\Python\Python39\lib\site-packages\OpenGL\converters.py", line 305, in stringArray value = [as_8_bit(x) for x in arg] TypeError: ("'int' object is not iterable", <bound method StringLengths.stringArray of <OpenGL.converters.StringLengths object at 0x0000015525B19430>>) Process finished with exit code 1
解决方法
错误根源是glShaderSource的参数不符合PyOpenGL的绑定要求:
- 原生OpenGL的
glShaderSource要求第三个参数是字符串数组,PyOpenGL的Python绑定需要传入可迭代的字符串序列(如列表),而非单个字符串。 - 第四个参数若传
None,PyOpenGL会尝试自动计算字符串长度,但更稳妥的方式是传入对应长度数组,或直接省略让PyOpenGL自动处理。
修正方案1(简化写法)
vertexShader = glCreateShader(GL_VERTEX_SHADER) vertex_src = open("assets\\vertexSrc.glsl", "r").read() # 省略数量和长度参数,PyOpenGL会自动推导 glShaderSource(vertexShader, vertex_src) glCompileShader(vertexShader)
修正方案2(严格匹配参数要求)
vertexShader = glCreateShader(GL_VERTEX_SHADER) vertex_src = open("assets\\vertexSrc.glsl", "r").read() # 第三个参数为包含源码的列表,第四个参数为对应长度的列表 glShaderSource(vertexShader, 1, [vertex_src], [len(vertex_src)]) glCompileShader(vertexShader)
原因说明
当传入单个字符串时,PyOpenGL会将其视为可迭代对象遍历(逐个字符),但第二个参数1表示期望1个完整字符串,两者冲突导致类型错误。将源码放入列表后,PyOpenGL能正确识别这是包含1个元素的字符串数组,匹配参数要求。
内容的提问来源于stack exchange,提问作者user22441564
相关产品推荐
相关产品推荐

