Почему формат VkImageView отличается от основного формата VkImage? - PullRequest
0 голосов
/ 29 октября 2019

VkImageCreateInfo имеет следующий член:

 VkFormat                   format;

И VkImageViewCreateInfo имеет того же члена.

Что я надеваюЯ не понимаю, почему у вас в VkImageView будет формат, отличный от VkImage, необходимого для его создания.

Я понимаю, что некоторые форматы совместимы друг с другом , но я не знаю, почему вы используете один из альтернативных форматов

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Канонический вариант использования и первичная исходная мотивация (в D3D10, где возникла эта идея) использует одно изображение как R8G8B8A8_UNORM или R8G8B8A8_SRGB - либо потому, что оно содержит разное содержимое в разное время, либо потому, что иногда выхотите работать в sRGB-пространстве без линеаризации.

В более общем случае иногда полезно иметь разные «типы» содержимого в объекте изображения в разное время - это дает механизмам ограниченную форму псевдонимов памяти, ибыл представлен графическим API за несколько лет до того, как появился полноценный псевдоним памяти.

1 голос
/ 29 октября 2019

Как и многие Vulkan, API предназначен для демонстрации возможностей аппаратного обеспечения. Структура памяти (изображение) и интерпретация этой памяти как данных (представление изображения) - это разные понятия в аппаратном обеспечении, и поэтому API это раскрывает. API раскрывает это просто потому, что так работает аппаратное обеспечение, а Vulkan спроектирован, чтобы быть тонкой абстракцией;просто потому, что API может это делать, это не значит, что вам нужно его использовать;)

Как вы говорите, в большинстве случаев это не очень полезно ...

Я думаю, что есть некоторыеслучаи, когда это может быть более эффективным, например, получение вычислительного шейдера для генерации целочисленных данных для некоторых типов обработки изображений может быть более энергоэффективным, чем либо вычисление с плавающей запятой, либо ручная нормализация целочисленных данных для создания нестандартных данных. Используя псевдонимы, вычислительный шейдер может напрямую писать, например, uint8 целые числа, а фрагментный шейдер может читать те же данные, что и unorm8 data

...