14.04.2013 Views

Untitled - Departamento de Ciencias e Ingeniería de la Computación

Untitled - Departamento de Ciencias e Ingeniería de la Computación

Untitled - Departamento de Ciencias e Ingeniería de la Computación

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

En <strong>de</strong>finitiva, los sha<strong>de</strong>rs se toman <strong>de</strong>s<strong>de</strong> un archivo, se compi<strong>la</strong>n por <strong>la</strong> API, y se suministran a <strong>la</strong> GPU utilizando el<br />

lenguaje maquina <strong>de</strong> el<strong>la</strong>s. En el próximo capítulo trataremos el tema <strong>de</strong> los lenguajes a fondo. Por el momento, se<br />

seguirá explicando <strong>la</strong> implementación e integración <strong>de</strong> los sha<strong>de</strong>rs <strong>de</strong> manera más superficial y general.<br />

A<strong>de</strong>más, existen herramientas que nos permiten <strong>de</strong>sarrol<strong>la</strong>r sha<strong>de</strong>rs a un nivel aun más alto. En <strong>la</strong> práctica, estas<br />

herramientas resultan vitales para el <strong>de</strong>sarrol<strong>la</strong>dor, dado que no solo nos permiten escribir los sha<strong>de</strong>rs <strong>de</strong> manera<br />

más cómoda, sino que también nos permiten, en otras cosas, optimizarlos sin tener que usar nuestro motor gráfico,<br />

y <strong>de</strong> esta manera abstraernos <strong>de</strong>l mismo. Es más, estas herramientas no nos quitan po<strong>de</strong>r, y tampoco producen<br />

sha<strong>de</strong>rs menos eficientes. En el cuarto capítulo hab<strong>la</strong>remos más sobre estas herramientas.<br />

2.6 Un ejemplo <strong>de</strong> cómo integrar un sha<strong>de</strong>r a nuestra aplicación<br />

A continuación mostraremos un ejemplo <strong>de</strong> cómo integrar un sha<strong>de</strong>r escrito en HLSL en un motor escrito en C#<br />

utilizando como API gráfica a DirectX 9. El objetivo es mostrar, en una situación real, como se especifica y como<br />

afecta el uso <strong>de</strong> sha<strong>de</strong>rs al código <strong>de</strong> nuestro motor.<br />

La razón <strong>de</strong> <strong>la</strong> elección <strong>de</strong> HLSL, C# y DirectX 9 se <strong>de</strong>be más a una cuestión <strong>de</strong> comodidad propia, más que a<br />

cualquier otro factor. Tranqui<strong>la</strong>mente podríamos ejemplificar esta situación con OpenGL, C++ o Cg para mostrar <strong>la</strong><br />

integración <strong>de</strong> sha<strong>de</strong>rs a nuestro motor.<br />

Veamos el ejemplo. Este código ren<strong>de</strong>riza un objeto usando un sha<strong>de</strong>r <strong>de</strong>terminado.<br />

public void OnRen<strong>de</strong>r ()<br />

{<br />

.<br />

.<br />

.<br />

// Cargamos el archivo fx<br />

Effect effect = Effect.FromFile(<strong>de</strong>vice, "codigosha<strong>de</strong>r.fx", null, Sha<strong>de</strong>rF<strong>la</strong>gs.None, null);<br />

}<br />

// Elegimos <strong>la</strong> técnica<br />

effect.Technique = "Sha<strong>de</strong>rTechnique";<br />

// Effect.Begin retorna el número <strong>de</strong> pasadas requeridas para ren<strong>de</strong>rizar el sha<strong>de</strong>r.<br />

int passes = effect.Begin(0);<br />

// Cic<strong>la</strong>mos a través <strong>de</strong> todas <strong>la</strong>s pasadas <strong>de</strong>l sha<strong>de</strong>r.<br />

for (int i = 0; i < passes; i++)<br />

{<br />

// Seteamos <strong>la</strong>s constantes globales <strong>de</strong>l sha<strong>de</strong>r.<br />

effect.SetValue("WorldMatrix", worldMatrix);<br />

}<br />

// Indicamos que comenzaremos <strong>la</strong> pasada.<br />

effect.BeginPass(i);<br />

// Ren<strong>de</strong>rizamos el objeto<br />

<strong>de</strong>vice.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);<br />

// Indicamos que terminamos <strong>la</strong> pasada.<br />

effect.EndPass();<br />

// Indicamos que terminamos<br />

effect.End();<br />

.<br />

.<br />

.<br />

Página 40

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!