Пиксельный шейдер WPF с 16-битным входом HDR?

Я пытаюсь построить просмотрщик изображений для 16-битных изображений PNG с WPF. Моя идея состояла в том, чтобы загрузить изображения с PngBitmapDecoder, а затем положить их в Image контролировать и контролировать яркость / контрастность с помощью пиксельного шейдера.

Однако я заметил, что ввод в пиксельный шейдер уже преобразован в 8 бит. Это известное ограничение WPF или я где-то допустил ошибку? (Я проверил это с черно-белым градиентным изображением, которое я создал в Photoshop и которое проверено как 16-битное изображение)

Вот код для загрузки изображения (чтобы убедиться, что я загружаю с полным 16-битным диапазоном, просто записав Source="test.png" в элементе управления Image, загрузите его как 8-битный)

BitmapSource bitmap;
using (Stream s = File.OpenRead("test.png"))
{
  PngBitmapDecoder decoder = new PngBitmapDecoder(s,BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
  bitmap = decoder.Frames[0];
}

if (bitmap.Format != PixelFormats.Rgba64)
  MessageBox.Show("Pixel format " + bitmap.Format + " is not supported. ");

bitmap.Freeze();
image.Source = bitmap;

Я создал пиксельный шейдер с помощью великолепного инструмента шейдерных эффектов Shazzam.

sampler2D implicitInput : register(s0);

float MinValue : register(c0);
float MaxValue : register(c1);

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 color = tex2D(implicitInput, uv);

 float t = 1.0f / (MaxValue-MinValue);

    float4 result;    
    result.r = (color.r - MinValue) * t;
    result.g = (color.g - MinValue) * t;
    result.b = (color.b - MinValue) * t;
    result.a = color.a;

    return result;
}

И интегрировал шейдер в XAML следующим образом:

<Image Name="image" Stretch="Uniform">
  <Image.Effect>
    <shaders:AutoGenShaderEffect x:Name="MinMaxShader" Minvalue="0.0" Maxvalue="1.0>
    </shaders:AutoGenShaderEffect>
  </Image.Effect>
</Image>

1 ответ

Решение

Я только что получил ответ от Microsoft. Это действительно ограничение в системе рендеринга WPF. я буду стараться D3DImage как обходной путь.

Другие вопросы по тегам