Геометрический шейдер Vulkan 2D сгенерировал геометрические линии, демонстрирующие форму парралеллограммы.

Я пытаюсь добавить поддержку геометрических шейдеров для проекта Vulkan, поэтому пока начинаю с чего-то простого.

Цель состоит в том, чтобы, имея список вершин, создать идеальный прямоугольник, охватывающий эту линию.

Для этого эффекта я сделал этот геометрический шейдер:

#version 450
#extension GL_ARB_separate_shader_objects : enable

layout(lines) in;
layout(triangle_strip, max_vertices = 6) out;

layout(location = 0) in vec2 fragCoord[];

layout(location = 0) out vec2 fragTexCoord;

void main() {
    vec2 p1 = gl_in[0].gl_Position.xy;
    vec2 p2 = gl_in[1].gl_Position.xy;
    vec2 tangent = normalize(p2 - p1);
    vec2 normal = vec2(tangent.y, -tangent.x) * 0.05;

    vec2 quad[4] = vec2[](p1 + normal, p1 - normal, p2 + normal, p2 - normal);

    // Create first triangle
    gl_Position = vec4(quad[0], 0, 1);
    EmitVertex();
    gl_Position = vec4(quad[1], 0, 1);
    EmitVertex();
    gl_Position = vec4(quad[2], 0, 1);
    EmitVertex();
    EndPrimitive();

    // Create second triangle
    gl_Position = vec4(quad[1], 0, 1);
    EmitVertex();
    gl_Position = vec4(quad[2], 0, 1);
    EmitVertex();
    gl_Position = vec4(quad[3], 0, 1);
    EmitVertex();
    EndPrimitive();
}

Что выводит: введите здесь описание изображения

Вершинный шейдер это:

#version 450
#extension GL_ARB_separate_shader_objects : enable

layout(location = 0) in vec3 inPosition;
layout(location = 1) in vec2 inTexCoord;

layout(location = 0) out vec2 fragTexCoord;

void main() {

    gl_Position = vec4(inPosition, 1.0);
    fragTexCoord = inTexCoord;
}

Я не уверен, почему линии представляют собой параллелограммы, а не прямоугольники. Добавление нормали к линии (ортогональное направление) к обеим вершинам линии должно по определению создать прямоугольник.

Редактировать:

Даже жесткое кодирование вершин в вершинном шейдере, по-видимому, дает тот же результат:

vec4 verts[2] = vec4[](vec4(-0.5,-0.5,0,1), vec4(0.5,0.5,0,1));
void main() {
    gl_Position = verts[gl_VertexID];//vec4(inPosition, 1.0);
    fragTexCoord = inTexCoord;
}

person Makogan    schedule 22.10.2019    source источник


Ответы (1)


Я сделал глупую ошибку, так как координаты рассчитываются на НОРМАЛИЗОВАННОМ пространстве GL, но окно не квадратное, мое пространство растянуто, отклоняясь от топологии. Это результат идеально квадратного изображения:

введите здесь описание изображения

Чтобы исправить эту ошибку, я должен передать информацию о соотношении сторон шейдеру и соответствующим образом скорректировать положение вершин.

person Makogan    schedule 22.10.2019