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

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

SlimDXでeffectが使える2D描画の方法

偉そうに書いているが、TEXCOORD周りが厳密には間違っている気がする。
見たところの動作は良好。

この実装では必ずClientサイズとTextureサイズが等しいこと。
RenderTargetから値を持ってきた時を想定しているので、この形に。

Effectまわりは自分で追加してくりゃれ。


[StructLayout(LayoutKind.Sequential)]
struct Vertex
{
public const VertexFormat Format = VertexFormat.Position | VertexFormat.Texture1;

public Vector3 Position;
public Vector2 TextureCoordinate;
}

public partial class Form1 : Form
{
// Direct3D9 Device
static Device _device;
// テクスチャ
static Texture _texture;
// テクスチャ描画用の頂点バッファ
static VertexBuffer _vertices;

public Form1()
{
InitializeComponent();

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

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

// カラー成分の設定
_device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.SelectArg1);
_device.SetTextureStageState(0, TextureStage.ColorArg1, TextureArgument.Texture);
// アルファ成分の設定
_device.SetTextureStageState(0, TextureStage.AlphaOperation, TextureOperation.SelectArg1);
_device.SetTextureStageState(0, TextureStage.AlphaArg1, TextureArgument.Texture);
// ブレンディングモードの設定
_device.SetRenderState(RenderState.AlphaBlendEnable, true);
_device.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
_device.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha);


// テクスチャを sample.png から読み込む
_texture = Texture.FromFile(_device, "test.bmp", 0, 0, 1, Usage.None, Format.A8R8G8B8, Pool.Managed, Filter.None, Filter.None, 0);

var description = _texture.GetSurfaceLevel(0).Description;

// 頂点のサイズ (バイト)
int vertexSize = Marshal.SizeOf(typeof(Vertex));
// 頂点バッファを作成
_vertices = new VertexBuffer(_device, 4 * vertexSize, Usage.WriteOnly, Vertex.Format, Pool.Managed);
// 頂点バッファをロック
var dataStream = _vertices.Lock(0, 4 * vertexSize, LockFlags.None);

// テクスチャ座標の指定
float x1 = 0.5f / description.Width;
float y1 = 0.5f / description.Height;
float x2 = (pp.BackBufferWidth + 0.5f) / description.Width;
float y2 = (pp.BackBufferHeight + 0.5f) / description.Height;

// 頂点バッファにデータを書き込む
dataStream.WriteRange(new[] {
new Vertex { Position = new Vector3(-1.0f, 1.0f, 0.0f), TextureCoordinate = new Vector2(x1, y1) },
new Vertex { Position = new Vector3(1.0f, 1.0f, 0.0f), TextureCoordinate = new Vector2(x2, y1) },
new Vertex { Position = new Vector3(-1.0f, -1.0f, 0.0f), TextureCoordinate = new Vector2(x1, y2) },
new Vertex { Position = new Vector3(1.0f, -1.0f, 0.0f), TextureCoordinate = new Vector2(x2, y2) },
});

// 頂点バッファをアンロック
_vertices.Unlock();
}

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

void Draw()
{
// 画面をクリアする
_device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.CornflowerBlue, 1.0f, 0);


_device.BeginScene();

// 描画する頂点バッファを指定する
_device.SetStreamSource(0, _vertices, 0, Marshal.SizeOf(typeof(Vertex)));

// 頂点バッファのフォーマットを指定する
_device.VertexFormat = Vertex.Format;

// テクスチャを指定
_device.SetTexture(0, _texture);

// 描画する
_device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);

_device.EndScene();

// 表画面に描画内容を転送
_device.Present();
}

このエントリーをはてなブックマークに追加
LINEで送る

超ニッチなエクセルグラフの作り方

一体どこに需要があるかさっぱり解りませんが、
「2軸上の折れ線と積み上げ棒グラフ」の作成と、
その調整方法をメモ


グラフ作成時に[ユーザー設定]→[2軸上の折れ線と縦棒]から
[2軸上の折れ線と積み上げ縦棒]にする方法は、
適当な棒グラフを右クリック→「グラフの種類」→「縦棒」→「積み上げ縦棒」とすればOK

ここから、折れ線グラフになってしまった値は、
対象の折れ線グラフを右クリック→データ系列の書式設定→軸のタブ→第2軸から主軸
さらに、棒グラフを右クリック→「グラフの種類」→「縦棒」→「積み上げ縦棒」とすればOK

そこからさらに順番を変更したい場合は
適当な棒グラフを右クリック→データ系列の書式設定→系列の順序タブ→上へ移動、下へ移動ボタン


軸を調整せずに見た目だけ変更していると、この順番が変更できず、
まるで項目が表示されていないように見えるのでハマった。
このエントリーをはてなブックマークに追加
LINEで送る

 | HOME | 

PAGE TOP ▲

Appendix

■春条

■春条

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

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

Search

Calender

« | 2011-10 | »
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

利用規約