シェーダーとマテリアル
ShaderProgram と Material を使って、個々のノードにカスタムシェーダーを適用できます。
シェーダーの記述方法については本ドキュメントでは解説しません。別途、GLSLのリファレンスやチュートリアルを参照してください。
ShaderProgram の作成
Section titled “ShaderProgram の作成”ShaderProgram.Create() でビルダーを生成し、頂点シェーダーとフラグメントシェーダーのソースコードを設定した後、Compile() でコンパイルします。
var shader = ShaderProgram.Create() .Vertex(vertexGlsl) .Fragment(fragmentGlsl) .Compile();Material の作成
Section titled “Material の作成”Material は ShaderProgram と uniform 変数の値をまとめたオブジェクトです。
var material = new Material(shader);
// uniform 変数を設定(インデクサー形式)material["uTime"] = 1.0f;material["uColor"] = new Vector4(1f, 0f, 0f, 1f);ノードへの適用
Section titled “ノードへの適用”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(); }}サンプルプログラム
Section titled “サンプルプログラム”Promete のサンプルプロジェクト(Promete.Example)には、様々なシェーダーの実装例が含まれています。
| デモ | 内容 |
|---|---|
/graphics/materialEffect.demo | Material とカスタムシェーダーによるノードへのエフェクト適用 |
/graphics/postProcess.demo | 画面全体へのポストプロセスエフェクト |
サンプルを起動してデモを選択するか、Promete.Example/examples/graphics/ 以下のソースコードを参照してください。
- ポストプロセス - 画面全体へのエフェクト適用