スポンサーサイト

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

Managed DirectX メモ

ビットマップから切り出してテクスチャを作成
テクスチャはDDSで持つと読み込みが楽ですが、そうでない時用
流れとしては
・Bitmap()で読み込み
・イメージをbyte[]で得る
・テクスチャをUsage.Dynamic、Pool.SystemMemoryで作成
・テクスチャをロックして内容を設定する
・Pool.ManagedもしくはPool.Defaultにテクスチャを作成し、そこに転送する
最終的なテクスチャをPool.Managedにすればデバイスロスト時になにもしなくて済む
テクスチャ転送時にDxt5とかにフォーマット変換することができるが、
そういうテクスチャは元からDDSで持ったほうがいい。

テクスチャをロックして転送するコードは以下のような感じ

public Texture CreateTexture(Device device, ref byte[] image, int stride, Rectangle rect)
{
Texture dst_texture = null;
Size tex_size = new Size(rect.Width, rect.Height);
using(Texture texture = new Texture(device, tex_size.Width, tex_size.Height,
1, Usage.Dynamic, Format.R5G6B5, Pool.SystemMemory) ){
// テクスチャをロック
UInt16[,] buf = (UInt16[,])texture.LockRectangle(typeof(UInt16),
0,
LockFlags.Discard,
m_size.Height, m_size.Width);

// 内容を設定
int index = (stride * rect.Y) + (rect.X * sizeof(UInt16));
for(int y=0; y for(int x=0; x buf[y, x] = (UInt16)((image[index + x*sizeof(UInt16) + 1] << 8)
| (image[index + x*sizeof(UInt16) + 0] << 0));
}
index += stride;
}
texture.UnlockRectangle(0);

// テクスチャを転送
dst_texture = CreateTextureFromTexture(device, texture);
}
return dst_texture;
}

public Texture CreateTextureFromTexture(Device device, Texture src_texture)
{
if(device == null) return null;
if(src_texture == null) return null;

try{
// 同じサイズで同じフォーマットのテクスチャを作成する
SurfaceDescription d = src_texture.GetLevelDescription(0);
Texture dst_texture = new Texture(device, d.Width, d.Height,
1, Usage.None, d.Format, Pool.Managed);

// 単純にコピー
Surface dst = dst_texture.GetSurfaceLevel(0);
Surface src = src_texture.GetSurfaceLevel(0);
SurfaceLoader.FromSurface(dst, src, Filter.None, 0);
dst.Dispose();
src.Dispose();

// 出来上がったテクスチャを返す
return dst_texture;
}catch{
// 失敗
return null;
}
}
スポンサーサイト

テーマ : プログラミング - ジャンル : コンピュータ

海域情報収集

海域情報収集

交易MAP C#のおまけとして 海域情報収集 を作ってみました。
このアプリケーションは
・したらば掲示板の安全海域情報スレッド
・大航海時代オンラインまとめwiki(統括)
から海域情報を取得します。

取得した情報はドラッグ&ドロップで交易MAP C#に反映させることができます。
ドラッグ&ドロップの仕様は以下の通りです。
・フォーマットは DataFormats.Text
・変動状況をクリップボードにコピーボタンを押したときにクリップボードにコピーされる内容そのままを渡す

得られた情報は変動がいつ終了するのかを知る程度な気がしないでもないですが、
プレイするサーバ以外の変動状況を眺めてニヤニヤしたりできるかもしれません。よう分からんけど
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。