我无法将投影和模型视图矩阵从我的 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
在没有任何矩阵的着色器中使用时,我得到以下输出:
我究竟做错了什么?