2016-04-14 12 views
0

Ich versuche, PyQt5/PyOpenGL Code basierend auf dieser example aus dem OpenGL-Wiki zu erstellen.paintGL zeichnet nichts auf dem Bildschirm

Der Aufruf paintGL() zeigt nichts auf dem Bildschirm. Die Fragen Stackoverflow mit ähnlichen Titeln, die ich aus verschiedenen Themen beschreiben lesen, was ich bin vor:

Hinweis: Ich kann keine Beiträge mehr als 2 Links zu diesem Zeitpunkt aufgrund rep Einschränkungen. Ich habe alle zugehörigen StackOverflow-Links als Kommentare zu dieser Frage hinzugefügt.

Ich ging auch durch die Common OpenGL Mistakes Seite und es scheint nicht zu helfen (möglicherweise habe ich die Seite nicht gut verstanden).

Die glGetErrors Funktion berichtet GL.GL_NO_ERROR bei allen folgenden Stufen:

  1. Wenn die VAO Erstellen Bindung
  2. auf die VBO-Bindungen zu schaffen,
  3. Nach dem Aufruf von glBindVertexArray und glEnableVertexAttribArray

Der glGetShaderiv und glGetProgramiv zurückgeben GL.GL_TRUE, also dort scheint nicht Kompilieren und Verknüpfen von Fehlern.

Der GL Kontext wurde korrekt erstellt. Die self.context().isValid() Überprüfung gibt True zurück.

Ich verwende PyQt5.5, Python 3.4.0 mit PyOpenGL 3.1. Außerdem meldet GPU Caps Viewer, dass Open GL 4.5 auf meinem Computer verfügbar ist.

Jede Hilfe oder Hinweise, um in Bewegung zu kommen, wird sehr geschätzt.

Der Code ist unten.

from PyQt5 import QtGui, QtCore 
import sys, array 
from OpenGL import GL 


# Create the Vertex Shader script and the Fragment Shader script here. 
DeltaVertexShader = ''' 
#version 420 core 

layout (location = 0) in vec4 vertexPositions; 
layout (location = 1) in vec4 vertexColours; 

smooth out vec4 fragmentColours; 

void main() 
{ 
    gl_Position = vertexPositions; 
    fragmentColours = vertexColours; 
} 
''' 

DeltaFragmentShader = ''' 
#version 420 core 

smooth in vec4 fragmentColours; 
out vec4 finalColours; 

void main() 
{ 
    finalColours = fragmentColours; 
} 
''' 

