Я установил виджет 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
Заранее спасибо