5

我是一个初学者像素着色器作家,我遇到了一些麻烦。我想获取一个 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;    
}

在尝试将其转换为 2D 索引之前,我应该对 pixelValue 进行规范化吗?

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

我应该取样吗?

我什至在正确的道路上吗?

我将不胜感激任何帮助,谢谢!

4

2 回答 2

0

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

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

于 2011-11-29T06:33:23.873 回答
0

您正在使用 :

uint pixelValue = imgTexture[input.Tex];

这需要像素值,但您提供的是 input.Tex (我猜它是从 0 标准化到 1)。因此,在这种情况下,您正在加载相同的像素。

您可以使用 :

uint pixelValue = imgTexture[input.Pos.xy];

或者 :

uint pixelValue = imgTexture.Load(int3(input.Pos.xy, 0));

反而。

是的,您的格式对于您的用例是正确的(无需规范化或非规范化)。

于 2021-08-24T13:03:24.877 回答