编写HLSL像素着色器以从2d纹理执行查找

时间:2011-10-13 01:25:00

标签: hlsl lookup-tables pixel-shader direct3d11

我是一名初学者像素着色器编写器,我遇到了一些麻烦。我想采用256x256,16位输入(DXGI_FORMAT_R16_UINT)图像,并通过256x256查找纹理(DXGI_FORMAT_R8_UNORM)将其转换为256x256 8位输出。

不幸的是,我似乎遇到了很多麻烦,输出似乎总是夹到黑色或白色。

另外,我不确定我应该使用哪种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转换为2D索引之前对其进行规范化?

在使用之前我应该​​对索引进行规范化吗?

我应该采样吗?

我是否在正确的道路上?

感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

你肯定是在正确的轨道上。但是,就像Valmond提到的那样,pixelValue的值将在[0..1]范围内。

LUT究竟是如何设置的?我猜第一个轴是要转换的值,但第二个轴是什么?一旦我知道了,我就可以提供代码解决方案。