Прост HLSL ефект на сияние/размазване в DirectX9

От дни се боря да намеря някакви ресурси, които да ми помогнат да напиша прост шейдър за светене/замъгляване, използвайки High Level Shader Language и DirectX 9 Managed Libraries.

Всичко, което трябва да направя, е масив от 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, предвид броя на въпросите и количеството код, който трябва да публикувам, наистина просто търся помощ за намиране на ресурси!


person tbridge    schedule 22.11.2010    source източник


Отговори (1)


Непосредственият проблем, който виждам с вашия код, е, че прилагате шейдър към самите линии. Пикселните шейдъри всъщност не работят по този начин. Не можете да взаимодействате с нито един от пикселите около пиксела, който се засенчва. Всичко, което получавате, са регистри (позиция, цвят, координати на текстура и т.н.) и семплери (текстури) за този един пиксел, който се извежда.

За да заобиколите това, основният процес на създаване на ефект на замъгляване (като за сияние или цъфтеж) е да начертаете сцената, която искате да замъглите, към целта за рендиране. След това използвайте тази цел за рендиране като текстура върху четворка на цял екран, която рисувате с шейдър за размазване. Един прост шейдър за размазване взема множество проби от тази текстура - всяка с леко изместена координата на текстурата. Резултатът е замъглено изображение на текстурата.

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

Препоръчвам ви да разгледате XNA Bloom Sample. Там има по-обширна документация за процеса. Докато API е XNA, а не DirectX, те са доста сходни и и двата използват HLSL.

person Andrew Russell    schedule 22.11.2010
comment
Да, предполагам, че не искам да съм много ясен. Наясно съм с всичко, което казахте, рендерирам линиите в текстура, прилагам я към четворка и рендерирам тази четворка с моя HLSL. Предполагам, че това, което търся, е HLSL аспектът, който ще върви заедно с него. Благодаря за примера на Bloom, ще го разгледам :) - person tbridge; 23.11.2010
comment
Примерът се оказа много полезен. Най-накрая един прост/мощен HLSL пример, който нямаше сто редови шейдъри. - person tbridge; 23.11.2010