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
と、次の出力が得られます。
私は何を間違っていますか?