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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

4.4.3 Vertex sha<strong>de</strong>r<br />

Llego el momento <strong>de</strong> analizar el vertex sha<strong>de</strong>r. Es importante notar que a pesar <strong>de</strong> que este sha<strong>de</strong>r calcu<strong>la</strong> <strong>la</strong><br />

iluminación por pixel, ciertos cálculos referentes a <strong>la</strong> iluminación <strong>de</strong>berán hacerse en el vertex sha<strong>de</strong>r.<br />

Básicamente calculáramos en el vertex sha<strong>de</strong>r ciertos valores necesarios para <strong>de</strong>terminar <strong>la</strong> iluminación, como <strong>la</strong><br />

normal en ese vértice o <strong>la</strong> posición <strong>de</strong> <strong>la</strong>s fuentes <strong>de</strong> luz con respecto a ese vértice. Pero en vez <strong>de</strong> realizar el resto <strong>de</strong><br />

los cálculos aquí, <strong>de</strong>jaremos que se calculen en el pixel sha<strong>de</strong>r. Dado que ahí tendremos estos valores interpo<strong>la</strong>dos<br />

por todo el polígono <strong>de</strong>l cual el vértice forma parte, consi<strong>de</strong>rando obviamente los valores calcu<strong>la</strong>dos en los otros dos<br />

vértices. De esta manera podremos realizar un cálculo mucho más preciso.<br />

Desafortunadamente, escapa al alcance <strong>de</strong>l libro discutir sobre como calcu<strong>la</strong> el sha<strong>de</strong>r está iluminación. El objetivo<br />

es hab<strong>la</strong>r <strong>de</strong> aspectos generales.<br />

//////////////////////////////////////////////<br />

////////////// Vertex Sha<strong>de</strong>r /////////////////<br />

//////////////////////////////////////////////<br />

vertexOutput VertexSha<strong>de</strong>r(vertexInput IN)<br />

{<br />

}<br />

// Definimos <strong>la</strong> estructura <strong>de</strong> salida //<br />

vertexOutput OUT;<br />

// Calculo <strong>de</strong> <strong>la</strong> normal en el mundo //<br />

float3 Nw = normalize(mul(IN.Normal,WorldIT).xyz);<br />

OUT.WorldNormal = Nw;<br />

// Posiciones <strong>de</strong>l vértice teniendo en cuenta distintos puntos <strong>de</strong> origen //<br />

// Necesarias para cálculos auxiliares concernientes a <strong>la</strong>s luces //<br />

float4 Po = float4(IN.Position.xyz,1.0); // object coordinates<br />

float3 Pw = mul(Po,World).xyz; // world coordinates<br />

// Posiciones <strong>de</strong> <strong>la</strong>s luces con respecto al vértice //<br />

OUT.PointLightVec = PointLightPos - Pw;<br />

OUT.SpotLightVec = SpotLightPos - Pw.xyz;<br />

// Coor<strong>de</strong>nadas <strong>de</strong> texturas //<br />

OUT.UV = float2(UScale,VScale) * IN.UV.xy;<br />

float3 Vn = normalize(ViewI[3].xyz - Pw); // obj coords<br />

OUT.WorldView = Vn;<br />

// Posición <strong>de</strong>l vértice en <strong>la</strong> escena<br />

OUT.HPosition = mul(Po,WorldViewProj);<br />

return OUT;<br />

Observemos que para pasar varios valores auxiliares al pixel sha<strong>de</strong>r utilizamos vectores con semántica TEXTCOORD.<br />

Esta es una práctica muy común <strong>de</strong>bido a que muchas veces no disponemos <strong>de</strong> semánticas que reflejen el significado<br />

<strong>de</strong> estos valores. No existe ningún problema grave en realizar esto, dado que nosotros en el pixel sha<strong>de</strong>r le daremos<br />

<strong>la</strong> semántica que queramos. Distinto seria si el procesamiento <strong>de</strong> fragmentos se calcu<strong>la</strong> utilizando el pipeline gráfico<br />

<strong>de</strong> función fija, en este caso, el GPU no sabría cómo interpretar esta información.<br />

Sin embargo tenemos que tener cuidado en hacer esto, muchas veces nos lleva a utilizar <strong>la</strong> semántica equivoca, y<br />

esto podría provocar <strong>la</strong> reducción <strong>de</strong> <strong>la</strong> legibilidad <strong>de</strong>l código. Pensemos lo siguiente: ¿Qué semántica podríamos<br />

haber utilizado para WorldNormal o WorldView?<br />

Página 76

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

Saved successfully!

Ooh no, something went wrong!