Не работает код 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()