Skip to content

Commit c5d70f5

Browse files
authored
Lights without geometry shader (#2716)
1 parent 72599fc commit c5d70f5

4 files changed

Lines changed: 46 additions & 64 deletions

File tree

arcade/future/light/lights.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,18 +97,36 @@ def __init__(self, width: int, height: int):
9797
self._rebuild = False
9898
self._stride = 28
9999
self._buffer = self.ctx.buffer(reserve=self._stride * 100)
100+
# fmt: off
101+
vertex_data = array('f', [
102+
-1.0, +1.0, 0.0, 1.0,
103+
-1.0, -1.0, 0.0, 0.0,
104+
+1.0, +1.0, 1.0, 1.0,
105+
+1.0, -1.0, 1.0, 0.0,
106+
])
107+
# fmt: on
100108
self._vao = self.ctx.geometry(
101109
[
110+
gl.BufferDescription(
111+
self.ctx.buffer(data=vertex_data),
112+
"2f 2f",
113+
["in_vert", "in_uv"],
114+
),
102115
gl.BufferDescription(
103116
self._buffer,
104117
"2f 1f 1f 3f",
105-
["in_vert", "in_radius", "in_attenuation", "in_color"],
118+
[
119+
"in_instance_position",
120+
"in_instance_radius",
121+
"in_instance_attenuation",
122+
"in_instance_color",
123+
],
124+
instanced=True,
106125
),
107126
]
108127
)
109128
self._light_program = self.ctx.load_program(
110129
vertex_shader=":system:shaders/lights/point_lights_vs.glsl",
111-
geometry_shader=":system:shaders/lights/point_lights_geo.glsl",
112130
fragment_shader=":system:shaders/lights/point_lights_fs.glsl",
113131
)
114132
self._combine_program = self.ctx.load_program(
@@ -214,10 +232,12 @@ def draw(
214232
self._light_buffer.use()
215233
self._light_buffer.clear()
216234
if len(self._lights) > 0:
217-
self._light_program["position"] = position
235+
self._light_program["offset"] = position
218236
self.ctx.enable(self.ctx.BLEND)
219237
self.ctx.blend_func = self.ctx.BLEND_ADDITIVE
220-
self._vao.render(self._light_program, mode=self.ctx.POINTS, vertices=len(self._lights))
238+
self._vao.render(
239+
self._light_program, mode=self.ctx.TRIANGLE_STRIP, instances=len(self._lights)
240+
)
221241
self.ctx.blend_func = self.ctx.BLEND_DEFAULT
222242

223243
# Combine pass

arcade/resources/system/shaders/lights/point_lights_fs.glsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#version 330
22

3-
43
out vec4 f_color;
4+
55
in vec2 uv;
66
in float attenuation;
77
in vec3 color;

arcade/resources/system/shaders/lights/point_lights_geo.glsl

Lines changed: 0 additions & 49 deletions
This file was deleted.
Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,28 @@
11
#version 330
22

3+
uniform WindowBlock {
4+
mat4 projection;
5+
mat4 view;
6+
} window;
7+
8+
uniform vec2 offset;
9+
310
in vec2 in_vert;
4-
in float in_radius;
5-
in float in_attenuation;
6-
in vec3 in_color;
11+
in vec2 in_uv;
12+
13+
in vec2 in_instance_position;
14+
in float in_instance_radius;
15+
in float in_instance_attenuation;
16+
in vec3 in_instance_color;
717

8-
out float vs_radius;
9-
out float vs_attenuation;
10-
out vec3 vs_color;
18+
out float attenuation;
19+
out vec3 color;
20+
out vec2 uv;
1121

1222
void main() {
13-
gl_Position = vec4(in_vert, 0.0, 1.0);
14-
vs_radius = in_radius;
15-
vs_attenuation = in_attenuation;
16-
vs_color = in_color / 255.0;
23+
vec2 position = (in_vert * in_instance_radius) + in_instance_position + offset;
24+
gl_Position = window.projection * window.view * vec4(position, 0.0, 1.0);
25+
uv = in_uv;
26+
attenuation = in_instance_attenuation;
27+
color = in_instance_color / 255.0;
1728
}

0 commit comments

Comments
 (0)