VS85 Team 的个人资料XNALearners日志列表留言簿 工具 帮助

日志


2009/1/22

SpriteBatch per effetti speciali - parte 2

Implementazione

By Davide Luzzu – Webcast by Giuseppe Maggiore

Lo Shader

 

sampler ControlPoints : register(s0) = sampler_state

{

  MipFilter = LINEAR;

  MagFilter = LINEAR;

  MinFilter = LINEAR;

 

  AddressU = CLAMP;

  AddressV = CLAMP;

};

 

Il “serpente” che andremo a definire è composto da svariati punti di controllo che contengono, non solo una posizione, ma anche un valore che ne determina il colore. Abbiamo però necessità di definire come interpretare il colore nelle posizioni tra un punto di controllo ed un altro; tale operazione viene eseguita con una semplice interpolazione lineare, lasciando invariati i colori di partenza. Per specificare l’immutabilità dei colori di partenza scriveremo:

 

AddressU = CLAMP; // punto di controllo di partenza

AddressV = CLAMP; // punto di controllo di arrivo

 

dove CLAMP indica appunto che tali colori non dovranno variare.

Queste specifiche le inseriamo in un sampler, cioè indichiamo che la modalità di accesso ai pixel del nostro PixelShader  è attraverso un campionamento. Dato che esistono più sampler di base, indichiamo con

 

: register(s0)

 

che quello che ci interessa è all’indice 0 (zero), più precisamente nel registro “s0”, detto in codice assembly (dove abbiamo a che fare direttamente con i registri).

 

float4 PixelShaderFunction(float2 input : TEXCOORD0) : COLOR0

{

  float cp;

  cp = tex2D(ControlPoints, float2(input.x, 0.0f));

  float alpha = pow(saturate(1.0f - abs(input.y - cp)), 32.0f);

  return float4(SnakeColor.xyz,alpha);

}

 

Implementiamo la funzione del PixelShader, passando in ingresso i dati sulle coordinate di texture, ottenuti dal VertexShader. Come possiamo notare, il parametro di ingresso è una coordinata bidimensionale di texture, e la x del parametro rappresenta la posizione sull’asse delle ascisse del punto di controllo che dovremo andare a trovare. La posizione sull’asse delle ordinate la dobbiamo invece ricavare sfruttando i dati che abbiamo:

 

  cp = tex2D(ControlPoints, float2(input.x, 0.0f));

 

Non ci resta che calcolare un valore alpha, che rappresenta la trasparenza del colore che dà la “fluorescenza” all’immagine di base. Questo colore trasparente avrà una saturazione maggiore quanto più si è vicino all’immagine del serpente, ed al contrario avrà una intensità minore tanto più è lontano. Questa “aura” che impostiamo attorno al serpente è prodotta con:

 

  float alpha = pow(saturate(1.0f - abs(input.y - cp)), 32.0f);

 

Infine restituiamo un colore a quattro canali, per cui, i primi tre rappresentano il colore originale, e il quarto il canale alpha.

 

technique Technique1

{

    pass Pass1

    {

        PixelShader = compile ps_2_0 PixelShaderFunction();

    }

}

 

Uno Shader, abbiamo già detto, che è formato da una technique e da uno o più pass; l’ultimo passaggio, appunto, è destinato a definire tale technique e il pass che ci interessa.

Il PixelShader è compilato con la versione 2_0, e ciò che deve essere tradotto in assembly è la funzione PixelShaderFunction.

评论

请稍候...
很抱歉,您输入的评论太长。请缩短您的评论。
您没有输入任何内容,请重试。
很抱歉,我们当前无法添加您的评论。请稍后重试。
若要添加评论,需要您的家长授予您相应权限。请求权限
您的家长禁用了评论功能。
很抱歉,我们当前无法删除您的评论。请稍后重试。
您已超过了一天之内允许提供的评论数上限。请在 24 小时后重试。
因为我们的系统表明您可能在向其他用户提供垃圾评论,您的帐户已禁用了评论功能。如果您认为我们错误地禁用了您的帐户,请联系 Windows Live 支持部门
完成下面的安全检查,您提供评论的过程才能完成。
您在安全检查中键入的字符必须与图片或音频中的字符一致。

若要添加评论,请使用您的 Windows Live ID 登录(如果您使用过 Hotmail、Messenger 或 Xbox LIVE,您就拥有 Windows Live ID)。登录


还没有 Windows Live ID 吗?请注册

引用通告

此日志的引用通告 URL 是:
http://vs85team.spaces.live.com/blog/cns!B49FFA0EB319A219!551.trak
引用此项的网络日志