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

我究竟做错了什么?