我目前正在使用 ModernGL 学习 OpenGL。我可以使用下面的顶点渲染红色立方体,没有任何问题并将它们分配给着色器程序:
红色立方体渲染
def get_vertex_data(self):
vertices = [(-1, -1, 1),
(1, -1, 1),
(1, 1, 1),
(-1, 1, 1),
(-1, 1, -1),
(-1, -1, -1),
(1, -1, -1),
(1, 1, -1),]
indices = [(0, 2, 3),(0, 1, 2),
(1, 7, 2),(1, 6, 7),
(6, 5, 4),(4, 7, 6),
(3, 4, 5),(3, 5, 0),
(3, 7, 4),(3, 2, 7),
(0, 6, 1),(0, 5, 6),]
vertex_data = self.get_data(vertices, indices)
print(f'Vertex data = \n {vertex_data}')
return vertex_data
@staticmethod
def get_data(vertices, indices):
data = [vertices[ind] for triangle in indices for ind in triangle]
return np.array(data, dtype='f4')
着色器代码:
#version 330
layout(location = 0) in vec3 ini_position;
void main() {
gl_Position =vec4(ini_position.xy, ini_position.z, 1.0);
}
但是,当我将顶点乘以单位矩阵时,立方体消失了。
matrix.py 文件中的恒等矩阵
@staticmethod
def mIdentity():
return np.array([[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1],]).astype('float32')
我创建了一个单位矩阵着色器程序,如下所示:
self.shaderProgram['identityMatrix'].write(self.camera.m_identity)
这是更新后的着色器程序。
#version 330
layout(location = 0) in vec3 ini_position;
uniform mat4 identityMatrix;
void main() {
gl_Position = identityMatrix * vec4(ini_position.xy, ini_position.z, 1.0);
}
当我运行应用程序时,我们可以检查一些打印输出:
shaderProgram["ini_position"] = <Attribute: 0>
shaderProgram["identityMatrix"] = <Uniform: 0>
identity matrix value =
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
shaderProgram["ini_position"] = <Attribute: 0>
Vertex data =
[[-1. -1. 1.]
[ 1. 1. 1.]
[-1. 1. 1.]
[-1. -1. 1.]
[ 1. -1. 1.]
[ 1. 1. 1.]
[ 1. -1. 1.]
[ 1. 1. -1.]
[ 1. 1. 1.]
[ 1. -1. 1.]
[ 1. -1. -1.]
[ 1. 1. -1.]
[ 1. -1. -1.]
[-1. -1. -1.]
[-1. 1. -1.]
[-1. 1. -1.]
[ 1. 1. -1.]
[ 1. -1. -1.]
[-1. 1. 1.]
[-1. 1. -1.]
[-1. -1. -1.]
[-1. 1. 1.]
[-1. -1. -1.]
[-1. -1. 1.]
[-1. 1. 1.]
[ 1. 1. -1.]
[-1. 1. -1.]
[-1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. -1.]
[-1. -1. 1.]
[ 1. -1. -1.]
[ 1. -1. 1.]
[-1. -1. 1.]
[-1. -1. -1.]
[ 1. -1. -1.]]
vao created: <moderngl.VertexArray object at 0x000001FB688C5880>
VAO, VBO AND SHADER PROGRAM RELEASED
我尝试使用其他矩阵,例如投影或平移矩阵,但它们似乎都无法正常工作。有谁知道如何解决这个问题吗?
尝试通过交换顶点位置和矩阵来反转乘法的顺序
gl_Position =vec4(ini_position.xy, ini_position.z, 1.0) * identityMatrix;
}
如果这不起作用 尝试检查单位矩阵是否正确发送 然后将矩阵发送到片段着色器 将颜色放入identityMatrix[0] 你应该看到红色 并对 1 和 2 重复此操作 你应该看到绿色然后是蓝色
如果这没有发生,则单位矩阵发送到 GPU 时出现问题