Vulkan: поддержка альфа-канала для спрайтов

Я пытаюсь нарисовать несколько спрайтов с учетом альфа-канала изображения.

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

vk::PipelineColorBlendAttachmentState colorBlendAttachment; 
colorBlendAttachment.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA;
colorBlendAttachment.blendEnable    = VK_TRUE;
colorBlendAttachment.srcColorBlendFactor = vk::BlendFactor::eOne;
colorBlendAttachment.dstColorBlendFactor = vk::BlendFactor::eZero;
colorBlendAttachment.colorBlendOp        = vk::BlendOp::eAdd;   
colorBlendAttachment.srcAlphaBlendFactor = vk::BlendFactor::eOne;
colorBlendAttachment.dstAlphaBlendFactor = vk::BlendFactor::eZero;  
colorBlendAttachment.alphaBlendOp        = vk::BlendOp::eSubtract;


vk::PipelineColorBlendStateCreateInfo colorBlending;    
colorBlending.logicOpEnable     = VK_FALSE;
colorBlending.logicOp           = vk::LogicOp::eCopy;
colorBlending.attachmentCount   = 1;
colorBlending.pAttachments      = &colorBlendAttachment;
colorBlending.blendConstants[0] = 0.0f;
colorBlending.blendConstants[1] = 0.0f;
colorBlending.blendConstants[2] = 0.0f;
colorBlending.blendConstants[3] = 0.0f;

person Dess    schedule 17.03.2018    source источник
comment
Вот Alpha Blending пример из Поваренной книги Vulkan. Но различные настройки смешивания дают разные результаты в зависимости от ваших потребностей. Просто попробуйте разные комбинации, мы не знаем, чего именно Вы хотите достичь. Но если вы хотите вырезать спрайты из четырехугольников (без смешивания), вы можете попробовать выполнить инструкцию сброса фрагментного шейдера (раньше это называлось альфа-тестом, но теперь это можно сделать только внутри фрагментного шейдера).   -  person Ekzuzy    schedule 17.03.2018
comment
@Ekzuzy: Вы разместили ответ как комментарий, поэтому кнопки для подтверждения нет. Но считайте это принятым как ответ.   -  person Dess    schedule 17.03.2018


Ответы (1)


Ответ Пера Экзуси, вот 2 способа:

Использование ключевого слова discard во фрагментном шейдере.

// Read data from some texture.
vec4 color = texture(...); 
// This makes the alpha channel (w component) act as a boolean.    
if (color.w < 1) { discard; }

Для моего первоначального вопроса эти значения подойдут:

vk::PipelineColorBlendAttachmentState colorBlendAttachment;
colorBlendAttachment.colorWriteMask = 
  vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG |
  vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA;
colorBlendAttachment.blendEnable = VK_TRUE;
colorBlendAttachment.srcColorBlendFactor = vk::BlendFactor::eSrcAlpha;
colorBlendAttachment.dstColorBlendFactor = vk::BlendFactor::eOneMinusSrcAlpha;
colorBlendAttachment.colorBlendOp = vk::BlendOp::eAdd;
colorBlendAttachment.srcAlphaBlendFactor = vk::BlendFactor::eSrcAlpha;
colorBlendAttachment.dstAlphaBlendFactor = vk::BlendFactor::eOneMinusSrcAlpha;
colorBlendAttachment.alphaBlendOp = vk::BlendOp::eSubtract;
person Dess    schedule 17.03.2018
comment
Я не был уверен, чего Вы ожидали. Существует множество различных настроек альфа-смешивания для различных ситуаций. Поэтому я просто указал Вам на наиболее часто используемый, чтобы Вы могли начать с него. Но я рад, что это помогло Вам в Вашем развитии. ;-) - person Ekzuzy; 18.03.2018
comment
Примечание: я не замечал раньше, но эти значения для смешивания заменяют пиксели, которые не написаны с чистым цветом. Итак, когда спрайт не находится поверх другого спрайта, он кажется прозрачным. Но когда спрайт рисуется поверх другого спрайта, прозрачная часть отображается прозрачным цветом. Я отправлю записку, когда выясню, что там происходит. - person Dess; 18.03.2018
comment
Вероятно, из-за того, что включен тест глубины. Если вы рисуете четырехугольник, он смешивается с чистым цветом. Теперь, когда Вы рисуете другой четырехугольник, но тот, который находится за первым четырехугольником, он не проходит проверку глубины и не отображается вообще (или только в тех местах, где он не закрыт). Если вы хотите, чтобы смешение было правильным, вам нужно отсортировать объекты по их расстоянию. В случае прозрачных объектов игровые движки сортируют их и сначала рисуют объекты, которые находятся дальше, а затем те, которые находятся ближе к камере. Это происходит после того, как нарисована вся непрозрачная геометрия. - person Ekzuzy; 18.03.2018
comment
Черт. И я думал, что это будет легко. - person Dess; 19.03.2018