OpenGL Shader 程序中矩阵乘法的问题

问题描述 投票:0回答:1

我目前正在使用 ModernGL 学习 OpenGL。我可以使用下面的顶点渲染红色立方体,没有任何问题并将它们分配给着色器程序:

红色立方体渲染

这是我用来生成顶点数据的代码: red cube rendered

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 文件的单位矩阵: the default clear color, blue

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

我尝试使用其他矩阵,例如投影或平移矩阵,但它们似乎都无法正常工作。有谁知道如何解决这个问题吗?

python numpy glsl matrix-multiplication python-moderngl
1个回答
0
投票

尝试通过交换顶点位置和矩阵来反转乘法的顺序

gl_Position =vec4(ini_position.xy, ini_position.z, 1.0) * identityMatrix;
}

如果这不起作用 尝试检查单位矩阵是否正确发送 然后将矩阵发送到片段着色器 将颜色放入identityMatrix[0] 你应该看到红色 并对 1 和 2 重复此操作 你应该看到绿色然后是蓝色

如果这没有发生,则单位矩阵发送到 GPU 时出现问题

© www.soinside.com 2019 - 2024. All rights reserved.