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
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