ページ「MonoGame/クラスライブラリ/IndexBufferクラス」と「固定機能シェーダー」の間の差分

提供: MonoBook
< MonoGame‎ | クラスライブラリ(ページ間の差分)
ナビゲーションに移動 検索に移動
imported>Administrator
 
imported>Administrator
 
1行目: 1行目:
IndexBufferクラスは、[[ポリゴン]]を表示するのに使う[[頂点バッファ]]の無駄を省く[[インデックスバッファ]]を効率的に管理するクラスである。
+
'''固定シェーダー'''とは、[[ゲームフレームワーク]][[ゲームエンジン]]などに標準搭載されている固定機能の[[シェーダー]]のことである。
[[MonoGame/クラスライブラリ/VertexBufferクラス|VertexBufferクラス]]と同様に[[グラフィックボード]]上の[[VRAM]]に事前に展開しておくなどの機能を持つ。
+
対義語は「[[プログラマブルシェーダー]](環境によってはカスタムエフェクトなどとも呼ばれる)」。
  
== 継承 ==
+
素人に[[プログラマブルシェーダー]]など書けるわけもなく、そんなものを書いている時間があるなら、まず[[ゲーム]]の本編を作ろう。
* System.Object
+
そもそも定番の描画処理はわざわざ[[プログラマブルシェーダー]]を持ち出すまでもない。
** [[MonoGame/クラスライブラリ/GraphicsResourceクラス|Microsoft.Xna.Framework.Graphics.GraphicsResource]]
 
*** [[MonoGame/クラスライブラリ/IndexBufferクラス|Microsoft.Xna.Framework.Graphics.IndexBuffer]]
 
**** [[MonoGame/クラスライブラリ/DynamicIndexBufferクラス|Microsoft.Xna.Framework.Graphics.DynamicIndexBuffer]]
 
  
== 名前空間 ==
+
[[MonoGame]]でいえば「[[MonoGame/クラスライブラリ/BasicEffectクラス|BasicEffectクラス]]」などがこれに相当する。
* [[MonoGame/クラスライブラリ/Microsoft.Xna.Framework.Graphics名前空間|Microsoft.Xna.Framework.Graphics名前空間]]
 
 
 
== 構文 ==
 
public class IndexBuffer : GraphicsResource
 
 
 
== コンストラクタ ==
 
{| class="wikitable"
 
|+
 
!
 
! 名称
 
! 概要
 
|-
 
| protected
 
! style="white-space:nowrap;text-align:left" | IndexBuffer(GraphicsDevice, Type, int, BufferUsage, bool)
 
|
 
|-
 
| protected
 
! style="white-space:nowrap;text-align:left" | IndexBuffer(GraphicsDevice, IndexElementSize, int, BufferUsage, bool)
 
|
 
|-
 
| public
 
! style="white-space:nowrap;text-align:left" | IndexBuffer(GraphicsDevice, IndexElementSize, int, BufferUsage)
 
|
 
|-
 
| public
 
! style="white-space:nowrap;text-align:left" | IndexBuffer(GraphicsDevice, Type, int, BufferUsage)
 
|
 
|}
 
 
 
== プロパティ ==
 
{| class="wikitable"
 
|+
 
!
 
! 名称
 
! 概要
 
|-
 
| public
 
! style="white-space:nowrap;text-align:left" | BufferUsage
 
|
 
|-
 
| public
 
! style="white-space:nowrap;text-align:left" | GraphicsDevice
 
| (GameResourceクラスから継承)
 
|-
 
| public
 
! style="white-space:nowrap;text-align:left" | IndexCount
 
|
 
|-
 
| public
 
! style="white-space:nowrap;text-align:left" | IndexElementSize
 
|
 
|-
 
| public
 
! style="white-space:nowrap;text-align:left" | IsDisposed
 
| (GameResourceクラスから継承)
 
|-
 
| public
 
! style="white-space:nowrap;text-align:left" | Name
 
| (GameResourceクラスから継承)
 
|-
 
| public
 
! style="white-space:nowrap;text-align:left" | Tag
 
| (GameResourceクラスから継承)
 
|}
 
 
 
== メソッド ==
 
{| class="wikitable"
 
|+
 
!
 
! 名称
 
! 概要
 
|-
 
| public
 
! style="white-space:nowrap;text-align:left" | Dispose()
 
|  (GameResourceクラスから継承)
 
|-
 
| protected
 
! style="white-space:nowrap;text-align:left" | Dispose(bool)
 
| 派生クラスを作る場合は自前管理のリソースの破棄を実装する必要がある。
 
|-
 
| protected
 
! style="white-space:nowrap;text-align:left" | Finalize
 
|  (GameResourceクラスから継承)
 
|-
 
| public
 
! style="white-space:nowrap;text-align:left" | GetData<T>(int, T[], int, int)
 
| このインデックスバッファからインデックスを取得する。
 
|-
 
| public
 
! style="white-space:nowrap;text-align:left" | GetData<T>(T[], int, int)
 
 
|-
 
| public
 
! style="white-space:nowrap;text-align:left" | GetData<T>(T[])
 
 
|-
 
| protected internal
 
! style="white-space:nowrap;text-align:left" | GraphicsDeviceResetting
 
| GraphicsDeviceがリセットされGPU上のリソースを再作成する必要があるときに呼ばれる。
 
|-
 
| public
 
! style="white-space:nowrap;text-align:left" | SetData<T>(T[], int, int)
 
| この頂点バッファに頂点データを設定する。大雑把に言えば頂点データの配列をメインメモリからVRAMにコピーする。
 
|-
 
| public
 
! style="white-space:nowrap;text-align:left" | SetData<T>(T[])
 
|
 
|-
 
| public
 
! style="white-space:nowrap;text-align:left" | SetData<T>(int, T[], int, int)
 
|
 
|-
 
| protected
 
! style="white-space:nowrap;text-align:left" | SetDataInternal<T>
 
 
|-
 
| public
 
! style="white-space:nowrap;text-align:left" | ToString
 
|  (GameResourceクラスから継承)
 
|}
 
 
 
