ポストエフェクト
PostEffectNodeは画面やカメラに対し何らかの効果を加えて表示される映像を変化させるノードです。
組み込みポストエフェクト
グレースケール
PostEffectGrayScaleNodeは画面をグレースケール化するポストエフェクトです。
using System;
using Altseed2;
namespace Sample
{
public class PostEffectGrayScale
{
[STAThread]
static void Main(string[] args)
{
// Altseed2 を初期化します。
if (!Engine.Initialize("PostEffect - GrayScale", 640, 480)) return;
// 画像を表示するノードを作成して登録します。
// 詳しくはSpriteのサンプルを参照してください。
var node = new SpriteNode
{
Texture = Texture2D.Load(@"TestData/Graphics/flower.png"),
Scale = new Vector2F(0.5f, 0.5f)
};
Engine.AddNode(node);
// グレースケールを適用するポストエフェクトを作成して登録します。
var postEffect = new PostEffectGrayScaleNode();
Engine.AddNode(postEffect);
// メインループ。
// Altseed のウインドウが閉じられると終了します。
while (Engine.DoEvents())
{
// Altseed を更新します。
Engine.Update();
}
// Altseed の終了処理をします。
Engine.Terminate();
}
}
}
セピアカラー
PostEffectSepiaNodeは画面をセピア調にするポストエフェクトです。
using System;
using Altseed2;
namespace Sample
{
public class PostEffectSepia
{
[STAThread]
static void Main(string[] args)
{
// Altseed2 を初期化します。
if (!Engine.Initialize("PostEffect - Sepia", 640, 480)) return;
// 画像を表示するノードを作成して登録します。
// 詳しくはSpriteのサンプルを参照してください。
var node = new SpriteNode
{
Texture = Texture2D.Load(@"TestData/Graphics/flower.png"),
Scale = new Vector2F(0.5f, 0.5f)
};
Engine.AddNode(node);
// セピアを適用するポストエフェクトを作成して登録します。
var postEffect = new PostEffectSepiaNode();
Engine.AddNode(postEffect);
// メインループ。
// Altseed のウインドウが閉じられると終了します。
while (Engine.DoEvents())
{
// Altseed を更新します。
Engine.Update();
}
// Altseed の終了処理をします。
Engine.Terminate();
}
}
}
ガウスぼかし
PostEffectGaussianBlurNodeは画面にぼかしを書けるポストエフェクトです。画面が一様にぼけます。
using System;
using Altseed2;
namespace Sample
{
public class PostEffectGaussianBlur
{
[STAThread]
static void Main(string[] args)
{
// Altseed2 を初期化します。
if (!Engine.Initialize("PostEffect - GaussianBur", 640, 480)) return;
// 画像を表示するノードを作成して登録します。
// 詳しくはSpriteのサンプルを参照してください。
var node = new SpriteNode
{
Texture = Texture2D.Load(@"TestData/Graphics/flower.png"),
Scale = new Vector2F(0.5f, 0.5f)
};
Engine.AddNode(node);
// ガウスぼかしを適用するポストエフェクトを作成して登録します。
var postEffect = new PostEffectGaussianBlurNode
{
// ガウスぼかしの強さを設定します。
Intensity = 3.0f
};
Engine.AddNode(postEffect);
// メインループ。
// Altseed のウインドウが閉じられると終了します。
while (Engine.DoEvents())
{
// Altseed を更新します。
Engine.Update();
}
// Altseed の終了処理をします。
Engine.Terminate();
}
}
}
ライトブルーム
PostEffectLightBloomNodeは画面で一定以上明るい画素をぼかして加算することで、光が溢れているような表現を与えるポストエフェクトです。
具体的な処理としては元の画像から閾値を超えた画素を抽出し、閾値を超えた分の輝度をぼかして元の画像に加算しています。
using System;
using Altseed2;
namespace Sample
{
public class PostEffectLightBloom
{
[STAThread]
static void Main(string[] args)
{
// Altseed2 を初期化します。
if (!Engine.Initialize("PostEffect - LightBloom", 640, 480)) return;
// 画像を表示するノードを作成して登録します。
// 詳しくはSpriteのサンプルを参照してください。
var node = new SpriteNode
{
Texture = Texture2D.Load(@"TestData/Graphics/flower.png"),
Scale = new Vector2F(0.5f, 0.5f)
};
Engine.AddNode(node);
// ライトブルームを適用するポストエフェクトを作成して登録します。
var postEffect = new PostEffectLightBloomNode
{
// ライトブルームの強さを設定します。
Intensity = 5.0f,
Threshold = 0.5f
};
Engine.AddNode(postEffect);
// メインループ。
// Altseed のウインドウが閉じられると終了します。
while (Engine.DoEvents())
{
// Altseed を更新します。
Engine.Update();
}
// Altseed の終了処理をします。
Engine.Terminate();
}
}
}
自作ポストエフェクト
PostEffectNode, Shader, Materialのクラスを使用して、自作ポストエフェクトを実装できます。下記のサンプルでは、階調を反転させています。
HLSLのコードを記述すれば、Altseedが内部で適切に変換するため、自動的にマルチプラットフォーム対応になります。
using System;
using Altseed2;
namespace Sample
{
public class CustomPostEffect
{
[STAThread]
static void Main(string[] args)
{
// Altseed2 を初期化します。
if (!Engine.Initialize("PostEffect - Custom", 640, 480)) return;
// 画像を表示するノードを作成して登録します。
// 詳しくはSpriteのサンプルを参照してください。
var node = new SpriteNode
{
Texture = Texture2D.Load(@"TestData/Graphics/flower.png"),
Scale = new Vector2F(0.5f, 0.5f)
};
Engine.AddNode(node);
// 自作のポストエフェクトを描画するノードを作成して登録します。
var postEffect = new MyPostEffectNode();
Engine.AddNode(postEffect);
// メインループ。
// Altseed のウインドウが閉じられると終了します。
while (Engine.DoEvents())
{
// Altseed を更新します。
Engine.Update();
}
// Altseed の終了処理をします。
Engine.Terminate();
}
class MyPostEffectNode : PostEffectNode
{
const string _HlslCode = @"
struct PS_INPUT
{
float4 Position : SV_POSITION;
float4 Color : COLOR0;
float2 UV1 : UV0;
float2 UV2 : UV1;
};
Texture2D mainTex : register(t0);
SamplerState mainSamp : register(s0);
float4 main(PS_INPUT input) : SV_TARGET
{
// 入力画像のUV画像に対応するピクセルの色を取得します。
float4 color = mainTex.Sample(mainSamp, input.UV1);
// RGBの値を反転します。
color.xyz = float3(1.0, 1.0, 1.0) - color.xyz;
// 算出した値を返します。
return color;
}";
// ポストエフェクトに使用するマテリアル
private readonly Material _Material;
public MyPostEffectNode()
{
// マテリアルに使用するシェーダを作成します。
var shader = Shader.Create("Negative", _HlslCode, ShaderStage.Pixel);
// スプライトを描画するノードを作成します。
_Material = Material.Create();
// マテリアルにシェーダを割り当てます。
_Material.SetShader(shader);
}
protected override void Draw(RenderTexture src, Color clearColor)
{
// マテリアルを入力画像を設定します。
_Material.SetTexture("mainTex", src);
// マテリアルを適用します。
Engine.Graphics.CommandList.RenderToRenderTarget(_Material);
}
}
}
}