Kajetan Johannes Hammerle 3 дней назад
Родитель
Сommit
64405091a4
1 измененных файлов с 16 добавлено и 8 удалено
  1. 16 8
      src/Window.c

+ 16 - 8
src/Window.c

@@ -56,15 +56,12 @@ static constexpr size_t BUTTONS = sizeof(buttons) / sizeof(ButtonData);
 static const GLchar* VERTEX_SHADER_CODE =
     "#version 430\n"
     "layout (location = 0) in vec2 pos;\n"
-    "uniform vec2 size;\n"
+    "uniform vec2 offset;\n"
+    "uniform vec2 factor;\n"
     "out vec2 tex;\n"
     "void main(void) {\n"
     "    tex = pos;\n"
-    "    vec2 w = vec2(" STR(WIDTH) ", " STR(HEIGHT) ");\n"
-    "    ivec2 f = ivec2(size / w);\n"
-    "    f = ivec2(min(f.x, f.y), min(f.x, f.y));\n"
-    "    vec2 f2 = (f * w) / size;\n"
-    "    gl_Position = vec4(pos * f2, 0.0, 1.0);\n"
+    "    gl_Position = vec4(pos * factor - offset, 0.0, 1.0);\n"
     "}\n";
 // clang-format on
 
@@ -253,8 +250,19 @@ void windowNextFrame() {
         texture, 0, 0, 0, WIDTH, HEIGHT, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1,
         pixels);
 
-    GLint size = glGetUniformLocation(program, "size");
-    glUniform2f(size, (float)width, (float)height);
+    int factorX = width / WIDTH;
+    int factorY = height / HEIGHT;
+    int factor = factorX < factorY ? factorX : factorY;
+    float sizeX = (float)(factor * WIDTH) / (float)width;
+    float sizeY = (float)(factor * HEIGHT) / (float)height;
+    float offsetX = (width & 1) ? 1.0f / (float)width : 0.0f;
+    float offsetY = (height & 1) ? 1.0f / (float)height : 0.0f;
+
+    GLint factorLoc = glGetUniformLocation(program, "factor");
+    glUniform2f(factorLoc, sizeX, sizeY);
+
+    GLint offsetLoc = glGetUniformLocation(program, "offset");
+    glUniform2f(offsetLoc, offsetX, offsetY);
 
     glBindBuffer(GL_ARRAY_BUFFER, vbo);
     glBindVertexArray(vba);