スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

頂点バッファとか。

3Dやってる人なら基本なんだろうけどきっちりまとめて描いてなかったので載せておくことにする。

シェーダは以前やったような気がするのでその手前までの流れを書くね。
普通は頂点バッファの仕様は標準で用意してあるものを使うんだろうけど、ネット上にいいサンプルが沢山あるのでそっちを見てください。
今回はシェーダに送り出すデータからしっかり作成していきます。

////////////// 頂点バッファの仕様を決める //////////////
public struct MyVertex
{
public Vector2 Position;
public Vector2 UV;
public MyVertex(Vector2 position, Vector2 uv)
{
Position = position;
UV = uv;
}
}
//C#の構造体はメモリの順番は保持されるそうなので安心。


////////////// 頂点バッファの作成 //////////////
const int numVertices = 4;
vb = new VertexBuffer(
graphics.GraphicsDevice, //この頂点バッファーに関連付けるグラフィック デバイス。
typeof(MyVertex),//この頂点バッファーの頂点の型。
numVertices,//この頂点バッファーの要素の数。
ResourceUsage.None,//この頂点バッファー リソースの動作を特定するオプション。
ResourceManagementMode.Automatic);//?
//↑今のバージョン(3.0)だと最後の二個が変わってるから注意。

MyVertex[] vertices = new MyVertex[numVertices]
{
new MyVertex(
new Vector2(-1.0f, 1.0f), new Vector2(0.0f, 1.0f) ), // 左上
new MyVertex(
new Vector2( 1.0f, 1.0f), new Vector2(1.0f, 1.0f) ), // 右上
new MyVertex(
new Vector2( 1.0f, -1.0f), new Vector2(1.0f, 0.0f) ), // 右下
new MyVertex(
new Vector2(-1.0f, -1.0f), new Vector2(0.0f, 0.0f) ), // 左下
};
vb.SetData(vertices);



////////////// 頂点ストリームへ //////////////
int vertexStride;
//VertexBuffer.SetDataによってコピーした内容は、マネージヒープ中での値型配列レイアウトと同じになるためsizeof演算子を用いておけばいい
unsafe { vertexStride = sizeof(MyVertex); }
// Vertices[0]は0番目の頂点ストリームに対応
graphics.GraphicsDevice.Vertices[0].SetSource(vb, 0, vertexStride);



////////////// ストリームとシェーダの対応表を作成 //////////////

vertexDecl = new VertexDeclaration(
graphics.GraphicsDevice, new VertexElement[] {
new VertexElement(
0, 0, VertexElementFormat.Vector2,
VertexElementMethod.Default,
VertexElementUsage.Position, 0),//シェーダででてくるPosition0とかいうのはこれね。
new VertexElement(
0, 8, VertexElementFormat.Vector2,
VertexElementMethod.Default,
VertexElementUsage.TextureCoordinate, 0),
});


VertexElementの内容は以下

VertexElement(
  ストリーム番号,
要素先頭からのバイト・オフセット,
データ型,
  テッセレーション属性,
  用途,
同一用途の区別用ID)



これでとりあえず書き出す前の処理は整ったことになる。
あとはよく見るサンプルのようにセットして書き出す処理を記述してやればよいことになる。

本とかではいきなり3Dプリミティブを写すサンプルが載っていたりするけど、自分としては

CPUとGPUの仕組みを理解する

超簡単なシェーダを作成してスクリーン上に2Dの線を引く

2Dで図形を書く

3D画像は情報を2D情報に押しつぶして描写しているだけだと説明する

3Dを2Dで表現する方法を説明する(仕組みではなく関数の使い方)

3Dプリミティブの表示


としなければいけないと思う。
勘で気付け!ってことなのかもしれないけれど。バカだったらどうすんのさ!!(俺みたいに)



ねよっと。

コメントの投稿

非公開コメント

プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。