Что произойдет, если у меня будет текстура uint32 (R32), и я получу сэмпл / извлечу ее в шейдере? - PullRequest
0 голосов
/ 12 июня 2018

Примечание: я различаю sample от fetch в названии, поскольку в моих тестах это поведение, кажется, отличается между двумя.

Возможные ответы:

  • [0..2 ^ 32] диапазон уменьшен до [0..1] (я думаю, что OpenGL работает таким образом)
  • uint32s приводятся к float32s (что, кстати, означает, что некоторая точность потеряна).
  • Другое?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Я предполагаю, что ваш формат текстуры / вида R32_UINT.

Если вы сделаете:

uint value = texture.Load(pixelLocation);

, он вернет вам uint (точно такое же значение)

Если вы сделаете:

float value = texture.Load(pixelLocation);

Itвыполнит приведение (потенциальная проблема точности)

Если вы попытаетесь выполнить сэмплирование, оно выполнит другое, так как выборка в формате uint обычно не разрешена (может перейти от неверного значения к сбою драйвера).

Случай 1 (уменьшенный диапазон): недоступно с R32, только с R16 или R8, в этом случае вам нужно использовать DXGI_FORMAT_R16_UNORM вместо UINT для вида шейдера (или формата текстуры).Пример конечно работает в этом случае.

0 голосов
/ 12 июня 2018

Я сделал тест с renderdoc.

При использовании fetch, а текстура определяется с помощью Texture2D<uint>, функции fetch просто возвращают uint вместо float4.

...