class PulleysWithWeights3D(QtGui.QOpenGLWindow): 


    def __init__(self): 
     super().__init__() 

     # These are the 4D coordinates of a triangle that needs to be drawn. 
     _vertexPos = [ 0.075, 0.075, 0.075, 1.0, \ 
         0.275, 0.275, 0.275, 1.0, \ 
         0.550, 0.550, 0.550, 1.0 ] 

     # These are the RGBA colours for each vertex. 
     _vertexCols = [ 0.875, 0.525, 0.075, 0.500, \ 
         0.875, 0.525, 0.075, 0.500, \ 
         0.875, 0.525, 0.075, 0.500 ] 

     self._deltaPositions = array.array('f', _vertexPos) 
     self._deltaColours = array.array('f', _vertexCols) 

     self._appSurfaceFormat = QtGui.QSurfaceFormat() 

     self._appSurfaceFormat.setProfile(QtGui.QSurfaceFormat.CoreProfile) 
     self._appSurfaceFormat.setMajorVersion(4) 
     self._appSurfaceFormat.setMinorVersion(2) 
     self._appSurfaceFormat.setRenderableType(QtGui.QSurfaceFormat.OpenGL) 
     self._appSurfaceFormat.setSamples(16) 
     self._appSurfaceFormat.setSwapBehavior(QtGui.QSurfaceFormat.DoubleBuffer) 
     self.setSurfaceType(QtGui.QSurface.OpenGLSurface) 

     self.setFormat(self._appSurfaceFormat) 

     self.setIcon(QtGui.QIcon('OpenGL.png')) 
     self.setTitle('Pulleys3D') 
     self.setMinimumSize(QtCore.QSize(1280, 640)) 
     self.show() 


    def initializeGL(self): 
     GL.glClearColor(0.0, 0.0, 0.00, 1.0) # RGBA 
     GL.glClearDepthf(1.0) 
     GL.glClearStencil(0) 
     GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT | GL.GL_STENCIL_BUFFER_BIT) 

     # Initialize a VAO. 
     self._vaoColouredDelta = GL.glGenVertexArrays(1) 
     GL.glBindVertexArray(self._vaoColouredDelta) 

     # Initialize the VBOs. 
     self._vboPositions = GL.glGenBuffers(1) # Create the position buffer. 
     self._vboShades = GL.glGenBuffers(1) # Create the colours buffer.   

     # Bind the positions VBO to the GL_ARRAY_BUFFER target. 
     GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self._vboPositions) 

     # Initialize the positions buffer with the positions array data. 
     GL.glBufferData(GL.GL_ARRAY_BUFFER, self._deltaPositions.buffer_info()[1] * self._deltaPositions.itemsize, \ 
         self._deltaPositions.tobytes(), GL.GL_STATIC_DRAW) 

     GL.glEnableVertexAttribArray(0) # Enable attribute array 0, i.e., the positions array. 

     GL.glVertexAttribPointer(0, 4, GL.GL_FLOAT, GL.GL_FALSE, 0, None) 

     GL.glBindBuffer(GL.GL_ARRAY_BUFFER, 0) 

     GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self._vboShades) 
     GL.glBufferData(GL.GL_ARRAY_BUFFER, self._deltaColours.buffer_info()[1] * self._deltaColours.itemsize, \ 
         self._deltaColours.tobytes(), GL.GL_STATIC_DRAW) 
     GL.glEnableVertexAttribArray(1) # Enable attribute array 1, i.e., the colours array. 
     GL.glVertexAttribPointer(1, 4, GL.GL_FLOAT, GL.GL_FALSE, 0, None) 

     GL.glBindBuffer(GL.GL_ARRAY_BUFFER, 0) 
     GL.glBindVertexArray(0) # Unbind the VAO. 

     # Initialize the vertex shader and fragment shader program objects. 
     _vertexShaderObj = GL.glCreateShader(GL.GL_VERTEX_SHADER) 
     _fragmentShaderObj = GL.glCreateShader(GL.GL_FRAGMENT_SHADER) 

     GL.glShaderSource(_vertexShaderObj, DeltaVertexShader) 
     GL.glShaderSource(_fragmentShaderObj, DeltaFragmentShader) 

     GL.glCompileShader(_vertexShaderObj) 
     GL.glCompileShader(_fragmentShaderObj) 


     if GL.glGetShaderiv(_vertexShaderObj, GL.GL_COMPILE_STATUS) != GL.GL_TRUE: 
      # There was a compilation error. Print it. 
      print('Vertex Shader Compilation failed! Details follow.') 
      print('Compilation errors are: %s ' %(str(GL.glGetShaderInfoLog(_vertexShaderObj)))) 

      # Delete this shader. 
      GL.glDeleteShader(_vertexShaderObj) 
      return # Don't continue execution. 
     elif GL.glGetShaderiv(_fragmentShaderObj, GL.GL_COMPILE_STATUS) != GL.GL_TRUE: 
      print('Fragment Shader Compilation failed! Details follow.') 
      print('Compilation errors are: %s ' %(str(GL.glGetShaderInfoLog(_fragmentShaderObj)))) 

      # Delete this shader. 
      GL.glDeleteShader(_fragmentShaderObj) 
      return # Don't continue execution. 

     self._renderProgram = GL.glCreateProgram() 
     GL.glAttachShader(self._renderProgram, _vertexShaderObj) 
     GL.glAttachShader(self._renderProgram, _fragmentShaderObj) 

     GL.glLinkProgram(self._renderProgram) 


     if GL.glGetProgramiv(self._renderProgram, GL.GL_LINK_STATUS) != GL.GL_TRUE: 
      print('Shader linking failed! Details follow.') 
      print('Linking errors are: %s ' %(str(GL.glGetProgramInfoLog(self._renderProgram)))) 

      GL.glDetachShader(self._renderProgram, _vertexShaderObj) 
      GL.glDetachShader(self._renderProgram, _fragmentShaderObj) 
      GL.glDeleteShader(_vertexShaderObj) 
      GL.glDeleteShader(_fragmentShaderObj) 

      # Delete the program. 
      GL.glDeleteProgram(self._renderProgram) 
      return # Don't continue execution. 

     # Always detach shaders after a successful link. 
     GL.glDetachShader(self._renderProgram, _vertexShaderObj) 
     GL.glDetachShader(self._renderProgram, _fragmentShaderObj) 


    def resizeGL(self, wd, ht): 
     # Resize the viewport by calling glViewport with the new height and width. 
     GL.glViewport(0, 0, wd, ht) 


    def paintGL(self): 
     GL.glClearColor(0.0, 0.0, 0.00, 1.0) # RGBA 
     GL.glClearDepthf(1.0) 
     GL.glClearStencil(0) 
     GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT | GL.GL_STENCIL_BUFFER_BIT) 

     # Initialize the shader program to paint. 
     GL.glUseProgram(self._renderProgram) 

     GL.glBindVertexArray(self._vaoColouredDelta) 

     # Draw the array. 
     GL.glDrawArrays(GL.GL_TRIANGLES, 0, 3) 


     # Swap the front and back buffers so the newly drawn content is visible. 
     self.context().swapBuffers(self) 

     # Unbind the vertex array and the program. 
     GL.glBindVertexArray(0) 
     GL.glUseProgram(0) 


if __name__ == '__main__': 
    _pww3dApp = QtGui.QGuiApplication(sys.argv) 
    _pww3d = PulleysWithWeights3D() 
    sys.exit(_pww3dApp.exec_()) 
+0

Hier sind die Links, die ich in meinem Beitrag erwähnt: , und

+0

Die akzeptierte Antwort für die folgende Frage scheint auf viele Links verwiesen zu werden: http://stackoverflow.com/questions/14365484/how-to-draw-with-vertex-array-objects-and-gldraweiements-in- Pyopengl/14365737 # 14365737. Lesen Sie es durch. –

Antwort

0

Die verwendeten XYZ-Werte verursacht ein Dreieck zu klein, um zu erbringenden bemerkt zu werden.

Die Skalierung der X-, Y- und Z-Werte führt zur Anzeige des Dreiecks. ZB

_vertexPos = [ 0.775, 0.775, 0.775, 1.0, \ 
       0.275, 0.275, 0.275, 1.0, \ 
       0.550, 0.550, 0.550, 1.0 ] 
Verwandte Themen