Fix a bug with glerminal_layer_scale that caused unintended behavior

This commit is contained in:
Shylie
2024-05-23 10:53:07 -04:00
parent c89563338a
commit 17ea6a7f0a
9 changed files with 164 additions and 55 deletions

View File

@@ -15,10 +15,9 @@ namespace glerminal
constexpr unsigned int SCREEN_WIDTH = 1280;
constexpr unsigned int SCREEN_HEIGHT = 800;
constexpr unsigned int CELL_SIZE = 8;
constexpr unsigned int CELL_SCALE = 4;
constexpr unsigned int LAYER_COUNT = 256;
constexpr unsigned int GRID_WIDTH = SCREEN_WIDTH / (CELL_SIZE * CELL_SCALE);
constexpr unsigned int GRID_HEIGHT = SCREEN_HEIGHT / (CELL_SIZE * CELL_SCALE);
constexpr unsigned int LAYER_COUNT = ::LAYER_COUNT;
constexpr unsigned int GRID_WIDTH = ::GRID_WIDTH;
constexpr unsigned int GRID_HEIGHT = ::GRID_HEIGHT;
constexpr unsigned int GRID_AREA = GRID_WIDTH * GRID_HEIGHT;
class glerminal

View File

@@ -6,6 +6,7 @@
#define GRID_SIZE_UNIFORM_NAME "grid_size"
#define SPRITES_UNIFORM_NAME "sprites"
#define LAYERS_UNIFORM_NAME "layers"
#define LAYER_COUNT_UNIFORM_NAME "layer_count"
namespace
{
@@ -30,6 +31,10 @@ namespace
"layout (location = 1) in vec2 offset;\n"
"layout (location = 2) in int sprite;\n"
"uniform vec4 " GRID_SIZE_UNIFORM_NAME ";\n"
"layout (std430, binding = 0) buffer LayerScales"
"{\n"
" float scales[];\n"
"} lss;\n"
"out VS_OUT {\n"
" flat vec2 offset;\n"
" flat int sprite;\n"
@@ -38,12 +43,13 @@ namespace
"} vs_out;\n"
"void main()\n"
"{\n"
" const int layer = int(floor(gl_InstanceID / " GRID_SIZE_UNIFORM_NAME ".y));\n"
" vs_out.sprite = sprite;\n"
" vs_out.offset = offset * " GRID_SIZE_UNIFORM_NAME ".zw;\n"
" vs_out.layer = int(floor(gl_InstanceID / 1000));\n"
" vs_out.layer = layer;\n"
" vs_out.texcoord = vec2(position.x + 1, -position.y);\n"
" vec2 cell_position = vec2(1 + (gl_InstanceID % 1000) - " GRID_SIZE_UNIFORM_NAME ".x * floor((gl_InstanceID % 1000) * " GRID_SIZE_UNIFORM_NAME ".z), -floor((gl_InstanceID % 1000) * " GRID_SIZE_UNIFORM_NAME ".z));\n"
" vec2 temp = vec2((position + cell_position) * " GRID_SIZE_UNIFORM_NAME ".zw * 2 + vec2(-1, 1));\n"
" vec2 cell_position = vec2(lss.scales[layer] + (gl_InstanceID % int(" GRID_SIZE_UNIFORM_NAME ".y)) - " GRID_SIZE_UNIFORM_NAME ".x * floor((gl_InstanceID % int(" GRID_SIZE_UNIFORM_NAME ".y)) * " GRID_SIZE_UNIFORM_NAME ".z), -floor((gl_InstanceID % int(" GRID_SIZE_UNIFORM_NAME ".y)) * " GRID_SIZE_UNIFORM_NAME ".z));\n"
" vec2 temp = ((position + vec2(-0.5, 0.5)) * lss.scales[layer] + cell_position + vec2(0.5, -0.5)) * " GRID_SIZE_UNIFORM_NAME ".zw * 2 + vec2(-1, 1);\n"
" gl_Position = vec4(temp.x, -temp.y, 0, 1);\n"
"}";
@@ -58,25 +64,21 @@ namespace
" vec2 texcoord;\n"
"} gs_in[];\n"
"flat out int sprite;\n"
"layout (std430, binding = 0) buffer LayerScales"
"{\n"
" float scales[];\n"
"} lss;\n"
"out vec2 texcoord;\n"
"void main()\n"
"{\n"
" gl_Layer = gs_in[0].layer;\n"
" gl_Position = vec4(gl_in[0].gl_Position.xy * lss.scales[gs_in[0].layer] + gs_in[0].offset, 0, 1);\n"
" gl_Position = vec4(gl_in[0].gl_Position.xy + gs_in[0].offset * 2, 0, 1);\n"
" sprite = gs_in[0].sprite;\n"
" texcoord = gs_in[0].texcoord;\n"
" EmitVertex();\n"
" gl_Layer = gs_in[1].layer;\n"
" gl_Position = vec4(gl_in[1].gl_Position.xy * lss.scales[gs_in[1].layer] + gs_in[1].offset, 0, 1);\n"
" gl_Position = vec4(gl_in[1].gl_Position.xy + gs_in[1].offset * 2, 0, 1);\n"
" sprite = gs_in[1].sprite;\n"
" texcoord = gs_in[1].texcoord;\n"
" EmitVertex();\n"
" gl_Layer = gs_in[2].layer;\n"
" gl_Position = vec4(gl_in[2].gl_Position.xy * lss.scales[gs_in[2].layer] + gs_in[2].offset, 0, 1);\n"
" gl_Position = vec4(gl_in[2].gl_Position.xy + gs_in[2].offset * 2, 0, 1);\n"
" sprite = gs_in[2].sprite;\n"
" texcoord = gs_in[2].texcoord;\n"
" EmitVertex();\n"
@@ -112,11 +114,12 @@ namespace
"{\n"
" vec4 colors[];\n"
"} lcs;\n"
"uniform int " LAYER_COUNT_UNIFORM_NAME ";\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
" vec3 current_color = vec3(0);\n"
" for (int i = 0; i < 256; i++)\n"
" for (int i = 0; i < " LAYER_COUNT_UNIFORM_NAME "; i++)\n"
" {\n"
" vec4 texsample = lcs.colors[i] * texture(" LAYERS_UNIFORM_NAME ", vec3(texcoord, i));\n"
" current_color = mix(current_color, texsample.rgb, texsample.a);\n"
@@ -199,7 +202,7 @@ namespace glerminal
update_layer_colors();
update_layer_scales();
glViewport(0, 0, GRID_WIDTH * CELL_SIZE, GRID_HEIGHT * CELL_SIZE);
glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
glUseProgram(m_program);
glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);
glBindVertexArray(m_vao);
@@ -511,7 +514,7 @@ namespace glerminal
m_screen_size_uniform_location = glGetUniformLocation(m_program, GRID_SIZE_UNIFORM_NAME);
glUseProgram(m_program);
glUniform4f(m_screen_size_uniform_location, GRID_WIDTH, GRID_HEIGHT, 1.0f / GRID_WIDTH, 1.0f / GRID_HEIGHT);
glUniform4f(m_screen_size_uniform_location, GRID_WIDTH, GRID_AREA, 1.0f / GRID_WIDTH, 1.0f / GRID_HEIGHT);
// compile
const unsigned int screen_vertex_shader = glCreateShader(GL_VERTEX_SHADER);
@@ -597,13 +600,15 @@ namespace glerminal
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, GRID_WIDTH * CELL_SIZE, GRID_HEIGHT * CELL_SIZE, LAYER_COUNT);
glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, SCREEN_WIDTH, SCREEN_HEIGHT, LAYER_COUNT);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_framebuffer_backing_texture, 0);
glBindTextureUnit(1, m_framebuffer_backing_texture);
// setup uniforms for screen shader
glUseProgram(m_screen_program);
glUniform1i(glGetUniformLocation(m_screen_program, LAYER_COUNT_UNIFORM_NAME), LAYER_COUNT);
}
void glerminal::deinit_glfw()