【问题标题】:DrawElements crashes Qt AppDrawElements 使 Qt 应用程序崩溃
【发布时间】:2015-12-31 18:16:03
【问题描述】:

我已经设置了一个用作 opengl 查看器的 qt 小部件。我的目标是将它用作纹理查看器和模型查看器。这就是为什么我创建了两个不同的程序,并附加了不同的着色器以满足我的需求。

我将所有对象存储在我创建的自定义类中,该类还存储正确的对象程序 ID。

在 QGLWidget 的 paintGL 函数中,我正在完成所有需要完成的工作以绘制场景。

问题是,当模型工作时,当我试图简单地切换程序并绘制一个简单的四边形时,窗口崩溃了,我在控制台中没有看到发生的错误。通过添加打印语句,我发现 gldrawElements 函数导致了崩溃,但我找不到原因。

def paintGL(self):
    GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
    for ob in self.objects:
        activeBuffers = []
        # GL.glLinkProgram(ob.program)
        GL.glLinkProgram(ob.program)
        GL.glUseProgram(ob.program)
        # print ob.vBuffer, ob.uvBuffer, ob.nBuffer, ob.iBuffer

        if ob.program == self.programs[0]:
            # Update Panning
            loc = GL.glGetUniformLocation(ob.program, "panX")
            GL.glUniform1f(loc, self.panX)
            loc = GL.glGetUniformLocation(ob.program, "panY")
            GL.glUniform1f(loc, self.panY)

            # Update Scale in Shader
            loc = GL.glGetUniformLocation(ob.program, "scale")
            GL.glUniform1f(loc, self.scale)
            # Update Theta in Shader
            loc = GL.glGetUniformLocation(ob.program, "theta")
            GL.glUniform3fv(loc, 1, self.theta)
            # Bind Vertex VBO
            ob.vBuffer.bind()
            vpos = GL.glGetAttribLocation(ob.program, "vPosition")
            GL.glVertexAttribPointer(
                vpos, 3, GL.GL_FLOAT, GL.GL_FALSE, 0, None)
            GL.glEnableVertexAttribArray(vpos)

        if ob.uvBuffer:
            # Bind UVs
            ob.uvBuffer.bind()

            uvpos = GL.glGetAttribLocation(ob.program, "uvPosition")
            print ob.program, uvpos
            if not uvpos == -1:
                GL.glVertexAttribPointer(uvpos, 2, GL.GL_FLOAT, GL.GL_FALSE, 0, None)
                GL.glEnableVertexAttribArray(uvpos)
                activeBuffers.append(ob.uvBuffer)
            else:
                ob.uvBuffer.unbind()

        if ob.nBuffer:
            # Bind Normals
            ob.nBuffer.bind()
            npos = GL.glGetAttribLocation(ob.program, "nPosition")
            GL.glVertexAttribPointer(npos, 3, GL.GL_FLOAT, GL.GL_FALSE, 0, None)
            GL.glEnableVertexAttribArray(npos)
            activeBuffers.append(ob.nBuffer)

        # Bind Indices VBO
        ob.iBuffer.bind()
        activeBuffers.append(ob.iBuffer)
        # if ob.program == self.programs[1]:
        #    print 'Continuing'
        #    continue

        GL.glDrawElements(
           GL.GL_TRIANGLES, ob.iLen, GL.GL_UNSIGNED_INT, None)
        # Unbind everything
        for buf in activeBuffers:
            buf.unbind()

我正在创建这样的对象

def makeTextureQuad(self):
    ob = globject()
    ob.vBuffer = np.array(quadverts, dtype=np.float32)
    ob.vBuffer = glvbo.VBO(ob.vBuffer)
    ob.vLen = len(quadverts)
    ob.iBuffer = np.array(quadfaces, dtype=np.int32)
    ob.iBuffer = glvbo.VBO(ob.iBuffer, target=GL.GL_ELEMENT_ARRAY_BUFFER)
    ob.iLen = len(quadfaces) * 3
    ob.uvBuffer = np.array(quaduvs, dtype=np.float32)
    ob.uvBuffer = glvbo.VBO(ob.uvBuffer)
    # ob.nBuffer = np.array(quadnorms, dtype=np.float32)
    # ob.nBuffer = glvbo.VBO(ob.nBuffer)
    ob.program = self.programs[1]
    return ob

提前致谢

【问题讨论】:

    标签: qt pyopengl


    【解决方案1】:

    我很愚蠢...由于我的白痴案例结构,我没有绑定任何顶点缓冲区,我要求 opengl 绘制元素。我将该部分移出 if 块并且它起作用了:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多