Множественный эффект на спрайт

Я реализовал эффект и переход, используя файлы пиксельных шейдеров. Когда я применяю эффект и переход отдельно, он работает нормально, но если я применяю оба одновременно, он не работает. Как применить несколько шейдеров к спрайту. Ниже приведен код, что я делаю.

_effect = Effect.FromFile(_parentRVRenderer.Device, path, null, ShaderFlags.None, null);
_effect1 = Effect.FromFile(_parentRVRenderer.Device, path1, null, ShaderFlags.None, null);
_effect.Technique = "TransformTexture";
_effect1.Technique = "TransformTexture";

_effect1.Begin(0);
_effect1.BeginPass(0);
_effect.Begin(0);
_effect.BeginPass(0);
sprint.Begin()
Sprite.Draw();
....

person Firoz    schedule 25.08.2011    source источник


Ответы (2)


Поместите две функции пиксельного шейдера в один и тот же шейдер и используйте метод двух проходов, который применяет разные пиксельные шейдеры в каждом проходе.

Вы по-прежнему должны использовать две цели рендеринга, чтобы перенаправить вывод из первого прохода в другой, как указано выше, но лучше использовать двухпроходный подход, чем отправлять цель рендеринга в другой метод шейдера.

Псевдокод:

RenderTarget2D[2] targets;

// (Draw all your sprites to target 0)

// target 1 will be empty, will be used in pass 0 (even pass)

effect.Technique = "TwoPassTechnique";

for (int i = 0; i < effect.Passes.Count; i++) 
{
    // Even pass sets target 1, odd pass sets target 0
    GraphicsDevice.setRenderTarget(targets[1 - i % 2]);
    effect(i).BeginPass;

    // Even pass samples texture from target 0, odd pass uses target 1
    effect(i).Parameters["texture"].SetValue(targets[i % 2]);

    // Draw a 2D quad with extents (-1, -1), (1, 1) in screen space 
}
// Final contents are now stored in target 0

// (Draw target 0's texture to the screen, using a sprite or another 2D quad)
person Chris C    schedule 08.09.2011

Я не уверен, можно ли применять 2 шейдера одновременно. Но что бы я сделал, так это нарисовал бы спрайт в цели рендеринга, используя первый шейдер, а затем нарисовал бы полученное изображение на экране, используя второй шейдер.

Очевидно, было бы идеально, если бы вы могли объединить эффекты в один шейдер, но это не всегда возможно. Возможно, это не лучшее решение, но оно должно сработать.

person Fat-Wednesday    schedule 26.08.2011
comment
Привет, Фэт, спасибо за ответ, не могли бы вы привести пример кода для этого. - person Firoz; 26.08.2011
comment
Создайте цель рендеринга просто с помощью RenderTarget2D MyRenderTarget = new RenderTarget2D(graphicsDevice, width, height); затем используйте GraphicsDevice.SetRenderTarget(MyRenderTarget); рисуйте как обычно, затем установите цель рендеринга обратно в нуль (устанавливает ее в задний буфер) и снова нарисуйте, на этот раз используя MyRenderTarget в качестве параметра текстуры в рисовании. - person Fat-Wednesday; 26.08.2011