PyOpenGL コードから GLSL シェーダーに射影行列とモデルビュー行列を渡すのに問題があります。私の理解では、OpenGL マトリックスは列優先ですが、示されているように射影およびモデルビュー マトリックスを渡すと、何も表示されません。行列の転置を試みたところ、モデルビュー行列では機能しましたが、射影行列はどちらの方法でも機能しません。コードは次のとおりです。
OpenGL のインポート
OpenGL.GLインポートから *
OpenGL.GL.shaders インポートから *
OpenGL.GLUインポートから*
OpenGL.GLUT インポートから *
OpenGL.GLUT.freeglutインポートから *
from OpenGL.arrays import vbo
numpy、math、sys をインポートする
strVS = """
属性 vec3 aVert;
均一なmat4 uMVMatrix;
均一なmat4 uPMatrix;
均一な vec4 uColor;
さまざまな vec4 vCol;
ボイドメイン(){
// オプション #1 - 失敗
gl_Position = uPMatrix * uMVMatrix * vec4(aVert, 1.0);
// オプション #2 - 動作します
gl_Position = vec4(aVert, 1.0);
// 色を設定
vCol = vec4(uColor.rgb, 1.0);
}
"""
strFS = """
さまざまな vec4 vCol;
ボイドメイン(){
// 頂点カラーを使用
gl_FragColor = vCol;
}
"""
# 3D シーン
クラスシーン:
# 初期化
def __init__(自己):
# シェーダ作成
self.program = compileProgram(compileShader(strVS,
GL_VERTEX_SHADER)、
compileShader(strFS,
GL_FRAGMENT_SHADER)))
glUseProgram(self.program)
self.pMatrixUniform = glGetUniformLocation(self.program, 'uPMatrix')
self.mvMatrixUniform = glGetUniformLocation(self.program,
"uMVMatrix")
self.colorU = glGetUniformLocation(self.program, "uColor")
# 属性
self.vertIndex = glGetAttribLocation(self.program, "aVert")
# 色
self.col0 = [1.0, 1.0, 0.0, 1.0]
# クワッド頂点を定義
s = 0.2
quadV = [
-秒、秒、0.0、
-s、-s、0.0、
秒、秒、0.0、
秒、秒、0.0、
-s、-s、0.0、
秒、-秒、0.0
]
# 頂点
self.vertexBuffer = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, self.vertexBuffer)
vertexData = numpy.array(quadV, numpy.float32)
glBufferData(GL_ARRAY_BUFFER, 4*len(頂点データ), 頂点データ,
GL_STATIC_DRAW)
# 与える
def render(自己、pMatrix、mvMatrix):
# シェーダーを使う
glUseProgram(self.program)
# プロジェクト行列を設定
glUniformMatrix4fv(self.pMatrixUniform, 1, GL_FALSE, pMatrix)
# モデルビュー マトリックスを設定
glUniformMatrix4fv(self.mvMatrixUniform, 1, GL_FALSE, mvMatrix)
# 色を設定
glUniform4fv(self.colorU, 1, self.col0)
#配列を有効にする
glEnableVertexAttribArray(self.vertIndex)
# バッファを設定
glBindBuffer(GL_ARRAY_BUFFER, self.vertexBuffer)
glVertexAttribPointer(self.vertIndex, 3, GL_FLOAT, GL_FALSE, 0, なし)
# 描く
glDrawArrays(GL_TRIANGLES, 0, 6)
# 配列を無効にする
glDisableVertexAttribArray(self.vertIndex)
クラスレンダラー:
def __init__(自己):
合格
def reshape (自己、幅、高さ):
self.width = 幅
self.height = 高さ
self.aspect = width/float(高さ)
glViewport(0, 0, セルフ.幅, セルフ.高さ)
glEnable(GL_DEPTH_TEST)
glDisable(GL_CULL_FACE)
glClearColor(0.8, 0.8, 0.8,1.0)
glutPostRedisplay()
def keyPressed(self, *args):
sys.exit()
デフドロー(自己):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
# 射影行列を構築する
fov = math.radians(45.0)
f = 1.0/math.tan(fov/2.0)
zN、zF = (0.1、100.0)
a = セルフ アスペクト
pMatrix = numpy.array([f/a, 0.0, 0.0, 0.0,
0.0、f、0.0、0.0、
0.0、0.0、(zF+zN)/(zN-zF)、-1.0、
0.0、0.0、2.0*zF*zN/(zN-zF)、0.0]、numpy.float32)
# モデルビュー マトリックス
mvMatrix = numpy.array([1.0, 0.0, 0.0, 0.0,
0.0、1.0、0.0、0.0、
0.0、0.0、1.0、0.0、
0.5、0.0、-5.0、1.0]、numpy.float32)
# 与える
self.scene.render(pMatrix, mvMatrix)
# スワップバッファ
glutSwapBuffers()
デフォルト実行 (自己):
glutInitDisplayMode(GLUT_RGBA)
glutInitWindowSize(400, 400)
self.window = glutCreateWindow("最小")
glutReshapeFunc(self.reshape)
glutDisplayFunc(self.draw)
glutKeyboardFunc(self.keyPressed) # キーストロークをチェック
self.scene = Scene()
glutMainLoop()
glutInit(sys.argv)
prog = レンダラー()
prog.run()
マトリックスなしでシェーダーで使用するoption #2と、次の出力が得られます。

私は何を間違っていますか?