1.此DEMO没有特别之处,思路是依照DX官方的实例程序 “HLSLwithoutEffects.fx”
2.详尽的说明在程序代码注释中
源代码:
/*
* File name : SinWave.vsh
* Date : 2011.12.9
* Author : Domry.X.Cui
* Description :
*/
// Global var
matrix worldViewProjMat;
float fTime;
// Output
// Description :
// 输出结构中由于需要获得顶点变化后的明暗效果,所以需要输出颜色
// ,明暗强度根据COS值计算(这里没有使用法线与入射光角度决定明暗
// 强度,此处主要探究如何让顶点根据正弦波运动,所以,官方可能不打
// 算将明暗处理作复杂的计算最后导致读者不能很好的理解这个实例程序)。
struct VS_OUTPUT
{
float4 position : POSITION;
float4 diffuse : COLOR0;
};
// Input
// Description :
// 输入结构中仅有顶点位置信息(此Shader正是仅对顶点位置进行变换)。
struct VS_INPUT
{
float2 position : POSITION;
};
// Main.(Named Ripple)
VS_OUTPUT Ripple(VS_INPUT input)
{
VS_OUTPUT output = (VS_OUTPUT)0;
float fSin;
float fCos;
// 基于时间计算 正、余弦自变量
float x = length(input.position) * sin(fTime) * 15.0f;
// 根据计算出来的 x 值获得正弦值与余弦值
sincos(x, fSin, fCos);
// 将计算出来的正弦值作为引子来变换顶点位置的 Y 分量
output.position = mul(float4(input.position.x, fSin * 0.1f, input.position.y, 1.0f), worldViewProjMat);
// 笔者认为这是粗糙的明暗面计算,没有实际的意义
output.diffuse = 0.5f - 0.5f * fCos;
return output;
};