我想從OpenGL Wiki中基於這個example創建PyQt5/PyOpenGL代碼。paintGL不會在屏幕上繪製任何東西
paintGL()
調用不會在屏幕上顯示任何內容。我閱讀的類似標題的StackOverflow問題描述了我面臨的不同問題:
注意:由於rep限制,此時我無法發佈超過2個鏈接。我添加了所有相關的StackOverflow鏈接,作爲對此問題的註釋。
我也經歷了Common OpenGL Mistakes頁面,它似乎沒有幫助(很可能我沒有很好地理解頁面)。
- 在創建VAO結合
- 在創建VBO綁定,
- 調用
glBindVertexArray
和glEnableVertexAttribArray
的經過:
的glGetErrors
功能在以下所有階段報告GL.GL_NO_ERROR
glGetShaderiv
和glGetProgramiv
返回GL.GL_TRUE
,所以有似乎沒有編譯和鏈接錯誤。
GL上下文似乎已被正確創建。 self.context().isValid()
支票返回True
。
我使用PyQt5.5,Python 3.4.0與PyOpenGL 3.1。此外,GPU Caps Viewer報告說Open GL 4.5在我的機器上可用。
任何幫助或指示移動是非常讚賞。
代碼如下。
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_())
這裏是我在我的文章中提到的鏈接:,和 –
以下問題的接受答案似乎在許多鏈接中引用:http://stackoverflow.com/questions/14365484/how-to-draw-with-vertex-array-objects-and-gldrawelements-in- pyopengl/14365737#14365737。通讀它。 –