SJo*_*shi 5 lookup-tables hlsl 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;
}
Run Code Online (Sandbox Code Playgroud)
在尝试将其转换为 2D 索引之前,我应该对 pixelValue 进行标准化吗?
我应该在使用索引之前对其进行标准化吗?
我应该采样吗?
我什至走在正确的道路上吗?
我将不胜感激任何帮助,谢谢!
小智 0
您绝对走在正确的道路上。但是,就像 Valmond 提到的那样,pixelValue 的值将在 [0..1] 范围内。
LUT到底是如何设置的?我猜第一个轴是要转换的值,但第二个轴是什么?一旦我知道了这一点,我就可以用代码给出解决方案。