シェーダーで板ポリゴンを光らせて遊ぶ
こういう風に板ポリゴンを光らせるピクセルシェーダーを
いつか使いたくなる時のために、
ここに置いておきます
ピクセルシェーダー
もしも、こういう風に板ポリゴンを光らせたいって人がいたら
あくまで参考程度にとどめてください
// C++側から設定されるデータ①
cbuffer ConstBuffer : register(b0)
{
float4x4 matWorld; // ワールド行列
float4x4 matView; // ビュー行列
float4x4 matProj; // プロジェクション行列
float4 color; // 色
float time; // 時間
float3 padding; // パディング
};
// C++側から設定されるデータ②
Texture2D tex : register(t0); // テクスチャ1
SamplerState samLinear : register(s0); // サンプラーステート
// このシェーダが引数として受け取るデータ
struct PS_INPUT
{
float4 pos : SV_POSITION; // 位置
float2 Tex : TEXCOORD; // UV座標
};
// HSVからRGBに変換する関数
float3 HSVtoRGB(float3 hsv)
{
float3 rgb = clamp(abs(fmod(hsv.x * 6.0 + float3(0.0, 4.0, 2.0), 6.0) - 3.0) - 1.0, 0.0, 1.0);
return hsv.z * lerp(float3(1.0, 1.0, 1.0), rgb, hsv.y);
}
float4 main(PS_INPUT input) : SV_TARGET
{
// 時間に基づいて虹色エフェクトを生成
float gradient = exp(-abs(sin(time * 1.0 + input.Tex.xy * 5.0)));
// テクスチャをサンプリング
float4 output = tex.Sample(samLinear, input.Tex);
// Hueを時間で変化させて虹色を生成
float hue = fmod(time * 0.2, 1.0); // 時間に基づいてHueを変化
float3 rainbowColor = HSVtoRGB(float3(hue, 1.0, 1.0)); // HSVからRGBに変換
// 虹色エフェクトを加える
output.rgb += gradient * rainbowColor;
// 結果を返す
return output * color;
}
最初のGIFは板ポリゴンに単純な黒い画像を貼ってるだけなので
なにか適当な画像を貼ってみます
試しにおまえの魂を光らせてみました
元から画像に色がついてるとこうなります
まとめというか感想というか
マイクラのエンチャントされたアイテムみたいな光り方も
これを応用すればできたりするんかな