尝试使用 glShaderSource() 时出现“‘int’对象不可迭代”?

问题描述 投票:0回答:2

我正在尝试 OpenGL(PyOpenGL) 3.3 和 Python 3.9:

vertexShader = glCreateShader(GL_VERTEX_SHADER)
glShaderSource(vertexShader, 1, open("assets\\vertexSrc.glsl", "r").read(), None)   << ERROR HERE
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

我试图定义着色器源,但后来得到了这个错误。

python opengl pyopengl
2个回答
1
投票

open("assets\\vertexSrc.glsl", "r").read()
返回一个Python字符串。要从 python 字符串创建着色器,您必须对 python 对象使用重载。查看
glShaderSource
的 PyOpenGL 签名:

glShaderSource( GLuint ( shader ) , GLsizei ( count ) , const GLchar **( string ) , const GLint *( length ) )-> void
glShaderSource( shaderObj , string )

改变:

glShaderSource(vertexShader, 1, open("assets\\vertexSrc.glsl", "r").read(), None)

glShaderSource(vertexShader, open("assets\\vertexSrc.glsl", "r").read()) 

-2
投票

您需要将着色器源代码作为字符串列表传递。

vertexShader = glCreateShader(GL_VERTEX_SHADER)

# Read the shader source code from the file
with open("assets\\vertexSrc.glsl", "r") as shader_file:
    vertex_src = shader_file.read()

# Convert the source code into a list of strings (lines)
vertex_src_lines = vertex_src.split('\n')

# Pass the list of strings to glShaderSource
glShaderSource(vertexShader, len(vertex_src_lines), vertex_src_lines, None)

glCompileShader(vertexShader)
© www.soinside.com 2019 - 2024. All rights reserved.