C#は電気羊の夢を見るか?(引っ越し中)

dtiブログが閉鎖とのことでhttp://tanocs.blog.fc2.com/へ引っ越します。

密かなるSlimDX

最近SlimDXを始めた。

んが、しかし。
XNAとぜんぜん使い勝手が違う。
なんていうか、ラップが薄く、”楽”じゃないなぁという感じ。

しかも!なかなかと変な癖があって
Vector3.Transformの戻り値がVector4だったり、
Colorの持ち方がint型だったり、そこかしこに罠が潜んでいる。

そのあまりの違いに、まともにモデルを表示することもままならず、
途方にくれていた。


その原因はとにかくサンプルがない。
情報の殆どは英語と、なかなか敷居が高い。

たかだかインデックスバッファのサンプルを探しても、
どうやら存在しないのだから泣けてくる。

仕方ないのでDirectXのサンプルやらXNAの記憶とかを便りになんとか、
シンプルなIndexBuffer描画サンプルを作成したので、ここに置いておく。



実行結果


using SlimDX;
using SlimDX.Direct3D9;
using SlimDX.Windows;

using System.Runtime.InteropServices;

namespace IndexbufferTest
{
public partial class Form1 : Form
{
Device device;

public struct TestVertex
{
public Vector3 Position;
public Vector3 Normal;
public int Color;
}

VertexElement[] vertexElementsArray = new VertexElement[]
{
new VertexElement(0, 0, DeclarationType.Float3, DeclarationMethod.Default, DeclarationUsage.Position, 0),
new VertexElement(0, 12, DeclarationType.Float3, DeclarationMethod.Default, DeclarationUsage.Normal, 0),
new VertexElement(0, 24, DeclarationType.Color, DeclarationMethod.Default, DeclarationUsage.Color, 0)
};

Vector3[] vectors = new Vector3[] { new Vector3(-1, 0, 0),
new Vector3(0, 1, 0),
new Vector3(1, 0, 0),
new Vector3(0, -1, 0)
};

public Form1()
{
InitializeComponent();

var pp = new PresentParameters();
pp.BackBufferWidth = this.ClientSize.Width;
pp.BackBufferHeight = this.ClientSize.Height;
pp.DeviceWindowHandle = this.Handle;

this.device = new Device(new Direct3D(), 0, DeviceType.Hardware, this.Handle, CreateFlags.HardwareVertexProcessing, pp);
}

public void Run()
{
SlimDX.Windows.MessagePump.Run(this, Draw);
}

protected virtual void Draw()
{
int vertexSize = Marshal.SizeOf(typeof(TestVertex));

VertexBuffer vertexBuffer = new VertexBuffer(device, vectors.Length * vertexSize, Usage.None, VertexFormat.None, Pool.Managed);

var vertexData = new TestVertex[vectors.Length];
for (int i = 0; i < vertexData.Length; i++)
{
vertexData[i].Position = vectors[i];
vertexData[i].Normal = new Vector3(0, 0, -1);
vertexData[i].Color = Color.Gold.ToArgb();
}


IndexBuffer indexBuffer = new IndexBuffer(device, vectors.Length * sizeof(uint) * 3 - 2, Usage.None, Pool.Managed, false);
var indices = new uint[]{0, 1, 2,
0, 2, 3};

device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.CornflowerBlue, 1.0f, 0);
device.SetRenderState(RenderState.Lighting, false);
device.BeginScene();

device.VertexDeclaration = new VertexDeclaration(device, vertexElementsArray);

DataStream vertexBufferStream = vertexBuffer.Lock(0, vectors.Length * vertexSize, LockFlags.None);
vertexBufferStream.WriteRange(vertexData);
vertexBuffer.Unlock();
device.SetStreamSource(0, vertexBuffer, 0, vertexSize);

DataStream indexBufferStream = indexBuffer.Lock(0, indices.Length * sizeof(uint), LockFlags.None);
indexBufferStream.WriteRange(indices);
indexBuffer.Unlock();
device.Indices = indexBuffer;

device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, vectors.Length, 0, indices.Length / 3);

device.EndScene();
device.Present();
}
}
}
このエントリーをはてなブックマークに追加
LINEで送る

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://t01a.dtiblog.com/tb.php/137-f318fa6e

« これは便利だ・・・  | HOME |  Windows7でWindowsXPのペイントを使う »

PAGE TOP ▲

Appendix

■春条

■春条

生息地は愛知
車と甘い物が好きな31歳
特技は無限昼寝

MONOからSharpDXを使う
変態的な手法で、
.NET Frameworkを使わずに
ゲーム作りやってます。

Search

Calender

« | 2017-12 | »
S M T W T F S
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -

Twitter

Recent Entries

DTIブログポータルへ
このブログを通報
Report Abuse

利用規約