コンテンツにスキップ

シェーダーとマテリアル

ShaderProgram と Material を使って、個々のノードにカスタムシェーダーを適用できます。

シェーダーの記述方法については本ドキュメントでは解説しません。別途、GLSLのリファレンスやチュートリアルを参照してください。

ShaderProgram.Create() でビルダーを生成し、頂点シェーダーとフラグメントシェーダーのソースコードを設定した後、Compile() でコンパイルします。

var shader = ShaderProgram.Create()
.Vertex(vertexGlsl)
.Fragment(fragmentGlsl)
.Compile();

Material は ShaderProgram と uniform 変数の値をまとめたオブジェクトです。

var material = new Material(shader);
// uniform 変数を設定(インデクサー形式)
material["uTime"] = 1.0f;
material["uColor"] = new Vector4(1f, 0f, 0f, 1f);

Node.Material プロパティに Material を設定すると、そのノードの描画に適用されます。

var sprite = new Sprite(texture);
sprite.Material = material;
Root.Add(sprite);

使用例:時間で揺れるシェーダー

Section titled “使用例:時間で揺れるシェーダー”
public class ShaderScene : Scene
{
private ShaderProgram _shader;
private Material _material;
private Sprite _sprite;
private const string VertexGlsl = """
#version 330 core
layout(location = 0) in vec2 aPosition;
layout(location = 1) in vec2 aTexCoord;
out vec2 vTexCoord;
uniform mat4 uMvp;
uniform float uTime;
void main()
{
vec2 pos = aPosition;
pos.x += sin(pos.y * 0.05 + uTime * 3.0) * 4.0;
gl_Position = uMvp * vec4(pos, 0.0, 1.0);
vTexCoord = aTexCoord;
}
""";
private const string FragmentGlsl = """
#version 330 core
in vec2 vTexCoord;
out vec4 FragColor;
uniform sampler2D uTexture;
void main()
{
FragColor = texture(uTexture, vTexCoord);
}
""";
public override void OnStart()
{
var texture = App.TextureFactory.Load("assets/player.png");
_shader = ShaderProgram.Create()
.Vertex(VertexGlsl)
.Fragment(FragmentGlsl)
.Compile();
_material = new Material(_shader);
_sprite = new Sprite(texture).Location(100, 100);
_sprite.Material = _material;
Root.Add(_sprite);
}
public override void OnUpdate()
{
// 毎フレーム uniform を更新
_material["uTime"] = Time.TotalTime;
}
public override void OnDestroy()
{
_shader.Dispose();
}
}

Promete のサンプルプロジェクト(Promete.Example)には、様々なシェーダーの実装例が含まれています。

デモ内容
/graphics/materialEffect.demoMaterial とカスタムシェーダーによるノードへのエフェクト適用
/graphics/postProcess.demo画面全体へのポストプロセスエフェクト

サンプルを起動してデモを選択するか、Promete.Example/examples/graphics/ 以下のソースコードを参照してください。