Vulkan API — урок 53. Наложение текстур (+ листинг)

И последний шаг — доработать шейдеры, для получения цветов из текстуры. Для начала изменим vertex shader, для того, что бы он пропускал через себя координаты для fragment shader:

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

layout(location = 0) out vec3 fragColor;
layout(location = 1) out vec2 fragTexCoord;

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

Аналогично цветам привязанным к вершинам, значения fragTexCoord будут плавно интерполированы по всей площади квадрата используя растеризацию. Это можно продемонстрировать, просто используя координаты в качестве цвета (две координаты = два цвета (R,G), для B просто поставим оставим 0.0)

#version 450
#extension GL_ARB_separate_shader_objects : enable

layout(location = 0) in vec3 fragColor;
layout(location = 1) in vec2 fragTexCoord;

layout(location = 0) out vec4 outColor;

void main() {
    outColor = vec4(fragTexCoord, 0.0, 1.0);
}

В результате получим примерно следующее:

Зеленый канал равномерно старается все заполнить по горизонтали, красный по вертикали. Черны и желты это соответственно смешение от 0, 0 до 1, 1. Подобного рода вывод цветов очень удобно использовать в качестве аналога printf для дебага шейдеров.

Ну а теперь к самой текстуре. Добавим ссылку на неё в шейдер:

layout(binding = 1) uniform sampler2D texSampler;

Так же возможно использовать  sampler1D и sampler3D, для других типов изображений. Теперь доработаем метод main. Текстуры отбираются при помощи встроенной функции texture. Она принимает sampler и координату в качестве параметров, а sampler уже в свою очередь позаботится о фильтрации и изменениях.

void main() {
    outColor = texture(texSampler, fragTexCoord);
}

Теперь можно увидеть текстуру как таковую:

Так же можно попробовать выйти за границы изображения. Ране использовался вариант VK_SAMPLER_ADDRESS_MODE_REPEAT, вот к чему это суммарно приведет:

void main() {
    outColor = texture(texSampler, fragTexCoord * 2.0);
}

Вы так же можете манипулировать цветами используя цвета вершин:

void main() {
    outColor = vec4(fragColor * texture(texSampler, fragTexCoord).rgb, 1.0);
}

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

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

И листинг.

Main Admin

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

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