差分

ナビゲーションに移動 検索に移動

固定機能シェーダー

6,444 バイト除去, 2017年11月7日 (火) 10:40
編集の要約なし
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/クラスライブラリ/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列挙体BasicEffectクラス|IndexElementSize列挙体]]が食い違わないように注意すること。また[[配列]]の[[オーバーフローBasicEffectクラス]]にも注意。<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プログラマブルシェーダー]]
匿名利用者

案内メニュー