質問:この単純な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_()
回答:コードには2つのバグがあります。
ブレット・ヘイルが指摘したように、への呼びかけは
glBindAttribLocation
前に来なければなりません。self._shaderProgram.link()
numpy.ndarray
に置き換える必要がありますnumpy.array
。
これらの2つの問題を修正すると、コードは期待どおりに機能します。