Vulkan API — урок 32. Данные вершин

В ближайших нескольких уроках мы избавимся от жестко заданных вершин в vertex shader. Начнем с простого создания буфера видимого CPU, и используя memcpy для копирования данных вершин непосредственно в него. После чего рассмотрим, как использовать промежуточный буфер для копирования данных вершин для поддержания высокой производительности.

Vertex shader

Для начала подкорректируем vertex shader так, что бы он более не нес данные вершин непосредственно в собственном коде, а принимал их из буфера вершин используя ключевое слово.

#version 450
#extension GL_ARB_separate_shader_objects : enable

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

layout(location = 0) out vec3 fragColor;

out gl_PerVertex {
    vec4 gl_Position;
};

void main() {
    gl_Position = vec4(inPosition, 0.0, 1.0);
    fragColor = inColor;
}

Переменные inPosition и inColor vertex attributes – атрибуты вершин, свойства, описанные в vertex buffer и описывающие каждую вершину, так же как ранее мы описывали положение и цвет каждой вершины в двух массивах. Не забудьте перекомпилировать шейдер!

Данные вершин

Переместим данные вершин из кода шейдера в массив в коде программы. Для этого подключим библиотеку GLM, которая позволит нам работать с линейной алгеброй и такими типами, как вектора и матрицы. Мы будем использовать эти типы для определения позиций и цвета векторов.

#include <glm/glm.hpp>

Создадим новую структуру Vertex, имеющую два атрибута, и которую мы будем использовать в vertex shader.

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

GLM обеспечивает нас типами С++, которые в точности совпадают с типами векторов, используемых на языке шейдеров.

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

Теперь используем структуру Vertex, для определения массива данных вершин. Использованы те же позиции и цвета, что и ранее, но теперь они они объеденены в один массив вершин. Это так же зовется interleaving vertex attributes ~ чередование атрибутов вершин.

Main Admin

4 Comments

  1. Интересно, почему нельзя нарисовать в это шейдере четырехуголшьник просто заменив массив на
    vec2 positions[4] = vec2[](
    vec2(-0.5, -0.5),
    vec2(0.5, -0.5),
    vec2(0.5, 0.5),
    vec2(-0.5, 0.5)
    );

    Потому что этот шейдер может рисовать только треугольники и ничего больше?

    • Кроме треугольника можно еще использовать линию и точку, а больше да, ничего.

  2. Не туда написал, извиняюсь, это надо было в самый первый урок про шейдеры.

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

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