-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtexture.py
More file actions
64 lines (50 loc) · 2.37 KB
/
texture.py
File metadata and controls
64 lines (50 loc) · 2.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import pygame as pg
import moderngl as mgl
import struct
def get_texture_cube(ctx, dir_path, ext='png'):
faces = ['right', 'left', 'top', 'bottom'] + ['front', 'back'][::-1]
# textures = [pg.image.load(dir_path + f'{face}.{ext}').convert() for face in faces]
textures = []
for face in faces:
texture = pg.image.load(dir_path + f'{face}.{ext}').convert()
if face in ['right', 'left', 'front', 'back']:
texture = pg.transform.flip(texture, flip_x=True, flip_y=False)
else:
texture = pg.transform.flip(texture, flip_x=False, flip_y=True)
textures.append(texture)
size = textures[0].get_size()
texture_cube = ctx.texture_cube(size=size, components=3, data=None)
for i in range(6):
texture_data = pg.image.tostring(textures[i], 'RGB')
texture_cube.write(face=i, data=texture_data)
return texture_cube
def get_texture(ctx, path):
texture = pg.image.load(path).convert()
texture = pg.transform.flip(texture, flip_x=False, flip_y=True)
texture = ctx.texture(size=texture.get_size(), components=4,
data=pg.image.tostring(texture, 'RGBA'))
# mipmaps
texture.filter = (mgl.LINEAR_MIPMAP_LINEAR, mgl.LINEAR)
texture.build_mipmaps()
# AF
texture.anisotropy = 32.0
return texture
def get_program(ctx: mgl.Context, shader_program_name, shader_frag_name = None):
if shader_frag_name is None:
shader_frag_name = shader_program_name
with open(f'shaders/{shader_program_name}.vert') as file:
vertex_shader = file.read()
with open(f'shaders/{shader_frag_name}.frag') as file:
fragment_shader = file.read()
program = ctx.program(vertex_shader=vertex_shader, fragment_shader=fragment_shader)
return program
def get_vao(ctx : mgl.Context, program, vbo):
vao = ctx.vertex_array(program, [(vbo.vbo, vbo.format, *vbo.attribs)])
return vao
def do_pass(fb_dest : mgl.Framebuffer, fb_prev: mgl.Framebuffer, vao : mgl.VertexArray, uniforms : dict = None):
fb_dest.use()
fb_prev.color_attachments[0].use()
if uniforms is not None:
for name, value in uniforms.items():
vao.program[name].write(struct.pack('i', value))
vao.render()