PC用眼鏡【管理人も使ってますがマジで疲れません】 解約手数料0円【あしたでんき】 Yahoo 楽天 NTT-X Store

無料ホームページ 無料のクレジットカード 海外格安航空券 ふるさと納税 海外旅行保険が無料! 海外ホテル

log

2011.11.14 C++:Grass Shader


今日はHLSLでGrass Shaderを実装してみました。もうちょっと実装するのに時間が
かかるかなと思ってましたが、、構想から完成まで1日でできてしまいました笑。

以前作成したAtmospheric Scattering Shaderと併用できるようにソースもなるべく
簡素に設計してみたため、今回はお手軽サイズということでソースを公開してみたいと
思います。基本的にほぼオリジナルな設計なので、どこかのライセンスとかには引っか
かっていない…はずです。使ってみたいという方はご自由にどうぞ~。

 // 草の傾きを時間経過で変化させる係数(0~1)
 float GrassWaveTime = 0.0f;
 // 草の傾きのスケール係数の逆数
 float InvGrassWaveScale = 1 / 200.0f;
 // 草の最大傾斜角度[ラジアン]
 float RotateRange = 20.0f
 * 0.017453292519943295769236907684886f;
 // 回転量[ラジアン](-RotateRange~+RotateRange)を取得
 // cf.frac()だけだと端を超えた場合に反対側に飛んで
 // しまうため( abs(frac(x)-0.5f) * 4 - 1 )で補正し、
 // frac(x)の値が0,1の場合は+RotateRange側、frac(x)の
 // 値が0.5の場合は-RotateRange側に傾くようにしている。
 float RotValue = ( abs( frac(
 (IN.Pos.x + IN.Pos.z) * InvGrassWaveScale + GrassWaveTime
 ) - 0.5f ) * 4 - 1 ) * RotateRange;
 // Cos,Sinを計算
 float2 CosSin;
 sincos( RotValue, CosSin.x, CosSin.y );
 // Z軸回転による座標増分値を計算
 // cf.Z軸回転は(xcos-ysin,xsin+ycos,z)だが、ここでは
 // (x,y,z)は(0,1,0)なのでy成分以外は0に省略できる。
 // また、AddPos.yの最大値は0になってほしいためy成分を
 // 1引いている。
 float3 AddPos = float3(
 -CosSin.x,
 CosSin.y - 1,
 0.0f
 );
 // Y軸座標値が大きいほど回転するようにスケーリング
 AddPos *= IN.pos.y;
 // 回転による移動値分だけ座標を変更
 Out.Pos += AddPos;

日記の使用上、インデントが汚いのは仕方ないところですね;それとこれ以外に傾きが
大きいほど頂点カラーが暗くなるように設定してたりしますが、ちょっとまだ怪しい設計
だったりするので、その部分だけカットしておきました。

いつもは新しい設計にすごく時間かかる癖に、たまにこういうことがあるんですよね。