Я создал 8x8 пиксельные растровые буквы, чтобы визуализировать их с помощью OpenGL, но иногда, в зависимости от масштабирования, я получаю странные артефакты, как показано ниже на изображении. Фильтрация текстур устанавливается на ближайший пиксель. Это похоже на проблему округления, но как может быть, если линия абсолютно горизонтальная.Артефакты с текстурой рендеринга с горизонтальными и вертикальными линиями с OpenGL
левый оригинальный 8x8, средний масштабируется до 18x18, правильно масштабируется до 54x54.
Данные вершин являются беззнаковыми байтами в формате (x-offset, y-offset, letter). Вот полный код:
вершинные шейдеры:
#version 330 core
layout(location = 0) in uvec3 Data;
uniform float ratio;
uniform float font_size;
out float letter;
void main()
{
letter = Data.z;
vec2 position = vec2(float(Data.x)/ratio, Data.y) * font_size - 1.0f;
position.y = -position.y;
gl_Position = vec4(position, 0.0f, 1.0f);
}
геометрия шейдеры:
#version 330 core
layout (points) in;
layout (triangle_strip, max_vertices = 4) out;
uniform float ratio;
uniform float font_size;
out vec3 texture_coord;
in float letter[];
void main()
{
// TODO: pre-calculate
float width = font_size/ratio;
float height = -font_size;
texture_coord = vec3(0.0f, 0.0f, letter[0]);
gl_Position = gl_in[0].gl_Position + vec4(0.0f, height, 0.0f, 0.0f);
EmitVertex();
texture_coord = vec3(1.0f, 0.0f, letter[0]);
gl_Position = gl_in[0].gl_Position + vec4(width, height, 0.0f, 0.0f);
EmitVertex();
texture_coord = vec3(0.0f, 1.0f, letter[0]);
gl_Position = gl_in[0].gl_Position + vec4(0.0f, 0.0f, 0.0f, 0.0f);
EmitVertex();
texture_coord = vec3(1.0f, 1.0f, letter[0]);
gl_Position = gl_in[0].gl_Position + vec4(width, 0.0f, 0.0f, 0.0f);
EmitVertex();
EndPrimitive();
}
пиксельный шейдер:
#version 330 core
in vec3 texture_coord;
uniform sampler2DArray font_texture_array;
out vec4 output_color;
void main()
{
output_color = texture(font_texture_array, texture_coord);
}
Как это сделать? Пожалуйста, предоставьте код – pleluron