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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
import moderngl_window
from moderngl_window import geometry
from pyrr import Matrix44
class PolygonOffset(moderngl_window.WindowConfig):
title = "Polygon Offset"
samples = 4
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.program_sphere = self.ctx.program(
vertex_shader="""
#version 330
uniform mat4 m_model;
uniform mat4 m_proj;
in vec3 in_position;
in vec3 in_normal;
out vec3 pos;
out vec3 normal;
void main() {
vec4 p = m_model * vec4(in_position, 1.0);
gl_Position = m_proj * p;
mat3 m_normal = inverse(transpose(mat3(m_model)));
normal = m_normal * normalize(in_normal);
pos = p.xyz;
}
""",
fragment_shader="""
#version 330
out vec4 fragColor;
uniform vec4 color = vec4(1.0, 0.0, 0.0, 1.0);
in vec3 pos;
in vec3 normal;
void main() {
float l = dot(normalize(-pos), normalize(normal));
fragColor = color * (0.25 + abs(l) * 0.75);
}
""",
)
self.program_lines = self.ctx.program(
vertex_shader="""
#version 330
uniform mat4 m_model;
uniform mat4 m_proj;
in vec3 in_position;
void main() {
gl_Position = m_proj * m_model * vec4(in_position, 1.0);
}
""",
fragment_shader="""
#version 330
out vec4 fragColor;
void main() {
fragColor = vec4(0.7, 0.7, 0.7, 1.0);
}
""",
)
self.sphere = geometry.sphere(radius=2.0, sectors=32, rings=16)
self.projection = Matrix44.perspective_projection(60, self.wnd.aspect_ratio, 1, 100, dtype="f4")
self.poly_offset_enabled = True
def render(self, time: float, frame_time: float):
self.ctx.clear()
self.ctx.enable(self.ctx.DEPTH_TEST | self.ctx.CULL_FACE)
self.program_lines["m_proj"].write(self.projection)
self.program_sphere["m_proj"].write(self.projection)
trans = Matrix44.from_translation((0, 0, -4.5), dtype="f4")
rot = Matrix44.from_eulers((time/2, time/12.33, time/11.94), dtype="f4")
matrix = rot @ trans
self.program_lines["m_model"].write(matrix)
self.program_sphere["m_model"].write(matrix)
self.sphere.render(self.program_sphere)
if self.poly_offset_enabled:
self.ctx.polygon_offset = -1, -1
self.ctx.wireframe = True
self.sphere.render(self.program_lines)
if self.poly_offset_enabled:
self.ctx.polygon_offset = 0, 0
self.ctx.wireframe = False
def key_event(self, key, action, modifiers):
keys = self.wnd.keys
if action == keys.ACTION_PRESS and key == keys.SPACE:
self.poly_offset_enabled = not self.poly_offset_enabled
PolygonOffset.run()
|