问题:这个简单的 OpenGL/GLSL 程序有什么问题?它应该产生一个具有红绿色渐变的四边形。但我只是得到一个黑色窗口,没有错误消息。
import numpy
from OpenGL.GL import *
from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtOpenGL import *
_vertexShaderSource = (
'attribute vec2 a_position;'
'attribute vec3 a_color;'
'varying vec3 v_color;'
''
'void main()'
'{'
' gl_Position = vec4(a_position, 0.0, 1.0);'
' v_color = a_color;'
'}'
)
_fragmentShaderSource = (
'varying vec3 v_color;'
''
'void main()'
'{'
' gl_FragColor = vec4(v_color, 1.0);'
'}'
)
_POSITION = 0
_COLOR = 1
class HelloWidget(QGLWidget):
def __init__(self):
QGLWidget.__init__(self)
def initializeGL(self):
self._shaderProgram = QGLShaderProgram(self.context())
self._shaderProgram.addShaderFromSourceCode(QGLShader.Vertex, _vertexShaderSource)
self._shaderProgram.addShaderFromSourceCode(QGLShader.Fragment, _fragmentShaderSource)
self._shaderProgram.link()
self._shaderProgram.bind()
glBindAttribLocation(self._shaderProgram.programId(), _POSITION, 'a_position')
glBindAttribLocation(self._shaderProgram.programId(), _COLOR, 'a_color')
def paintGL(self):
glViewport(0, 0, self.width(), self.height())
glClear(GL_COLOR_BUFFER_BIT)
position = numpy.ndarray([-0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5], numpy.float32)
glVertexAttribPointer(_POSITION, 2, GL_FLOAT, False, 0, position)
glEnableVertexAttribArray(_POSITION)
color = numpy.ndarray([1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0], numpy.float32)
glVertexAttribPointer(_COLOR, 3, GL_FLOAT, False, 0, color)
glEnableVertexAttribArray(_COLOR)
glDrawArrays(GL_QUADS, 0, 4)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
w = HelloWidget()
w.show()
app.exec_()
答:代码中有两个错误。
正如 Brett Hale 所指出的,
glBindAttribLocation
必须先调用 to 。self._shaderProgram.link()
numpy.ndarray
应替换为numpy.array
.
如果您解决了这两个问题,那么代码将按预期工作。