2010-11-22 6 views
2

Я изо дня в день пытаюсь найти любые ресурсы, которые помогут мне написать простой сияющий/размытый шейдер, используя шейдерный язык высокого уровня и управляемые библиотеки DirectX 9.Простой эффект glow/blur для HLSL в DirectX9

Все, что мне нужно сделать, это иметь массив из CustomVertex.TransformedColored вершины, нарисованные как простые линии, а затем размытые/сияющие эффектом HLSL.

Я искал в Интернете около трех дней с некоторыми результатами, но я просто не могу найти действительно хороший учебник или пример. У меня есть базовое понимание HLSL, но я не понимаю этого достаточно, чтобы понять, как написать этот шейдер (я также прочитал главу HLSL в 3 книгах DirectX).

Вот некоторые (сокращенная) код:

CustomVertex.TransformedColored[] glowVertices = new CustomVertex.TransformedColored[4]; 
glowVertices[0] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Cyan.ToArgb()); 
glowVertices[1] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Blue.ToArgb()); 
glowVertices[2] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Cyan.ToArgb()); 
glowVertices[3] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Blue.ToArgb()); 

this.device.BeginScene(); 
int passes = this.glowEffect.Begin(0); 
for (int i = 0; i < passes; i++) 
{ 
    this.glowEffect.BeginPass(i); 
    this.device.DrawUserPrimitives(PrimitiveType.LineStrip, glowVertices.Length - 1, glowVertices); 
    this.glowEffect.EndPass(); 
} 
this.glowEffect.End(); 
this.device.EndScene(); 

Я предполагаю, что я не так много, нужна помощь по конкретной части HLSL, учитывая количество вопросов и количество кода, я бы post Я действительно ищу какую-то помощь в поиске ресурсов!

ответ

6

Непосредственная проблема, которую я вижу с вашим кодом, заключается в том, что вы применяете шейдер к самим линиям. Пиксельные шейдеры на самом деле не работают. Вы не можете взаимодействовать с любым пикселем вокруг затененного пикселя. Все, что вы получаете, это регистры (положение, цвет, координата текстуры и т. Д.) И сэмплеры (текстуры) для одного пикселя, который выводится.

Чтобы обойти это, основной процесс создания эффекта размытия (например, для свечения или цветения) состоит в том, чтобы нарисовать сцену, которую вы хотите размыть, на цель рендеринга. Затем используйте эту цель рендеринга как текстуру на полноэкранном квадрате, который вы рисуете с помощью размытого шейдера. Простой размытие шейдера принимает несколько образцов из этой текстуры - каждая со слегка смещенной текстурной координатой. Результатом является размытое изображение текстуры.

Обычно вы повторяете этот процесс (теперь рендеринг рендеринга-на-полноэкранном квадранте с другой целью рендеринга), делая одно размытие горизонтально и вертикально, чтобы получить максимальное размытие с наименьшим числом образцы.

Я рекомендую посмотреть на XNA Bloom Sample. Существует более обширная документация по этому процессу. Хотя API XNA, а не DirectX, они довольно похожи, и оба они используют HLSL.

+0

Да, я думаю, я не слишком понятен. Я знаю все, что вы сказали, я рисую линии текстуры, применяю ее к квадранту и отрисую этот квадратик с моим HLSL. Я предполагаю, что я ищу, это аспект HLSL, который будет сочетаться с ним. Спасибо за образец Bloom, я загляну в него :) – tbridge 2010-11-23 00:24:46