PyOpenGL 没有绘制大 VAO

PyOpenGL not drawing big VAO

我想渲染一个由许多立方体组成的大场景。我的第一个想法是创建一个立方体 VBO,然后使用统一模型矩阵对其进行多次绘制以对其进行转换。这很慢,因为我每帧调用 glDrawArrays 很多次。

所以我决定改用一个巨大的 VBO,每个立方体顶点和一个额外的平移向量。基本上,我将旧的通用立方体 VBO 加上平移矢量,并将该列表附加到我要绘制的每个立方体的 VBO 列表中。然后我绑定一个 VAO 并绘制它。我还更改了顶点着色器,使其接受该平移向量作为顶点属性,并在着色器内生成模型矩阵。

现在,这 return 没有任何错误,这很好,但它实际上并没有绘制任何东西,这不是很好,尽管这个过程与我之前所做的非常相似.

这是一些代码:

将翻译分配给模型矩阵是错误的。 glsl 矩阵按列主要顺序存储。翻译是第 4 列。典型的模型矩阵如下所示:

mat4 m44 = mat4(
    vec4( Xx, Xy, Xz, 0.0),
    vec4( Yx, Xy, Yz, 0.0),
    vec4( Zx  Zy  Zz, 0.0),
    vec4( Tx, Ty, Tz, 1.0) );

您必须更改模型矩阵初始化:

mat4 model = mat4(1.0);

void main() {
    model[3] = vec4(cube_coord.xyz, 1.0);

    // [...]
}

此外,您必须为 numpy.array (numpy.float32) 指定数据类型:

glBufferData(GL_ARRAY_BUFFER, np.array(self.render_list), GL_STATIC_DRAW)

glBufferData(GL_ARRAY_BUFFER, np.array(self.render_list, np.float32), GL_STATIC_DRAW)

顶点数组是二维的,因此len(self.render_list)/8不是顶点数:

glDrawArrays(GL_TRIANGLES, 0, int(len(self.render_list)/8))

no_of_verices = len(self.render_list) * 36
glDrawArrays(GL_TRIANGLES, 0, no_of_verices)

分别

no_of_verices = len(self.render_list) * len(self.render_list[0]) // 8
glDrawArrays(GL_TRIANGLES, 0, no_of_verices)