Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基本OpenGL(python)_Python_Opengl_Pyglet - Fatal编程技术网

基本OpenGL(python)

基本OpenGL(python),python,opengl,pyglet,Python,Opengl,Pyglet,我正在研究opengl和python,并创建了一个使用两个三角形绘制矩形的基本程序 def draw(self, shader): shader.bind() #glDrawArrays(GL_TRIANGLES, 1, 3) glDrawElements(GL_TRIANGLES, len(self.indices), GL_UNSIGNED_INT, 0)

我正在研究opengl和python,并创建了一个使用两个三角形绘制矩形的基本程序

def draw(self, shader):
    shader.bind()
    #glDrawArrays(GL_TRIANGLES, 1, 3)
    glDrawElements(GL_TRIANGLES,
                   len(self.indices),
                   GL_UNSIGNED_INT,
                   0)
    glBindVertexArray(0)
    shader.unbind()

def _setupMesh(self):
    # VAO
    glGenVertexArrays(1, self._VAO)
    glBindVertexArray(self._VAO)

    #VBO
    glGenBuffers(1, self._VBO)
    glBindBuffer(GL_ARRAY_BUFFER, self._VBO)
    self.vertices_size = (GLfloat * len(self.vertices))(*self.vertices)
    glBufferData(GL_ARRAY_BUFFER,
                 len(self.vertices)*sizeof(GLfloat),
                 self.vertices_size,
                 GL_STATIC_DRAW)


    #EBO
    glGenBuffers(1, self._EBO)
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, self._EBO)
    self.indices_size = (GLfloat * len(self.indices))(*self.indices)
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,
                 len(self.indices)*sizeof(GLfloat),
                 self.indices_size,
                 GL_STATIC_DRAW)

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), c_void_p(0))
    glEnableVertexAttribArray(0)
我发送数据如下:

vertices: [  0.5,  0.5,  0.0,
         0.5, -0.5,  0.0,
        -0.5, -0.5,  0.0,
        -0.5,  0.5,  0.0] 
indices: [0,1,3,1,2,3]
glDrawElements
调用什么都不做,
glDrawArrays
在窗口中绘制一个漂亮的三角形


有一点很明显,我怀疑为什么
glpaurements
不起作用?

索引的数据类型必须是
GL\u UNSIGNED\u BYTE
GL\u UNSIGNED\u SHORT
GL\u UNSIGNED\u INT
。(见附件)

要使用数据类型
unsigned int
创建正确的值数组,可以使用:

或者您可以使用:

如果使用顶点数组对象,则的第四个参数必须是
None
,而不是
0

glDrawElements(GL_TRIANGLES, len(self.indices), GL_UNSIGNED_INT, None)

我知道这可能不是您想要的建议,但是如果您正在学习OpenGL,那么python可能不是直接使用OGL的最佳选择。大多数资源和文档都是C/C++的,处理python中的API会因为类型、静默故障以及其他原因而变得笨拙。我认为直接从python中使用OGL是很好的,但是如果你已经有了在C/C++中处理OGL的经验,那么它肯定会自然得多。如果在Python中有很多经验,但是没有C或C++的经验,并且你想学习OpenGL,那么Python和pyopengl是正确的选择。老实说,我以前在C++中已经做过了,很久以前(10年),我仍然做噩梦,我要做的就是打开窗口,如果OpenGL:拉比我同意你的看法:)。我的建议是,如果你已经知道C/C++。在这个问题上,作者没有提出他们只懂python,我不想做这样的假设。当然,如果您只了解python,那么您的选择是有限的,但是与本质上是C/FFI库(或它们周围的轻包装器)的交互通常是很棘手的。在这种情况下,情况尤其糟糕,因为大量的学习资源和文档都是为C编写的。所以我的观点是,如果您已经了解C,那么在python中学习opengl可能是一场艰苦的战斗。
import numpy

numIndAr = numpy.array(self.indices, dtype='uint')
glBufferData(GL_ELEMENT_ARRAY_BUFFER, numIndAr, GL_STATIC_DRAW)
glDrawElements(GL_TRIANGLES, len(self.indices), GL_UNSIGNED_INT, None)