From 42399b619919488e906cfe5480a5dc72830f9c5f Mon Sep 17 00:00:00 2001 From: Bergmann89 Date: Wed, 23 Dec 2020 16:57:51 +0100 Subject: [PATCH] Use geomtry shader to render text --- .../resources/shader/text/geom.glsl | 38 +++++++++++++++++++ .../resources/shader/text/shared.glsl | 8 ++++ .../resources/shader/text/vert.glsl | 36 +++--------------- space-crush-app/src/misc/text.rs | 10 ++--- 4 files changed, 56 insertions(+), 36 deletions(-) create mode 100644 space-crush-app/resources/shader/text/geom.glsl diff --git a/space-crush-app/resources/shader/text/geom.glsl b/space-crush-app/resources/shader/text/geom.glsl new file mode 100644 index 0000000..69fae44 --- /dev/null +++ b/space-crush-app/resources/shader/text/geom.glsl @@ -0,0 +1,38 @@ +#version 450 core + +#pragma include ./shared.glsl + +in VertexData vertexData[]; + +layout (points) in; +layout (triangle_strip, max_vertices = 4) out; + +layout (location = 2) uniform vec2 uOffset; + +out FragmentData fragmentData; + +void main() { + VertexData d = vertexData[0]; + + gl_Position = vec4(vec2(d.posMin.x, d.posMax.y), 0.0, 1.0); + fragmentData.texCoords = vec2(d.texMin.x, d.texMax.y); + fragmentData.color = d.color; + EmitVertex(); + + gl_Position = vec4(vec2(d.posMin.x, d.posMin.y), 0.0, 1.0); + fragmentData.texCoords = vec2(d.texMin.x, d.texMin.y); + fragmentData.color = d.color; + EmitVertex(); + + gl_Position = vec4(vec2(d.posMax.x, d.posMax.y), 0.0, 1.0); + fragmentData.texCoords = vec2(d.texMax.x, d.texMax.y); + fragmentData.color = d.color; + EmitVertex(); + + gl_Position = vec4(vec2(d.posMax.x, d.posMin.y), 0.0, 1.0); + fragmentData.texCoords = vec2(d.texMax.x, d.texMin.y); + fragmentData.color = d.color; + EmitVertex(); + + EndPrimitive(); +} diff --git a/space-crush-app/resources/shader/text/shared.glsl b/space-crush-app/resources/shader/text/shared.glsl index f407457..e23627a 100644 --- a/space-crush-app/resources/shader/text/shared.glsl +++ b/space-crush-app/resources/shader/text/shared.glsl @@ -2,3 +2,11 @@ struct FragmentData { vec2 texCoords; vec4 color; }; + +struct VertexData { + vec2 posMin; + vec2 posMax; + vec2 texMin; + vec2 texMax; + vec4 color; +}; diff --git a/space-crush-app/resources/shader/text/vert.glsl b/space-crush-app/resources/shader/text/vert.glsl index ebab05d..1e51708 100644 --- a/space-crush-app/resources/shader/text/vert.glsl +++ b/space-crush-app/resources/shader/text/vert.glsl @@ -11,34 +11,9 @@ layout (location = 4) in vec4 inColor; layout (location = 2) uniform vec2 uOffset; -out FragmentData fragmentData; +out VertexData vertexData; void main() { - vec2 position = vec2(0.0); - vec2 texCoords = vec2(0.0); - - switch (gl_VertexID) { - case 0: - position = vec2(inPosMin.x, inPosMax.y); - texCoords = vec2(inTexMin.x, inTexMax.y); - break; - - case 1: - position = vec2(inPosMin.x, inPosMin.y); - texCoords = vec2(inTexMin.x, inTexMin.y); - break; - - case 2: - position = vec2(inPosMax.x, inPosMax.y); - texCoords = vec2(inTexMax.x, inTexMax.y); - break; - - case 3: - position = vec2(inPosMax.x, inPosMin.y); - texCoords = vec2(inTexMax.x, inTexMin.y); - break; - } - mat4 ortho = mat4( vec4(2.0 / uCamera.size.x, 0.0, 0.0, 0.0), vec4(0.0, -2.0 / uCamera.size.y, 0.0, 0.0), @@ -46,8 +21,9 @@ void main() { vec4(-1.0, 1.0, 1.0, 1.0) ); - gl_Position = ortho * vec4(position + uOffset, 0.0, 1.0); - - fragmentData.texCoords = texCoords; - fragmentData.color = inColor; + vertexData.posMin = (ortho * vec4(inPosMin + uOffset, 0.0, 1.0)).xy; + vertexData.posMax = (ortho * vec4(inPosMax + uOffset, 0.0, 1.0)).xy; + vertexData.texMin = inTexMin; + vertexData.texMax = inTexMax; + vertexData.color = inColor; } diff --git a/space-crush-app/src/misc/text.rs b/space-crush-app/src/misc/text.rs index 0093e87..1a3431e 100644 --- a/space-crush-app/src/misc/text.rs +++ b/space-crush-app/src/misc/text.rs @@ -48,6 +48,7 @@ impl TextManager { let vfs = world.resource::()?.deref().clone(); let program = world.load_program(vec![ (Type::Vertex, "resources/shader/text/vert.glsl"), + (Type::Geometry, "resources/shader/text/geom.glsl"), (Type::Fragment, "resources/shader/text/frag.glsl"), ])?; let program = Rc::new(program); @@ -595,15 +596,10 @@ impl Text { let array = VertexArray::builder() .bind_buffer(buffer) .vertex_attrib_pointer(0, 2, DataType::Float, false, STRIDE, OFFSET_POS_MIN)? - .vertex_attrib_divisor(1)? .vertex_attrib_pointer(1, 2, DataType::Float, false, STRIDE, OFFSET_POS_MAX)? - .vertex_attrib_divisor(1)? .vertex_attrib_pointer(2, 2, DataType::Float, false, STRIDE, OFFSET_TEX_MIN)? - .vertex_attrib_divisor(1)? .vertex_attrib_pointer(3, 2, DataType::Float, false, STRIDE, OFFSET_TEX_MAX)? - .vertex_attrib_divisor(1)? .vertex_attrib_pointer(4, 4, DataType::Float, false, STRIDE, OFFSET_COLOR)? - .vertex_attrib_divisor(1)? .build()?; let cache = cache.clone(); @@ -647,7 +643,9 @@ impl Text { .uniform(2, Uniform::Vector2f(pos)) .warn("Unable to update text offset"); - gl::draw_arrays_instanced(gl::TRIANGLE_STRIP, 0, 4, inner.vertex_count as _); + // gl::draw_arrays(gl::POINTS, 0, inner.vertex_count as _); + gl::draw_arrays(gl::POINTS, 0, inner.vertex_count as _); + // gl::draw_arrays_instanced(gl::POINTS, 0, 1, inner.vertex_count as _); } pub fn update(&mut self, mut index: usize, text: S) -> Result<&Self, Error>