Problem when rendering a red triangle using modernGL and Pygame

46 views Asked by At

I'm building a game engine using Pygame and modernGL. When I run the program it's supposed to render a red triangle. However, it only renders the red triangle when the program is closed.

gif about the red triangle

Here are my file codes:

main.py

import pygame 
import moderngl as mgl
import sys
from model import Model

class GameEngine:
    def __init__(self, screenSize=(800, 600)):
        pygame.init()
        pygame.display.gl_set_attribute(pygame.GL_CONTEXT_MAJOR_VERSION, 3)
        pygame.display.gl_set_attribute(pygame.GL_CONTEXT_MINOR_VERSION, 3)
        pygame.display.gl_set_attribute(pygame.GL_CONTEXT_PROFILE_MASK, pygame.GL_CONTEXT_PROFILE_CORE)
        pygame.display.set_mode(screenSize, flags=pygame.GL_DOUBLEBUFFER | pygame.OPENGL)
        self.context = mgl.create_context()
        self.clock = pygame.time.Clock()
        self.scene = Model(self)
        self.running = True

    def check_events(self):
        pass

    def render(self):
        self.context.clear(color=(0.00, 0.16, 0.18))
        self.scene.render()

    def run(self):
        while self.running:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.running = False
            self.render() 
            pygame.display.flip()
            print('FRAME rendered')
            self.clock.tick(60) 
        self.scene.destroy()
        pygame.quit()
        sys.exit()

if __name__ == '__main__':
    app = GameEngine()
    app.run()

model.py

import numpy as np

class Model:
    def __init__(self, app):
        self.app = app
        self.context = app.context
        self.vbo = self.get_vbo()
        self.shader_program = self.get_shader_program('default')
        self.vao = self.get_vao()

    def render(self):
        self.vao.render()  
        print('VAO rendered')  

    def destroy(self):
        self.vbo.release()
        self.shader_program.release()
        self.vao.release()

    def get_vao(self):
        vao = self.context.vertex_array(self.shader_program, [(self.vbo, '3f', 'ini_position')])
        return vao

    def get_vertex_data(self):
        vertex_data = [(1.0, 0.0, 0.0),(0.0, 1.0, 0.0),(-1.0, 0.0, 0.0), (0.0, -1.0, 0.0)]
        vertex_data = np.array(vertex_data, dtype='f4')
        return vertex_data

    def get_vbo(self):
        vertex_data = self.get_vertex_data()
        vbo = self.context.buffer(vertex_data)
        return vbo

    def get_shader_program(self, shader_name):
        with open(f'C:/Users/gabri/Documents/Projeto_Testes/gameEngine/shaders/{shader_name}.vert') as file:
            vert_shader = file.read()
        with open(f'C:/Users/gabri/Documents/Projeto_Testes/gameEngine/shaders/{shader_name}.frag') as file:
            frag_shader = file.read()
        program = self.context.program(vertex_shader=vert_shader, fragment_shader=frag_shader)
        return program

render.py

from model import Model
import pygame

class Render(Model):
    def __init__(self, app):
        super().__init__(app)
        
        self.vbo = self.get_vbo()
        self.vao = self.get_vao()

    def render(self):
        self.vao.render()  
        print('VAO rendered')  
    
    def destroy(self):
        self.vbo.release()
        self.shader_program.release()
        self.vao.release()

default.frag

#version 330

layout (location = 0) out vec4 fragColor;

void main() {
    vec3 color = vec3(1.0, 0.0, 0.0);
    fragColor = vec4(color, 1.0); 
}

defaul.vert

#version 330

layout(location = 0) in vec3 ini_position;

void main() {
    gl_Position = vec4(ini_position, 1.0);
}

I tried to use the pygame.display.flip() on different places of the code but I had the same problem

0

There are 0 answers