25

我无法将投影和模型视图矩阵从我的 PyOpenGL 代码传递到 GLSL 着色器。我的理解是 OpenGL 矩阵是列主要的,但是当我如图所示传入投影和模型视图矩阵时,我什么也看不到。我尝试了矩阵的转置,它适用于模型视图矩阵,但投影矩阵不起作用。这是代码:

导入 OpenGL
从 OpenGL.GL 导入 *
从 OpenGL.GL.shaders 导入 *
从 OpenGL.GLU 导入 *
从 OpenGL.GLUT 导入 *
从 OpenGL.GLUT.freeglut 导入 *
从 OpenGL.arrays 导入 vbo
导入 numpy,数学,系统

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):

        # 创建着色器
        self.program = compileProgram(compileShader(strVS,
                                                    GL_VERTEX_SHADER),
                                      编译着色器(strFS,
                                                    GL_FRAGMENT_SHADER))
        glUseProgram(self.program)

        self.pMatrixUniform = glGetUniformLocation(self.program, 'uPMatrix')
    self.mvMatrixUniform = glGetUniformLocation(self.program,
                                                  “uMV矩阵”)
        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
    四维 = [
            -s, s, 0.0,
             -s, -s, 0.0,
             s, s, 0.0,
             s, s, 0.0,
             -s, -s, 0.0,
             s, -s, 0.0
             ]

        # 个顶点
        self.vertexBuffer = glGenBuffers(1)
        glBindBuffer(GL_ARRAY_BUFFER, self.vertexBuffer)
        vertexData = numpy.array(quadV, numpy.float32)
        glBufferData(GL_ARRAY_BUFFER, 4*len(vertexData), vertexData,
                     GL_STATIC_DRAW)

    # 使成为
    def 渲染(自我,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__(self):
        经过

    def 重塑(自我,宽度,高度):
        self.width = 宽度
        self.height = 身高
        self.aspect = 宽度/浮动(高度)
        glViewport(0, 0, self.width, self.height)
        glEnable(GL_DEPTH_TEST)
        glDisable(GL_CULL_FACE)
        glClearColor(0.8, 0.8, 0.8,1.0)
        过剩后重新显示()

    def keyPressed(self, *args):
        sys.exit()

    def 绘制(自我):
        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 = self.aspect
        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 = 场景()
        过剩主循环()

glutInit(sys.argv)
prog = 渲染器()
程序运行()

当我option #2在没有任何矩阵的着色器中使用时,我得到以下输出:

不使用 mv/p 转换时的输出

我究竟做错了什么?

4

0 回答 0