diff --git a/arcade/future/light/lights.py b/arcade/future/light/lights.py index 916af693c8..cc2e7f5531 100644 --- a/arcade/future/light/lights.py +++ b/arcade/future/light/lights.py @@ -97,18 +97,36 @@ def __init__(self, width: int, height: int): self._rebuild = False self._stride = 28 self._buffer = self.ctx.buffer(reserve=self._stride * 100) + # fmt: off + vertex_data = array('f', [ + -1.0, +1.0, 0.0, 1.0, + -1.0, -1.0, 0.0, 0.0, + +1.0, +1.0, 1.0, 1.0, + +1.0, -1.0, 1.0, 0.0, + ]) + # fmt: on self._vao = self.ctx.geometry( [ + gl.BufferDescription( + self.ctx.buffer(data=vertex_data), + "2f 2f", + ["in_vert", "in_uv"], + ), gl.BufferDescription( self._buffer, "2f 1f 1f 3f", - ["in_vert", "in_radius", "in_attenuation", "in_color"], + [ + "in_instance_position", + "in_instance_radius", + "in_instance_attenuation", + "in_instance_color", + ], + instanced=True, ), ] ) self._light_program = self.ctx.load_program( vertex_shader=":system:shaders/lights/point_lights_vs.glsl", - geometry_shader=":system:shaders/lights/point_lights_geo.glsl", fragment_shader=":system:shaders/lights/point_lights_fs.glsl", ) self._combine_program = self.ctx.load_program( @@ -214,10 +232,12 @@ def draw( self._light_buffer.use() self._light_buffer.clear() if len(self._lights) > 0: - self._light_program["position"] = position + self._light_program["offset"] = position self.ctx.enable(self.ctx.BLEND) self.ctx.blend_func = self.ctx.BLEND_ADDITIVE - self._vao.render(self._light_program, mode=self.ctx.POINTS, vertices=len(self._lights)) + self._vao.render( + self._light_program, mode=self.ctx.TRIANGLE_STRIP, instances=len(self._lights) + ) self.ctx.blend_func = self.ctx.BLEND_DEFAULT # Combine pass diff --git a/arcade/resources/system/shaders/lights/point_lights_fs.glsl b/arcade/resources/system/shaders/lights/point_lights_fs.glsl index fe6897a338..10b03e13f4 100644 --- a/arcade/resources/system/shaders/lights/point_lights_fs.glsl +++ b/arcade/resources/system/shaders/lights/point_lights_fs.glsl @@ -1,7 +1,7 @@ #version 330 - out vec4 f_color; + in vec2 uv; in float attenuation; in vec3 color; diff --git a/arcade/resources/system/shaders/lights/point_lights_geo.glsl b/arcade/resources/system/shaders/lights/point_lights_geo.glsl deleted file mode 100644 index cdfcb463d3..0000000000 --- a/arcade/resources/system/shaders/lights/point_lights_geo.glsl +++ /dev/null @@ -1,49 +0,0 @@ -#version 330 -layout (points) in; -layout (triangle_strip, max_vertices = 4) out; - -uniform WindowBlock { - mat4 projection; - mat4 view; -} window; - -uniform vec2 position; - -in float vs_radius[]; -in float vs_attenuation[]; -in vec3 vs_color[]; - -out vec2 uv; -out float attenuation; -out vec3 color; - -void main() { - vec2 center = gl_in[0].gl_Position.xy; - float radius = vs_radius[0]; - - gl_Position = window.projection * window.view * vec4(center + vec2(-radius, radius) + position, 0.0, 1.0); - uv = vec2(0.0, 1.0); - attenuation = vs_attenuation[0]; - color = vs_color[0]; - EmitVertex(); - - gl_Position = window.projection * window.view * vec4(center + vec2(-radius, -radius) + position, 0.0, 1.0); - uv = vec2(0.0, 0.0); - attenuation = vs_attenuation[0]; - color = vs_color[0]; - EmitVertex(); - - gl_Position = window.projection * window.view * vec4(center + vec2(radius, radius) + position, 0.0, 1.0); - uv = vec2(1.0, 1.0); - attenuation = vs_attenuation[0]; - color = vs_color[0]; - EmitVertex(); - - gl_Position = window.projection * window.view * vec4(center + vec2(radius, -radius) + position, 0.0, 1.0); - uv = vec2(1.0, 0.0); - attenuation = vs_attenuation[0]; - color = vs_color[0]; - EmitVertex(); - - EndPrimitive(); -} diff --git a/arcade/resources/system/shaders/lights/point_lights_vs.glsl b/arcade/resources/system/shaders/lights/point_lights_vs.glsl index 70847946d7..d5a4dbf6a4 100644 --- a/arcade/resources/system/shaders/lights/point_lights_vs.glsl +++ b/arcade/resources/system/shaders/lights/point_lights_vs.glsl @@ -1,17 +1,28 @@ #version 330 +uniform WindowBlock { + mat4 projection; + mat4 view; +} window; + +uniform vec2 offset; + in vec2 in_vert; -in float in_radius; -in float in_attenuation; -in vec3 in_color; +in vec2 in_uv; + +in vec2 in_instance_position; +in float in_instance_radius; +in float in_instance_attenuation; +in vec3 in_instance_color; -out float vs_radius; -out float vs_attenuation; -out vec3 vs_color; +out float attenuation; +out vec3 color; +out vec2 uv; void main() { - gl_Position = vec4(in_vert, 0.0, 1.0); - vs_radius = in_radius; - vs_attenuation = in_attenuation; - vs_color = in_color / 255.0; + vec2 position = (in_vert * in_instance_radius) + in_instance_position + offset; + gl_Position = window.projection * window.view * vec4(position, 0.0, 1.0); + uv = in_uv; + attenuation = in_instance_attenuation; + color = in_instance_color / 255.0; }