Skip to content

Commit 00efa3a

Browse files
authored
Add files via upload
1 parent 754745a commit 00efa3a

File tree

6 files changed

+126
-0
lines changed

6 files changed

+126
-0
lines changed

crt_shader.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import struct
2+
import pygame
3+
from pygame.locals import *
4+
from settings import *
5+
import moderngl
6+
7+
class Graphic_engine:
8+
# you need to give this class screen
9+
# screen is a Surface you declare to replace display
10+
def __init__(self, screen):
11+
pygame.init()
12+
self.screen = screen
13+
self.ctx = moderngl.create_context()
14+
self.texture_coordinates = [0, 1, 1, 1,
15+
0, 0, 1, 0]
16+
self.world_coordinates = [-1, -1, 1, -1,
17+
-1, 1, 1, 1]
18+
self.render_indices = [0, 1, 2,
19+
1, 2, 3]
20+
21+
self.prog = self.ctx.program(
22+
vertex_shader=open('shaders/VERTEX_SHADER.glsl').read(),
23+
fragment_shader=open('shaders/FRAGMENT_SHADER.glsl').read(),
24+
)
25+
26+
self.screen_texture = self.ctx.texture(
27+
VIRTUAL_RES, 3,
28+
pygame.image.tostring(screen, "RGB", 1)
29+
)
30+
31+
self.screen_texture.repeat_x = False
32+
self.screen_texture.repeat_y = False
33+
34+
self.vbo = self.ctx.buffer(struct.pack('8f', *self.world_coordinates))
35+
self.uvmap = self.ctx.buffer(struct.pack('8f', *self.texture_coordinates))
36+
self.ibo= self.ctx.buffer(struct.pack('6I', *self.render_indices))
37+
38+
self.vao_content = [
39+
(self.vbo, '2f', 'vert'),
40+
(self.uvmap, '2f', 'in_text')
41+
]
42+
43+
self.vao = self.ctx.vertex_array(self.prog, self.vao_content, self.ibo)
44+
45+
def render(self):
46+
# render will do all the work and update the screen
47+
texture_data = self.screen.get_view('1')
48+
self.screen_texture.write(texture_data)
49+
self.ctx.clear(14/255,40/255,66/255)
50+
self.screen_texture.use()
51+
self.vao.render()
52+
pygame.display.flip()
53+
54+
def __call__(self):
55+
return self.render()

example.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import pygame
2+
from pygame.locals import *
3+
from crt_shader import Graphic_engine
4+
from settings import *
5+
6+
# pygame initialize
7+
pygame.init()
8+
clock = pygame.time.Clock()
9+
10+
# as usual you will create a display and give it a name
11+
# i named my display as screen
12+
# and you need to give it a Surface to replace old display
13+
screen = pygame.Surface(VIRTUAL_RES).convert((255, 65282, 16711681, 0))
14+
# you need to give your display OPENGL flag to blit screen using OPENGL
15+
pygame.display.set_mode(REAL_RES, DOUBLEBUF|OPENGL)
16+
17+
# init shader class
18+
crt_shader = Graphic_engine(screen)
19+
20+
#MAIN LOOP
21+
while (1):
22+
for event in pygame.event.get():
23+
if event.type == QUIT:
24+
pygame.quit()
25+
26+
# you need to put a image in your folder
27+
img = pygame.image.load('image.png').convert()
28+
# if you want to render a image on display just blit on screen
29+
screen.blit(img, (0, 0))
30+
31+
# never forget to render your shader
32+
crt_shader()
33+
clock.tick(FPS)

image.png

40.6 KB
Loading

settings.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# simple settings
2+
VIRTUAL_RES = (800, 600)
3+
REAL_RES=(1080, 720)
4+
FPS=30

shaders/FRAGMENT_SHADER.glsl

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#version 300 es
2+
precision mediump float;
3+
uniform sampler2D Texture;
4+
5+
out vec4 color;
6+
in vec2 v_text;
7+
void main() {
8+
vec2 center = vec2(0.5, 0.5);
9+
vec2 off_center = v_text - center;
10+
11+
off_center *= 1.0 + 0.8 * pow(abs(off_center.yx), vec2(2.7));
12+
// 1.0 -> 1.5 make distance to screen
13+
// vec 2 -> screen flatness
14+
15+
vec2 v_text2 = center+off_center;
16+
17+
if (v_text2.x > 1.0 || v_text2.x < 0.0 ||
18+
v_text2.y > 1.0 || v_text2.y < 0.0){
19+
color=vec4(0.0, 0.0, 0.0, 1.0);
20+
} else {
21+
color = vec4(texture(Texture, v_text2).rgb, 1.0);
22+
float fv = fract(v_text2.y * float(textureSize(Texture,0).y));
23+
fv=min(1.0, 0.8+0.5*min(fv, 1.0-fv));
24+
color.rgb*=fv;
25+
}
26+
}

shaders/VERTEX_SHADER.glsl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#version 300 es
2+
in vec2 vert;
3+
in vec2 in_text;
4+
out vec2 v_text;
5+
void main() {
6+
gl_Position = vec4(vert, 0.0, 1.0);
7+
v_text = in_text;
8+
}

0 commit comments

Comments
 (0)