Для своего проекта я использую DirectX 9 C ++.
Я использую пиксельный шейдер, чтобы отобразить большую картинку, используя пару текстур в методе индексное изображение (цветное изображение).
Чтобы сэкономить пространство текстуры, я хотел бы сохранить пиксели изображения, используя записи таблицы поиска, чтобы использовать значения таблиц поиска в качестве значений пикселей изображения на этапе пиксельного шейдера.
Я использую 2 текстуры, первая текстура — текстура изображения, размер 2048 ^ 2.
Разнообразие пикселей составляет 128 пикселей, вторая текстура имеет размер LUT (таблица поиска) 128 * 1.
Я использую вторую текстуру в качестве индексное изображение (Справочная таблица),
почему-то мне сложно выбрать значение из первой текстуры (текстуры изображения) -> A [i, j] и сэмплировать вторую текстуру в том же месте -> значение пикселя = LUT [A [i, j]]
Затем выведите значение пикселя на экран.
Вот мой код пиксельного шейдера:
sampler2D layoutSample : register (s0)
sampler2D LUTSampler : register (s1)
struct PS_INPUT
{
float2 texture : TEXCOORD0;
float2 LUT_Texture: TEXCOORD1;
}
struct PS_OUTPUT
{
float4 color : COLOR0;
}
PS_OUTPUT ps_main ( in PS_INPUT input )
{
PS_OUTPUT out;
/// Sample the first texture - the image texture
float4 color = tex2D(layoutSampler, input.Texture);
float2 locationInLUT = float2(color.a , 0.0) ;
// I WOULD LIKE TO USE: But it's seems like a sampler is neccery for tex2D command
///float4 realColor = tex2D(locationInLUT , input.LUT_Texture);
float4 realColor = tex2D(LUTSamplerm , input.LUT_Texture);
Out.color = float4(realColor.r, realColor.b, realColor.g, 1.0);
return Out;
}
Пытаться
float4 realColor = tex2D(LUTSampler, locationInLUT);
В следующий раз используйте FXC компилятор и посмотрите на вывод ошибок.
Вместо
float4 realColor = tex2D(LUTSamplerm , input.LUT_Texture);
Используйте следующее:
float4 realColor = tex2D(LUTSampler, locationInLUT);