Написание пиксельного шейдера HLSL4 для выполнения поиска из 2D-текстуры - PullRequest
4 голосов
/ 13 октября 2011

Я начинающий автор пиксельных шейдеров, и у меня возникли некоторые проблемы. Я хочу взять 256x256 16-битное входное изображение (DXGI_FORMAT_R16_UINT) и пропустить его через текстуру просмотра 256x256 (DXGI_FORMAT_R8_UNORM), чтобы преобразовать его в 8-битный выход 256x256.

К сожалению, мне кажется, что у меня много проблем, и кажется, что вывод всегда ограничен черным или белым.

Кроме того, я не уверен, какие форматы DXGI мне следует использовать, а также, какой тип данных соотносится с каждым форматом.

// Global Variables
Texture2D<uint> imgTexture : register( t0 );
Texture2D lutTexture : register( t1 );
SamplerState SampleType : register( s0 );

// Structures 
struct PS_INPUT
{
  float4 Pos : SV_POSITION;
  float2 Tex : TEXCOORD0;
};

// Pixel Shader
float4 PS( PS_INPUT input) : SV_Target
{
  uint pixelValue = imgTexture[input.Tex];
  uint2 index = { pixelValue / 256, pixelValue % 256 };
  // uint row = pixelValue / 256;
  // uint col = pixelValue % 256;

  float4 output = lutTexture[index];
  output.g = output.r;
  output.b = output.r;
  output.a = 1.0f;

  return output;    
}

Должен ли я нормализовать pixelValue, прежде чем пытаться превратить его в двумерный индекс?

Должен ли я нормализовать индекс перед его использованием?

Должен ли я вместо этого делать выборку?

Я даже на правильном пути здесь?

Буду признателен за ЛЮБУЮ помощь, спасибо!

1 Ответ

0 голосов
/ 29 ноября 2011

Вы определенно на правильном пути.Но, как упоминал Вальмонд, значение pixelValue будет в диапазоне [0..1].

Как именно настраивается LUT?Я предполагаю, что первая ось - это значение, которое нужно преобразовать, но какая вторая?Узнав об этом, я могу дать решение с помощью кода.

...