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