Vulkan API — урок 52. Координаты текстуры

Это будет коротенький, но важный урок перед завершением очередного этапа.

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

Добавим vec2 в структуру Vertex для координат текстуры. Убедитесь, что так же добавили новый элемент VkVertexInputAttributeDescription в массив. Теперь можно вводить координаты как входящий параметр в vertex shader. Это необходимо, для передачи их в fragment shader.

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

    static VkVertexInputBindingDescription getBindingDescription() {
        VkVertexInputBindingDescription bindingDescription = {};
        bindingDescription.binding = 0;
        bindingDescription.stride = sizeof(Vertex);
        bindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;

        return bindingDescription;
    }

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

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

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

        attributeDescriptions[2].binding = 0;
        attributeDescriptions[2].location = 2;
        attributeDescriptions[2].format = VK_FORMAT_R32G32_SFLOAT;
        attributeDescriptions[2].offset = offsetof(Vertex, texCoord);

        return attributeDescriptions;
    }
};

Данном случае используется вся площадь изображения, начиная от 0, 0 в левом верхнем углу и до 1, 1 в правом нижнем. Но можно использовать как часть площади изображения, так и выходить за её пределы (что будет при выходе за границы изображения мы обсуждали чуть ранее), кто знает, что может пригодиться в реальной программе.

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

Main Admin

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

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