Не работает код OpenGL python

введите сюда описание изображенияПытась сделать 3д движок на пайтон с использованием pygame, PyOpenGL, numpy, trimesh, pyrr, но он не работает(отображается только 1 треугольник на грани). Помогите пожайлуста Вот код:

import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GL.shaders import compileProgram, compileShader
import numpy as np
from pyrr import Matrix44, Vector3
import trimesh

mesh = trimesh.load_mesh("cube.obj")
vertices = np.array([mesh.vertices], dtype=np.float32)

colors = np.array([
    1.0, 0.0, 0.0,
    0.0, 1.0, 0.0,
    0.0, 0.0, 1.0,
    1.0, 1.0, 0.0,
    1.0, 0.0, 1.0,
    0.0, 1.0, 1.0,
    1.0, 1.0, 1.0,
    0.0, 0.0, 0.0
], dtype=np.float32)

vertices = np.hstack((vertices.reshape(-1, 3), colors.reshape(-1, 3)))

indices = np.array(mesh.faces, dtype=np.uint32)

vertex_shader = """
#version 330 core
layout(location = 0) in vec3 position;
layout(location = 1) in vec3 color;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

out vec3 vertexColor;

void main() {
    gl_Position = projection * view * model * vec4(position, 1.0);
    vertexColor = color;
}
"""

fragment_shader = """
#version 330 core
in vec3 vertexColor;
out vec4 fragColor;

void main() {
    fragColor = vec4(vertexColor, 1.0);
}
"""

pygame.init()
screen = pygame.display.set_mode((800, 600), DOUBLEBUF | OPENGL)
pygame.display.set_caption("3D Cube")

shader = compileProgram(
    compileShader(vertex_shader, GL_VERTEX_SHADER),
    compileShader(fragment_shader, GL_FRAGMENT_SHADER)
)
glUseProgram(shader)

VAO = glGenVertexArrays(1)
VBO = glGenBuffers(1)
EBO = glGenBuffers(1)

glBindVertexArray(VAO)

glBindBuffer(GL_ARRAY_BUFFER, VBO)
glBufferData(GL_ARRAY_BUFFER, vertices.nbytes, vertices, GL_STATIC_DRAW)

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO)
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.nbytes, indices, GL_STATIC_DRAW)

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * vertices.itemsize, ctypes.c_void_p(0))
glEnableVertexAttribArray(0)

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * vertices.itemsize, ctypes.c_void_p(12))
glEnableVertexAttribArray(1)

glEnable(GL_DEPTH_TEST)

model = Matrix44.identity()
view = Matrix44.look_at(
    eye=Vector3([2.0, 2.0, 2.0]),
    target=Vector3([0.0, 0.0, 0.0]),
    up=Vector3([0.0, 1.0, 0.0])
)
projection = Matrix44.perspective_projection(45.0, 800 / 600, 0.1, 100.0)

model_loc = glGetUniformLocation(shader, "model")
view_loc = glGetUniformLocation(shader, "view")
projection_loc = glGetUniformLocation(shader, "projection")

glUniformMatrix4fv(view_loc, 1, GL_FALSE, view)
glUniformMatrix4fv(projection_loc, 1, GL_FALSE, projection)

run = True
clock = pygame.time.Clock()
FPS = 60
angle = 0

while run:
    for event in pygame.event.get():
        if event.type == QUIT:
            run = False

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    angle += 1
    rotation = Matrix44.from_y_rotation(np.radians(angle))
    glUniformMatrix4fv(model_loc, 1, GL_FALSE, rotation)

    glBindVertexArray(VAO)
    glDrawElements(GL_TRIANGLES, len(indices), GL_UNSIGNED_INT, None)

    pygame.display.flip()
    clock.tick(FPS)

pygame.quit()

Ответы (0 шт):