Ver a proveniência

Use geomtry shader to render text

master
Bergmann89 há 5 anos
ascendente
cometimento
42399b6199
4 ficheiros alterados com 56 adições e 36 eliminações
  1. +38
    -0
      space-crush-app/resources/shader/text/geom.glsl
  2. +8
    -0
      space-crush-app/resources/shader/text/shared.glsl
  3. +6
    -30
      space-crush-app/resources/shader/text/vert.glsl
  4. +4
    -6
      space-crush-app/src/misc/text.rs

+ 38
- 0
space-crush-app/resources/shader/text/geom.glsl Ver ficheiro

@@ -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();
}

+ 8
- 0
space-crush-app/resources/shader/text/shared.glsl Ver ficheiro

@@ -2,3 +2,11 @@ struct FragmentData {
vec2 texCoords;
vec4 color;
};

struct VertexData {
vec2 posMin;
vec2 posMax;
vec2 texMin;
vec2 texMax;
vec4 color;
};

+ 6
- 30
space-crush-app/resources/shader/text/vert.glsl Ver ficheiro

@@ -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;
}

+ 4
- 6
space-crush-app/src/misc/text.rs Ver ficheiro

@@ -48,6 +48,7 @@ impl TextManager {
let vfs = world.resource::<Vfs>()?.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<S>(&mut self, mut index: usize, text: S) -> Result<&Self, Error>


Carregando…
Cancelar
Guardar