Вулкан, загружающий текстуру в 8-битном формате, при рендеринге белый

Я загружаю изображение RGBA PNG в vulkan. У меня нет ошибки во время процесса, но мой шейдер показывает мне белую текстуру.

Я быстро понял, что если я умножу выбранный пиксель на 0,00390625 (что составляет 1/256), я получу правильный цвет. Таким образом, в процессе кажется, что vulkan просто копирует мое 8-битное значение в версию с плавающей запятой, не преобразовывая ее. что мне не хватает?

Я использую комбинированный сэмплер изображений в GLSL и изображение, созданное в формате VK_FORMAT_R8G8B8A8_UINT. Я не знаю, где сказать Vulkan для преобразования данных?

Применение градиента к изображению с помощью CSS
Применение градиента к изображению с помощью CSS
Здравствуйте, братья и сестры, как дела? Недавно я застрял на применении градиента к изображению. Я применял это много раз, но иногда наши требования...
Получение URL-адреса изображения курса в Moodle с помощью PHP
Получение URL-адреса изображения курса в Moodle с помощью PHP
Moodle - это популярная система управления обучением с открытым исходным кодом, используемая многими учебными заведениями и организациями по всему...
0
0
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что когда вы создаете изображение в формате VK_FORMAT_R8G8B8A8_UINT, суффикс UINT явно говорит Vulkan, что вы хотите, чтобы каждое значение RGBA отображалось в шейдере как 8-битное целое число без знака.

Вместо этого вы хотите VK_FORMAT_R8G8B8A8_UNORM. Суффикс UNORM говорит Vulkan взять 8 бит и преобразовать их в значение с плавающей запятой в диапазоне [0, 1].

Большинство распространенных форматов имеют как возможные суффиксы

  • _UNORM Преобразует данные в формат с плавающей запятой в диапазоне [0, 1]
  • _SNORM Преобразует данные в формат с плавающей запятой в диапазоне [-1, 1]
  • _USCALED Преобразует данные в формат с плавающей запятой без изменения значения
  • _SSCALED Преобразует данные в формат с плавающей запятой без изменения значения (но обрабатывает ввод как подписанный)
  • _UINT Интерпретирует значение как целое число без знака
  • _SINT Интерпретирует значение как целое число со знаком

Кроме того, для форматов, которые достаточно широки для поддержки значений с плавающей запятой, таких как VK_FORMAT_R16G16B16A16_* и VK_FORMAT_R32G32B32A32_*, также доступен суффикс _SFLOAT, сообщающий Vulkan, что значения в каналах уже являются значениями с плавающей запятой. UFLOAT нет, потому что числа с плавающей запятой без знака не поддерживаются.

В 9 случаях из 10 при работе с данными изображения, загруженными из какого-либо локального файла в буфер RGB, вам нужна _UNORM версия любого формата, который вы отправляете драйверу, чтобы автоматически масштабировать значения до соответствующего диапазона с плавающей запятой [0, 1] .

Я забыл об этом, спасибо!

Sébastien Bémelmans 14.04.2023 13:35

Другие вопросы по теме