Vulkan API — урок 54. Третья координата.

Перед тем как загружать модели, давайте определимся с третьей координатой, т.к. ранее её мы не использовали.

Изменим структуру Vertex для использования 3D векторов при позиционировании и обновим format в соответствующем VkVertexInputAttributeDescription:

struct Vertex {
    glm::vec3 pos;
    glm::vec3 color;
    glm::vec2 texCoord;

    ...

    static std::array<VkVertexInputAttributeDescription, 3> getAttributeDescriptions() {
        std::array<VkVertexInputAttributeDescription, 3> attributeDescriptions = {};

        attributeDescriptions[0].binding = 0;
        attributeDescriptions[0].location = 0;
        attributeDescriptions[0].format = VK_FORMAT_R32G32B32_SFLOAT;
        attributeDescriptions[0].offset = offsetof(Vertex, pos);

        ...
    }
};

Далее обновим vertex shader, что бы он принимал 3D координаты. Не забудьте перекомпилить!

layout(location = 0) in vec3 inPosition;

...

void main() {
    gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 1.0);
    fragColor = inColor;
    fragTexCoord = inTexCoord;
}

И допишем координаты вершин соответственно:

const std::vector vertices = {
    {{-0.5f, -0.5f, 0.0f}, {1.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
    {{0.5f, -0.5f, 0.0f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.0f}},
    {{0.5f, 0.5f, 0.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}},
    {{-0.5f, 0.5f, 0.0f}, {1.0f, 1.0f, 1.0f}, {0.0f, 1.0f}}
};

Как можно было догадаться – визуально ничего не поменялось. Так что пришло время добавить дополнительную фигуру. что бы сделать сцену более наглядной. Продублируем вершины, но установим их чуть ниже существующих примерно таким образом:

Для этого для Z координаты устанавливаем значение -0.5f и добавляем соответствующие индексы для новой фигуры:

const std::vector vertices = {
    {{-0.5f, -0.5f, 0.0f}, {1.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
    {{0.5f, -0.5f, 0.0f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.0f}},
    {{0.5f, 0.5f, 0.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}},
    {{-0.5f, 0.5f, 0.0f}, {1.0f, 1.0f, 1.0f}, {0.0f, 1.0f}},

    {{-0.5f, -0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
    {{0.5f, -0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.0f}},
    {{0.5f, 0.5f, -0.5f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}},
    {{-0.5f, 0.5f, -0.5f}, {1.0f, 1.0f, 1.0f}, {0.0f, 1.0f}}
};

const std::vector indices = {
    0, 1, 2, 2, 3, 0,
    4, 5, 6, 6, 7, 4
};

Теперь можно запустить программу и увидеть примерно следующее:

Проблема в том, что фрагменты нижнего квадрата рисуются над фрагментами верхнего просто потому, что он находится позже в массиве. Есть два способа решить эту проблему:

  • Подавать вершины в соответствующем порядке – от глубинных до верхних
  • Использовать тестирование глубины с буфером глубины (для аналогов можно так же встретить термин «Z-буферизация»).

О них в следующем уроке.

Main Admin

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *