25

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と、次の出力が得られます。

mv/pで変形していない時の出力

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

4

0 に答える 0