From 4939fd70682a2c28ac28be54f81a95eac96e3d3a Mon Sep 17 00:00:00 2001 From: Alessandro Mauri Date: Wed, 22 Feb 2023 21:39:29 +0100 Subject: [PATCH] testo nero --- text_rendering/atlas.png | Bin 5011 -> 9974 bytes text_rendering/font_fragshader.glsl | 15 +++-- text_rendering/font_vertshader.glsl | 17 +++-- text_rendering/main.c | 2 +- text_rendering/ren.c | 96 ++++++++++++++++++++-------- text_rendering/test | Bin 278056 -> 289224 bytes 6 files changed, 90 insertions(+), 40 deletions(-) diff --git a/text_rendering/atlas.png b/text_rendering/atlas.png index a0cfd306d6859efecca1222a4a242e2514de944a..496c515559e15cb923a78daf0beb5677fd22ded4 100644 GIT binary patch literal 9974 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 delta 4499 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 diff --git a/text_rendering/font_fragshader.glsl b/text_rendering/font_fragshader.glsl index 51ba398..1230f6f 100644 --- a/text_rendering/font_fragshader.glsl +++ b/text_rendering/font_fragshader.glsl @@ -1,14 +1,15 @@ -#version 330 +#version 330 core // viewsize.x = viewport width in pixels; viewsize.y = viewport height in pixels -uniform vec2 viewsize; -// texture uv coordinate in texture space -in vec2 texture_coord; -uniform sampler2D texture_sampler; +uniform ivec2 viewsize; +uniform ivec2 texturesize; -out vec4 color; +// texture uv coordinate in texture space +in vec2 uv; +uniform sampler2D ts; void main() { - color = mix(vec4(0.0f,0.0f,0.0f,1.0f), vec4(1.0f,1.0f,1.0f,1.0f), texture(texture_sampler, texture_coord)) + vec4(1.0f,0.0f,0.0f,1.0f); + //gl_FragColor = vec4(1.0f,0.0f,0.0f,1.0f); + gl_FragColor = texture(ts, uv); } diff --git a/text_rendering/font_vertshader.glsl b/text_rendering/font_vertshader.glsl index 240063f..e18ab9a 100644 --- a/text_rendering/font_vertshader.glsl +++ b/text_rendering/font_vertshader.glsl @@ -1,20 +1,23 @@ #version 330 core // viewsize.x = viewport width in pixels; viewsize.y = viewport height in pixels -uniform vec2 viewsize; +uniform ivec2 viewsize; +uniform ivec2 texturesize; -// both position and and uv are in pixels +// both position and and uv are in pixels, they where converted to floats when +// passed to the shader layout(location = 0) in vec2 position; -layout(location = 1) in vec2 uv; +layout(location = 1) in vec2 txcoord; -out vec2 texture_coord; +out vec2 uv; void main() { vec4 pos = vec4(position.x, position.y, 0.0f, 1.0f); - vec2 v = viewsize / 2; - pos.xy = (pos.xy - v) / v; + vec2 hsize = vec2(float(viewsize.x)/2.0f, float(viewsize.y)/2.0f); + + pos.xy = (pos.xy - hsize) / hsize; gl_Position = pos; - texture_coord = uv / viewsize; + uv = txcoord / float(texturesize); } diff --git a/text_rendering/main.c b/text_rendering/main.c index 13130e9..56a7fc0 100644 --- a/text_rendering/main.c +++ b/text_rendering/main.c @@ -21,7 +21,7 @@ int main(void) return 1; } - ren_render_text("ciao mamma", 100, 100, 100, 100, 12); + ren_render_text("ciao mamma", 0, 0, 100, 100, 12); SDL_GL_SwapWindow(win); SDL_Event e; diff --git a/text_rendering/ren.c b/text_rendering/ren.c index f6cc19c..1e5d957 100644 --- a/text_rendering/ren.c +++ b/text_rendering/ren.c @@ -46,6 +46,16 @@ const char * ren_err_msg[] = { [REN_UNIFORM] = "Failed to get uniform location", }; + +#define ELEM(x) [x] = #x, +const char *glerr[] = { + ELEM(GL_INVALID_ENUM) + ELEM(GL_INVALID_VALUE) + ELEM(GL_INVALID_OPERATION) +}; +#undef ELEM + + // different stacks #include "stack.h" STACK_DECL(vtstack, struct v_text) @@ -60,8 +70,11 @@ struct { GLuint box_prog; GLuint font_buffer; GLint viewsize_loc; + GLint texturesize_loc; struct vtstack font_stack; struct vcstack box_stack; + int width, height; + int s_x, s_y, s_w, s_h; } ren = {0}; @@ -292,7 +305,7 @@ int ren_init(SDL_Window *w) ren.font = font_init(); if (!ren.font) REN_RET(-1, REN_FONT) - if (font_load(ren.font, FONT_PATH, 12)) REN_RET(-1, REN_FONT) + if (font_load(ren.font, FONT_PATH, 20)) REN_RET(-1, REN_FONT) font_dump(ren.font, "./atlas.png"); ren.font_texture = ren_texturer_2d( @@ -311,29 +324,12 @@ int ren_init(SDL_Window *w) // generate the font buffer object glGenBuffers(1, &ren.font_buffer); if (!ren.font_buffer) REN_RET(-1, REN_BUFFER) - glBindBuffer(GL_ARRAY_BUFFER, ren.font_buffer); - glEnableVertexAttribArray(REN_VERTEX_IDX); - glVertexAttribPointer( - REN_VERTEX_IDX, - 2, - GL_INT, - GL_FALSE, - sizeof(struct v_text), - 0); - glEnableVertexAttribArray(REN_UV_IDX); - glVertexAttribPointer( - REN_UV_IDX, - 2, - GL_INT, - GL_FALSE, - sizeof(struct v_text), - (void*)sizeof(vec2_i)); - - glBindBuffer(GL_ARRAY_BUFFER, 0); // create the uniforms ren.viewsize_loc = glGetUniformLocation(ren.font_prog, "viewsize"); if (ren.viewsize_loc == -1) REN_RET(-1, REN_UNIFORM) + ren.texturesize_loc = glGetUniformLocation(ren.font_prog, "texturesize"); + if (ren.texturesize_loc == -1) REN_RET(-1, REN_UNIFORM) int width, height; SDL_GetWindowSize(w, &width, &height); @@ -344,12 +340,38 @@ int ren_init(SDL_Window *w) return 0; } - +#define GLERR() {int a = glGetError(); if (a != GL_NO_ERROR) printf("glError: %d %s\n", a, glerr[a]);} static int ren_draw_font_stack(void) { glUseProgram(ren.font_prog); glBindBuffer(GL_ARRAY_BUFFER, ren.font_buffer); + glViewport(0, 0, ren.width, ren.height); + glScissor(ren.s_x, ren.s_y, ren.s_w, ren.s_h); + glUniform2i(ren.viewsize_loc, ren.width, ren.height); + glUniform2i(ren.texturesize_loc, ren.font->width, ren.font->height); + GLERR(); + + glEnableVertexAttribArray(REN_VERTEX_IDX); + glEnableVertexAttribArray(REN_UV_IDX); + // when passing ints to glVertexAttribPointer they are automatically + // converted to floats + glVertexAttribPointer( + REN_VERTEX_IDX, + 2, + GL_INT, + GL_FALSE, + sizeof(struct v_text), + 0); + GLERR(); + glVertexAttribPointer( + REN_UV_IDX, + 2, + GL_INT, + GL_FALSE, + sizeof(struct v_text), + (void*)sizeof(vec2_i)); + GLERR(); // TODO: implement size and damage tracking on stacks glBufferData( GL_ARRAY_BUFFER, @@ -357,7 +379,10 @@ static int ren_draw_font_stack(void) ren.font_stack.items, GL_DYNAMIC_DRAW); glDrawArrays(GL_TRIANGLES, 0, ren.font_stack.idx); + GLERR(); + glDisableVertexAttribArray(REN_VERTEX_IDX); + glDisableVertexAttribArray(REN_UV_IDX); glBindBuffer(GL_ARRAY_BUFFER, 0); glUseProgram(0); return 0; @@ -366,12 +391,24 @@ static int ren_draw_font_stack(void) int ren_update_viewport(int w, int h) { - glViewport(0, 0, w, h); - glUniform2i(ren.viewsize_loc, w, h); + ren.width = w; + ren.height = h; return 0; } +// TODO: add a scissor array in order to do less render calls +int ren_set_scissor(int x, int y, int w, int h) +{ + ren.s_x = x; + ren.s_y = y; + ren.s_w = w; + ren.s_h = h; + return 0; +} + + + // TODO: implement font size int ren_render_text(const char *str, int x, int y, int w, int h, int size) { @@ -420,15 +457,24 @@ int ren_render_text(const char *str, int x, int y, int w, int h, int size) .uv = { .u = g->u+g->w, .v = g->v }, }; vtstack_push(&ren.font_stack, &v); + vtstack_push(&ren.font_stack, &v); // x4,y4 v = (struct v_text){ .pos = { .x = gx+g->x, .y = gy+g->y }, .uv = { .u = g->u, .v = g->v }, }; vtstack_push(&ren.font_stack, &v); + // x1,y1 + v = (struct v_text){ + .pos = { .x = gx+g->x, .y = gy+g->y+g->h }, + .uv = { .u = g->u, .v = g->v+g->h }, + }; + vtstack_push(&ren.font_stack, &v); // TODO: possible kerning needs to be applied here - gx += g->w + g->a; + // FIXME: advance is too large + //gx += g->w + g->a; + gx += g->w + g->x + 1; if (cp == '\n') gy += ren.font->glyph_max_h; // TODO: encode and/or store line height @@ -436,7 +482,7 @@ int ren_render_text(const char *str, int x, int y, int w, int h, int size) // FIXME: here we are doing one draw call for string of text which is // inefficient but is simpler and allows for individual scissors - glScissor(x, y, w, h); + ren_set_scissor(x, y, w, h); ren_draw_font_stack(); vtstack_clear(&ren.font_stack); diff --git a/text_rendering/test b/text_rendering/test index 484c873e031081f5a46c63dac4b1eea6048c2dfb..585c5e62e0a95e91d2816be7e727af3253363093 100755 GIT binary patch delta 29999 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 z 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