Как применить шейдер к растровому изображению в автономном режиме с помощью SharpDX

Я хочу применить шейдер к растровому изображению (автономная обработка) с Sharpdx. Я нашел образец на домашней странице SharpDX, чтобы применить эффект к изображению с автономной обработкой. Теперь я хочу применить к нему shader.fx, но не знаю, как это сделать. Может кто-нибудь мне помочь?

Вот фрагмент кода:

// Effect 1 : BitmapSource - take decoded image data and get a BitmapSource from it
    var bitmapSourceEffect = new d2.Effects.BitmapSource(d2dContext);
    bitmapSourceEffect.WicBitmapSource = formatConverter;


    // Effect 2 : GaussianBlur - give the bitmapsource a gaussian blurred effect
    var gaussianBlurEffect = new d2.Effects.GaussianBlur(d2dContext);
    gaussianBlurEffect.SetInput(0, bitmapSourceEffect.Output, true);
    gaussianBlurEffect.StandardDeviation = 5f;

    d2dContext.BeginDraw();
    d2dContext.DrawImage(gaussianBlurEffect);
    d2dContext.EndDraw();

Вот шейдер.fx

vec2 Warp(vec2 Tex)
{
vec2 newPos = Tex;
float c = -81.0/20.0;
float u = Tex.x * 2.0 - 1.0;
float v = Tex.y * 2.0 - 1.0;
newPos.x = c*u/((v*v) + c);
newPos.y = c*v/((u*u) + c);
newPos.x = (newPos.x + 1.0)*0.5;
newPos.y = (newPos.y + 1.0)*0.5;
return newPos;
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
 {
vec2 uv = fragCoord.xy / iResolution.xy;

if (uv.x < 0.5)
{
    uv.x = uv.x * 2.0;
    fragColor = texture2D(iChannel0, Warp(uv));
}
else
{
    uv.x = (uv.x - 0.5) * 2.0;
    fragColor = texture2D(iChannel0, Warp(uv));
}

 }

person Gagagu    schedule 29.06.2015    source источник
comment
Есть ли причина, по которой вы хотите, чтобы это было на GPU? Я не уверен, что параллелизм компенсирует накладные расходы на загрузку / загрузку данных и настройку конвейера. Подход с использованием чистого процессора может быть проще и быстрее, если у вас нет очень большого образа. А если оффлайн, производительность не играет роли, не так ли?   -  person Nico Schertler    schedule 30.06.2015
comment
Привет, это нужно для приложения VR. Изображение будет захвачено (разрешение от HD до Full HD), шейдер создаст параллельное изображение и добавит бочкообразное искажение с каждой стороны. Оно должно выглядеть так: pbs.twimg.com/media/B-8RPRqU8AAJQGj.jpg Если вы знаете, что такое окулус-рифт, тогда вы понимаете, о чем я. Если вам нравится мое приложение, посмотрите это видео youtube.com/watch? v = uuF4zIPjEgM Спасибо за помощь   -  person Gagagu    schedule 01.07.2015
comment
Тогда зачем тебе офлайн? Изображение не должно отображаться?   -  person Nico Schertler    schedule 01.07.2015
comment
На ПК пользователь будет играть в игру в оконном режиме. Мое приложение захватит окно игры и отправит его по сети на iPhone, который используется с очками vr. На iPhone изображение будет отображаться на двух окнах для имитации трехмерного изображения Side-bySide, но коррекция линзы отсутствует. Между захватом и отправкой по сети мне нужно применить шейдер к изображению. Я использую SharpDX для захвата изображения github.com/sharpdx/SharpDX-Samples/blob/master/Desktop/   -  person Gagagu    schedule 01.07.2015
comment
Затем используйте захваченное изображение в качестве представления ресурсов шейдера. Визуализируйте полноэкранный четырехугольник с помощью шейдера и отправьте результат (из текстуры заднего буфера) по сети.   -  person Nico Schertler    schedule 01.07.2015
comment
Я не могу выполнить рендеринг в полноэкранном режиме, потому что пользователь показывает игру, в то время как мое приложение захватывает из нее изображения.   -  person Gagagu    schedule 01.07.2015
comment
В этом контексте полноэкранный режим означает полное окно просмотра. Конечно, вы должны выполнить рендеринг в закадровую текстуру.   -  person Nico Schertler    schedule 01.07.2015