2015-10-03 5 views
0

Я установил виджет qt, который служит в качестве зрителя opengl. Моя цель - использовать его как средство просмотра текстур и как средство просмотра модели. Вот почему я создал две разные программы, с различными шейдерами, прикрепленными к ним, чтобы соответствовать моим потребностям.DrawElements crashes Qt App

Я храню все объекты в пользовательском классе, который я создал, который также хранит правильный идентификатор объектной программы.

В функции paintGL QGLWidget я выполняю всю работу, которая должна быть выполнена, чтобы рисовать сцену.

Проблема в том, что, хотя модели работают, когда я пытаюсь просто переключать программы и нарисовать простой квад, окно выходит из строя, и я не получаю ошибок в консоли того, что произошло. Добавляя заявления о печати, я обнаружил, что функция 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 

Заранее спасибо

ответ

0

я тупой ... Из-за моего случая структуры идиот, я не был обязательным любой буфер вершин , и я потребовал открыть Элементы. Я переместил этот раздел из блока if, и он работал :)

 Смежные вопросы

  • Нет связанных вопросов^_^