マテリアル
Altseed2では描画方法をマテリアルにより拡張できます。 例えば、画像をそのまま表示するのではなく、反転させたり合成されたりスクロールしたりして表示できます。
マテリアルを使用するためには、シェーダーを先に用意する必要があります。 シェーダーはHLSLというプログラミング言語で描画方法を記述して、そのソースコードを元に生成します。
HLSLには制約があります。
- 頂点シェーダーとピクセルシェーダー間のデータ受け渡し用の構造体の定義は完全に一致する必要があります。
- サンプラーとテクスチャは隙間なく敷き詰める必要があります。
- 頂点シェーダーでテクスチャを使用する場合、ピクセルシェーダーでも同じテクスチャとサンプラーの定義を書く必要があります。
- includeはファイルからシェーダーのソースコードを読み込んだ場合のみ有効です。
シェーダーを作成し、マテリアルに設定します。 そうすると、設定されたシェーダーをマテリアルで使用して描画します。
作成したマテリアルは様々なクラスに割り当てられます。
シェーダーは、直接Altseed2が動いているプログラミング言語の文字列をソースコードとして作成する方法と、テキストファイルを読み込んで作成する方法の2種類があります。 テキストファイルを作成する手間はありますが、includeを使用できるメリットがあります。
マテリアルにはアルファブレンドを設定できます。 描画される先と描画する画像の間で、画像同士をどのように合成するかを指定できます。 下図の画像は、標準で提供されているOpacity, Normal, Add, Subtract, Multiplyの合成結果です。 これら以外にも自由に合成方法を指定できます。
using System;
using Altseed2;
namespace Sample
{
public class MaterialSample
{
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) - color.xyz;
// 算出した値を返します。
return color;
}
";
[STAThread]
static void Main(string[] args)
{
// Altseed2 を初期化します。
if (!Engine.Initialize("TextNode", 640, 480)) return;
// テクスチャを読み込みます。
var texture = Texture2D.Load(@"TestData/IO/AltseedPink256.png");
// マテリアルを作成します。
var material = Material.Create();
// マテリアルに使用するシェーダを作成します。
var shader = Shader.Create("Negative", _HlslCode, ShaderStage.Pixel);
// マテリアルにシェーダを割り当てます。
material.SetShader(shader);
// 必要な場合、アルファブレンドの種類を割り当てます。
material.AlphaBlend = AlphaBlend.Normal;
// スプライトを描画するノードを作成します。
var node = new SpriteNode();
// テクスチャを設定します。
node.Texture = texture;
// マテリアルを設定します。
node.Material = material;
// ノードを登録します。
Engine.AddNode(node);
// メインループ。
// Altseed のウインドウが閉じられると終了します。
while (Engine.DoEvents())
{
// Altseed を更新します。
Engine.Update();
}
// Altseed の終了処理をします。
Engine.Terminate();
}
}
}