== イベント ==
 
{| class="wikitable"
 
|+
 
!
 
! 名称
 
! 概要
 
|-
 
| public
 
| Disposing
 
| (GameResourceクラスから継承)
 
|}
 
 
 
== 使用例 ==
 
まず[[MonoGame/クラスライブラリ/VertexBufferクラス|VertexBuffer]]を作ってSetDataする。
 
次にIndexBufferを作ってSetDataする。
 
IndexBufferは配列型と[[MonoGame/クラスライブラリ/IndexElementSize列挙体|IndexElementSize列挙体]]が食い違わないように注意すること。また[[配列]]の[[オーバーフロー]]にも注意。
 
<source lang="csharp">
 
            // 頂点データを作成する
 
            var vertices = new VertexPositionColor[4];
 
            vertices[0] = new VertexPositionColor(new Vector3(-10, -10, 0), Color.Red);
 
            vertices[1] = new VertexPositionColor(new Vector3(-10, +10, 0), Color.Green);
 
            vertices[2] = new VertexPositionColor(new Vector3(+10, +10, 0), Color.White);
 
            vertices[3] = new VertexPositionColor(new Vector3(+10, -10, 0), Color.Blue);
 
 
 
            // 頂点データをGPUに送り込む
 
            _vertexBuffer = new VertexBuffer(_graphics.GraphicsDevice, VertexPositionColor.VertexDeclaration, vertices.Length, BufferUsage.None);
 
            _vertexBuffer.SetData(vertices);
 
 
 
            // 16ビット配列のインデックスバッファを作成する
 
            var indeces = new short[6];
 
            indeces[0] = 0; indeces[1] = 1; indeces[2] = 2;
 
            indeces[3] = 0; indeces[4] = 2; indeces[5] = 3;
 
 
 
            // インデックスデータをGPUに送り込む
 
            _indexBuffer = new IndexBuffer(_graphics.GraphicsDevice, IndexElementSize.SixteenBits, indeces.Length, BufferUsage.None);
 
            _indexBuffer.SetData(indeces);
 
</source>
 
 
 
描画するときは、GraphicsDeviceクラスのSetVertexBufferメソッドでVertexBufferを読み出し、続いてGraphicsDevice.Indicesプロパティに[[インデックスバッファ]]を設定し、DrawIndexedPrimitivesメソッドで描画する。
 
<source lang="csharp">
 
            // 描画
 
 
 
            _graphics.GraphicsDevice.SetVertexBuffer(_vertexBuffer);
 
            _graphics.GraphicsDevice.Indices = _indexBuffer;
 
 
 
            foreach (var pass in _effect.CurrentTechnique.Passes)
 
            {
 
                pass.Apply();
 
                _graphics.GraphicsDevice.DrawIndexedPrimitives(
 
                    PrimitiveType.TriangleList, // 三角形の秘密はね…
 
                    baseVertex: 0, // vertex側のはじまり
 
                    startIndex: 0, // index側のはじまり
 
                    primitiveCount: _indexBuffer.IndexCount / 3 // 全部三角形なので単純に3で割る
 
                );
 
            }
 
</source>
 
  
 
== 関連項目 ==
 
== 関連項目 ==
* [[インデックスバッファ]]
+
* [[プログラマブルシェーダー]]
* [[MonoGame/クラスライブラリ/GraphicsResourceクラス]]
 
** [[MonoGame/クラスライブラリ/VertexBufferクラス]]
 
** [[MonoGame/クラスライブラリ/IndexBufferクラス]]
 
* [[MonoGame/クラスライブラリ/IVertexTypeインターフェイス]]
 
** [[MonoGame/クラスライブラリ/VertexPositionColor構造体]]
 
** [[MonoGame/クラスライブラリ/VertexPositionTexture構造体]]
 
** [[MonoGame/クラスライブラリ/VertexPositionColorTexture構造体]]
 
** [[MonoGame/クラスライブラリ/VertexPositionNormalTexture構造体]]
 
 
 
[[category: MonoGame]]
 

2017年11月7日 (火) 10:40時点における版

固定シェーダーとは、ゲームフレームワークゲームエンジンなどに標準搭載されている固定機能のシェーダーのことである。 対義語は「プログラマブルシェーダー(環境によってはカスタムエフェクトなどとも呼ばれる)」。

素人にプログラマブルシェーダーなど書けるわけもなく、そんなものを書いている時間があるなら、まずゲームの本編を作ろう。 そもそも定番の描画処理はわざわざプログラマブルシェーダーを持ち出すまでもない。

MonoGameでいえば「BasicEffectクラス」などがこれに相当する。

関連項目