スポンサーサイト

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

「インデックス付き頂点ブレンディング」 をやってみた(DirectX)

インデックス付き頂点ブレンディングをやってみました。
(毎度の如く、記事の最後にソースコードも添付します。)

前回は、インデックス無しで頂点ブレンディングをやったのですが、
そのインデックス無しよりも、インデックス付きの方が便利だと思います。

【参考URL】頂点ブレンディングをやってみた(DirectX)
↑前回やった、頂点ブレンディングについての記事。

で、何が便利なのか?と言うと、
まず、ただの頂点ブレンディングだと 影響度を設定した順に行列が適用されるので、
全く違う行列を使いたい場合は行列をセットし直さないといけないのです。

例えば、下記の様な場合
struct MY_VERTEX{
D3DXVECTOR3 p;
float weight1;
float weight2;
float weight3;
DWORD color;
};

MY_VERTEX v2[] = { {D3DXVECTOR3(-1.0f, 2.0f, 0.0f), 0.2f,0.3f,0.4f, 0xffff0000},
//以下略 };


D3DXMATRIX matA, matB, matC, matD;

//回転、拡大縮小などの 詳しい行列の設定は省略。

g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(0),&matA);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(1),&matB);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(2),&matC);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(3),&matD);
頂点は
--------------------------------------------------------
行列A(matA)に 0.2
行列B(matB)に 0.3
行列C(matC)に 0.4
行列D(matD)に 0.1  (1.0f - 0.2f - 0.3f - 0.4f= 0.1f)
--------------------------------------------------------
の影響を受けながら動く事になります。

行列の組み合わせが一緒で、影響度だけが違う場合は、
↓このように一度に描画できるのですが、
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(0),&matA);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(1),&matB);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(2),&matC);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(3),&matD);
g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 6, v2, sizeof(MY_VERTEX));


もし、行列の組み合わせが違う場合は、
一回それぞれの行列を別の行列にセットし直さないといけないのです。

[ 行列A 行列B 行列C 行列D ]の組み合わせで動くポリゴンAと、
[ 行列W 行列X 行列Y 行列Z ]の組み合わせで動くポリゴンBがあるとき、

ポリゴンAを描画した後、
D3DTS_WORLDMATRIX(0)~D3DTS_WORLDMATRIX(3)に
行列WXYZを設定しなおし
てポリゴンBを描画する事になります。

g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(0),&matA);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(1),&matB);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(2),&matC);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(3),&matD);
g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 6, pA, sizeof(MY_VERTEX));

g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(0),&matW);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(1),&matX);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(2),&matY);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(3),&matZ);
g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 6, pB, sizeof(MY_VERTEX));

【参考画像】
インデックス付き

で、何でこんな面倒な事になっているかと言うと、
セットする行列が0~3までで固定になっているからです。

なので、4種類以上の行列を使う場合は、行列をセットしなおす必要が出てくるのです。

それに対し、インデックス付きの場合だと
0~255までの行列群を番号で指定できるので
行列をセットしなおす必要がありません。


先ほどの例で言うと、
まず使う行列を全て0~255のどれかにセットしておきます。
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(0),&matA);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(1),&matB);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(2),&matC);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(3),&matD);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(4),&matW);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(5),&matX);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(6),&matY);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(7),&matZ);

そして、ポリゴンAでは「0番~3番を使います」
ポリゴンBでは「4番~7番を使います」と指定してやれば

もう0番~3番の行列セットの中だけでやりくりする必要は無くなるのです。
(いちいち別の行列でセットしなおす必要なし)

【参考URL】インデックス付き頂点ブレンディング

~インデックス付き頂点ブレンディングのやり方~

--------------------------------------------------------------
【1】インデックス付き頂点ブレンディングを有効にする
【2】任意の数の行列 でのブレンディングを有効にする
【3】重みとインデックスを含む構造体を定義
【4】行列をセットする。
【5】SetFVF関数を呼ぶ。
【6】DrawPrimitiveUPで描画。

--------------------------------------------------------------
(他にも描画関数がありますが、今回はDrawPrimitiveUP関数を使います。)


【1】インデックス付き頂点ブレンディングを有効にする
有効にするには、SetRenderState関数で下記のフラグを指定してやればOKです。
g_pD3DDevice->SetRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, TRUE );


【2】任意の数の行列 でのブレンディングを有効にする
タダの頂点ブレンディングの時と同じように、
いくつの行列で頂点を動かすかを設定します。
g_pD3DDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_1WEIGHTS );
前回述べたように、
第二引数で指定する値は影響を与える行列の数 - 1になります。
2つの行列を使う予定なので、 D3DVBF_1WEIGHTSを指定してます。)


【3】重みとインデックスを含む構造体を定義
struct MY_VERTEX{
D3DXVECTOR3 p;
float weight1;
DWORD matrixIndices;
DWORD color;
};

タダの頂点ブレンディングと違うところは、
重みの後にDWORD型の変数を持ってきます。
このDWORD型の変数で、使用する行列の番号を指定します。

DWORD型は、32ビット(4バイト)なので、
1バイトずつ使って最大4つの行列の番号を指定します。

【参考画像】
インデックス付き2

画像を見ても分かるように、右からindex0~3と並んでます。
(左からではないので注意!)

なので、
-----------------------------------------------
行列A・・・影響度0.2   行列B・・・影響度0.3
行列C・・・影響度0.4   行列D・・・影響度0.1
-----------------------------------------------
と設定したい時は下記の様になります。


struct MY_VERTEX{
D3DXVECTOR3 p;
float weight1;
float weight2;
float weight3;
DWORD matrixIndices;
DWORD color;
};

MY_VERTEX mv[] = {D3DXVECTOR3(-1.0f,1.0f,0.0f), 0.2f,0.3f,0.4f, 0x03020100, 0xffff0000};

g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(0),&matA);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(1),&matB);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(2),&matC);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(3),&matD);

※インデックスを指定する部分は0x03020100と右からの順になってます。


【4】行列をセットする。
既に何回も記述されてますが、行列はD3DTS_WORLDMATRIXマクロを使って指定します。
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(0),&matA);


今まで0~3と順番にセットしてきましたが、別に順番にしなくてもOKです。
いきなり35番とか指定しても問題なし。
(但し、0~255までの間。)


【5】SetFVF関数を呼ぶ。
前述の構造体の場合は、
------------------
・頂点
・重み3つ
・インデックス
・頂点色
------------------
で構成されているので、頂点フォーマットのフラグはこのようになります。↓
#define MY_VERTEX_FVF (D3DFVF_XYZB4 | D3DFVF_DIFFUSE | D3DFVF_LASTBETA_UBYTE4)


タダの頂点ブレンディングと違い、インデックス情報がつくので
D3DFVF_LASTBETA_UBYTE4というフラグが増えてます。

あと頂点ブレンディングの時は、構造体に含まれるweightの数 = フラグで指定する値
だったんですけど、
#define MY_VERTEX_FVF (D3DFVF_XYZB1 | D3DFVF_DIFFUSE)
struct MY_VERTEX{
D3DXVECTOR3 p;
float weight1;
DWORD color;
};

#define MY_VERTEX_FVF (D3DFVF_XYZB2 | D3DFVF_DIFFUSE)
struct MY_VERTEX{
D3DXVECTOR3 p;
float weight1;
float weight2;
DWORD color;
};

インデックス付き頂点ブレンディングの場合は、
構造体のweightの数 + 1 = フラグの値
になるようです。

※さっきweight数が3の構造体の場合のFVFの定義を書きましたが、
フラグの方は D3DFVF_XYZB4 になっているはずです。

【6】DrawPrimitiveUPで描画。
あとは通常通り描画するだけです。
特にコレと言った留意点も無いので省略。

【ソースコード】Sample_IndexedBlending.txt



※環境によっては頂点ブレンディングをサポートしてない場合があるらしいので、
まずは、サポートしているかを調べた方が良さそうです。
調べる方法↓

【参考URL】インデックス付き頂点ブレンディングのサポートの判定
(ページの中間ぐらいに記載されてます。)
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

ジャンプ17号感想

●ワンピース
数多くの人たちの手助けがありながら
ルフィ達は危険な状況にあったのですが、

そんなルフィ達を救ってくれたのはコビーでした。
(図らずも、ではありますが)

コビーの必死の訴えにより、黄猿、赤犬などの大将クラスの人たちまでが
動作停止。

単純な叫び声ではなく、悲愴感など様々な感情を込めた決死の訴えだったからこそ
動きを止められたのでしょう。
(コビーすごい)

で、最後になぜか「四皇」の方々が到着。
(話を聞くに、戦争を終わらせに来た、との事。)

あとベン・ベックマンという方が、黄猿にピストルを向けたのに対し
黄猿が降参のポーズを取っているのですが、これは一体・・・?

撃ったら黄猿は死んでしまうのでしょうか?
(覇気か何かで黄猿に致命的なにダメージを与えられる のかもしれない)


●トリコ
トミーロッドさんの切り札が出ました。
"パラサイトエンペラー"という生物のようです。

以前、トリコの腕が凍った描写があったので、
「一体どんな自然現象なんだろう?」と思っていたのですが、
ただの変な虫の仕業だった模様。

この虫は微妙に可愛げのある顔してますね。
(銀魂のパン・・・デモニウムさんを髣髴とさせる)

そして無駄にデカイ。
体の何処に入っていたのか?と思えるぐらい。
("瞬時に孵化"というレベルを超えてるような)

トミーロッドさんは※1 『俺の胃袋は宇宙だ』 を地で行く方ですね。
----------------------------------------------------------------------
※1 昔々、草薙剛さん主演の「フードファイト」というドラマがあったのですが、
そのドラマでの決めゼリフです。
訳あって、謎の妹を残したまま打ち切りになってしまいました。
(結構 好きなドラマだった・・・)
----------------------------------------------------------------------

そして、どうやらスープは美食カイの人たちに取られてしまったみたいですね。
まぁでも、ここでもトリコ達が勝利すると
「今後、何かあっても トリコ達が美食カイを倒したりしてどうにかなるんじゃない?」
みたいなマンネリ感が出たと思うので、バランス的に良かったとおもいます。
(以前も言いましたが、
    野球で言うと 11対0 よりも 5対6 ぐらいの試合の方が面白いと思う。)

小松さんは耳から血を流してますが、 多分 生きているでしょう。
(物凄く前回の クラッカー自滅事件を思い起こさせはしますが)


●ブリーチ
ブリーチは一体死神と何の子供なのでしょう?
----------------------------------------------------------
【1】死神 と 人間
【2】死神 と 死神
【3】死神 と 滅却師(クインシー)
【4】死神 と 虚(ホロウ)
【5】死神 と 王族

----------------------------------------------------------
確か一護は、精神世界で白い一護が存在したりしてるんですよね。
これを考えると【4】でしょうか。

で、浦原喜助さんが開発した崩玉は愛染様の体に埋め込まれているのですが、
この崩玉は、死神と虚の魂の壁取り払って強大な力を得られるという
シロモノなんですよね。

なので、崩玉を使って生まれたみたいな可能性が高いかと。

しかし、それだと母親が虚なのか?という問題が出てくるので、
一護だけ黒崎家ではなかったみたいな展開もあるかも。

-----------------------------------------------------------
【1】浦原喜助さんが崩玉を使って、虚と死神の子供を作る。
【2】一護の父親が、その子供を引き取る
【3】その後 母親との間に、女の子が二人生まれる (ゆず、かりん)

-----------------------------------------------------------
こんな感じ。
(正直、今までの伏線等は良く覚えてないので 欠陥があるかも)

こんな展開だったら一護は精神崩壊しそうですけど、どうなるのだろう。
(俺は天涯孤独! とか言い出したり)


●いぬまるだしっ
名前を2回続けてニックネームにしてみたら、
たまこ → タマタマとなり、
下ネタになってしまったというのが面白かったです。

いや、でもタマタマはギリギリ下ネタには入らないかなと思います。
「たまたま助かった」みたいに、文章として使ったりする文字列ですし。

それに、下ネタにしてしまうと
ポケモン図鑑:102のモンスターが可哀想です。


●バクマン
どうやら、邪道展開で行くようですね。
そしてタントは打ち切り、と。

しかし、
そもそもタントはブラックジョーク的な展開、やや邪道な展開に持っていける
という事で決めてたような気が。

タントで邪道展開も出来たような気はします
ギャグとしての人気が出てるので、もう変更は不可能のレベルになってたのかも?

でもまぁそうなると、静河さんの作風と思い切り被ってしまいますね。
個人的には、以前ブルブル震えながら「ネームを見てください」と言ってたのを見て、
静河さんにも連載上手く行って欲しいなーとか思ってます。


●スケットダンス
サーヤというキャラクターは、登場時
「勘違いしないでよねっ」みたいなテンプレートな事しか言わなかったので
何だか不自然さがあったのですが、それが無くなってきたような気がする。

多分、 テンプレート的な事を言わなくなったから だと思う。
(むしろ、ツンデレ属性とやらを捨ててしまった方が良いキャラクターになる
    のではないかなと。)

それとボッスンは、縄跳び中に真顔で胸を凝視するのは止めましょう。
今回、たまたま相手が好意を抱いているから良かったものの、
そうでなければ、
数週間後には女子の間で「変態」として認識されている事うけあいです。
(結構、そういう噂は広まったりする。)

というかボッスンは胸どころか胸に接触しても何とも思わない設定だったような・・・?
あれ、設定崩壊?

まぁでも、こち亀でも 両さんが突然
将棋に強かったり将棋の素人になったり、
女性に全く関心が無い性格になったり、「おっ美女!」とか言って女性に反応したりなど
設定がおかしくなる事はありますね。
(ブリーチでも、流暢に喋ってたキャラクターが
「ワタシ・ビクリ シタネ」みたいな突然片言で喋り始めたのが居たような)


●賢い犬リリエンタール
リリエンタールは誘拐されました。
首領という人が出てきたのですが、あの人はトリガー人か何かでしょうか。

最後のアオリ文曰く、「平和な日常をぶち壊すクソ野郎!」との事。
初登場でアオリ文に無茶苦茶言われてますよこの人。

多分、シュバインさんや令一郎さんも含め、
総出で救出に向かう事になるんじゃないかと思います。
そしてクソ野郎さんを倒す、と。

そうなると、骨折していたウィルバーさんは戦力にならないのでは、と思いましたが
もう骨折は直ってるみたいです。

恐らく紳士の腕は、紳士的なスピードで紳士らしく回復したのでしょう。
だって紳士ですからね。彼は。

全員で力を合わせてリリエンタール奪還に向けて頑張って欲しいです。

※あと、顔が隠れてはいましたが、 リリエンタールの事を報告したのは
トイレ掃除のペナルティを受けてた人達でしょうね。

テーマ : 週刊少年ジャンプ全般 - ジャンル : アニメ・コミック

そこはかとなく作曲してみた。

ゲームに使う音楽が無い ので、
とりあえず自分で作曲してみました。

作曲した、と言っても、全部ものの見事に作りかけなのですが。
(全然 完成していない のである)


フリー素材を使っても良いのですが、まぁ全部自分で作ってみたいな、と。

しかし、プログラミングの作業が遅れてしまっては元も子もないので、
一旦 作曲の方は中止にしておこうかな、と思ったり。
(作業の進捗次第。)


で、作曲の方はフリーソフトを使いました。

Music Studio Producerというやつです。
↓こんなの。

【参考画像】
MSP.jpg


で、作りかけの音楽がこちら。↓

【参考URL】 Mura.mid
(クリックで再生されるはず)

RPGの一番初めの村みたいな感じにしてみました。

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

DirectInput で苦戦(´・ω・`)

今まで、DirectXGraphicsを用いてプログラミングをしていたのですが、
他のコンポーネントを使っていなかった為、それらも使おうと思いました。

※DirectX9.0は、 下記の3本柱で構成されています。
-----------------------------------
・DirectInput  (入力)
・DirectXGraphics  (描画)
・DirectSound  (音響)

-----------------------------------

で、今回 使ってみたのがDirectInput。 入力です。

そして、
今回 使ってみて壁にぶつかったのがマウスの座標取得。

ゲームなんかを作る場合、
クライアント領域に対する絶対座標が必要になると思うのですが、
(ゲーム画面のどこにカーソルがあるか?)

DirectInputはどうも
前回のカーソル位置からの差分しか取得してくれないっぽいのです。
※例えば、(5,2)から(8,4)へとカーソルを動かすと、 (8,4)ではなく(3,2)が返って来る。

毎回毎回 相対座標を取得してくれても
何の役にも立たんですよ。


色々と絶対座標を取得する方法は無いのか調べてみたんですが、
今のところ良く分からず。

なので、とりあえずマウスの座標に関してだけ
GetCursorPos関数 & ScreenToClient関数
で、判別する事にしました。

↓こんな感じ。
-------------------------------------------
POINT MousePos;
GetCursorPos(&MousePos);
ScreenToClient(g_hWindow, &MousePos);

-------------------------------------------


あと、今まで無音のプログラムばかり組んできたので、
DirectInputと共に、DirectSoundにも着手してみようかなと思います。

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

壊れてるじゃないか!(ゲーム)

ちょっと花粉症カードゲームというもので遊んでみました。
コレ↓

【参考画像】
花粉症カードゲーム


おぉ、良く出来てる!と思ったのですが、
バグで無茶苦茶になりました。



~とりあえず、ゲームの概要について~
まず、このゲームは上段5枚、下段5枚のカードが並べられます。

【参考画像】
花粉症カードゲーム4

そして、並べられた後はカードを動かす事が出来ます。
動かし方は下記の二通り
--------------------------------------------------------
【操作1】 →←キーで、下段のカードを左右にスライドさせる。
【操作2】 カードをクリックして、下段と上段のカードを入れ替える。

--------------------------------------------------------
一応、図も描いてみる。↓
【操作1】  【操作2】
 12345    12345
 abcde    abcde
 ↓      ↓
 12345    a2345
 eabcd    1bcde


で、とにかく動かして、上段と下段の絵が揃えばOKというルールです。
揃ったカードは消滅して、新しいカードが補充されます。
(但し、紫色のカードは揃えてしまうとペナルティ。



まぁそんなゲームな訳ですが、やっていたところバグが頻発。

まず、クリックしても
上段と下段のカードが入れ替わってくれなくなる。
クリックしても無反応。 なんで?


次に、 カードが揃ったのに消えてくれなくなる。
↓コチラをご覧下さい。

【参考画像】
花粉症カードゲーム3

一番右と、左から2番目のカードが上下揃ってます。
でも、消えないんです。

どうしようもないので、ゲームオーバーになります。


更にもう1つ。
カードが消滅した後は、新しいカードが補充されるのですが、
補充のされ方がちょくちょく狂います。

カードの上に新しいカードが補充されたり、
空白のあるところにカードが補充されなかったりします。
↓その現象が発生した時の模様です。

【参考画像】
花粉症カードゲーム2

見ての通り、カードの並びが無茶苦茶です。
上段の左から2番目のカードなんかは、カードが2枚重なって
影の濃さも2倍になってます。

更に、 絵が揃ったのに消えてくれないというバグも併発するので
もう どうしようもないです。

ゲームのルール崩壊。
内部のプログラムは一体どうなっておるのだ。

一応、花粉症カードゲーム(仮)となっているので
修正される予定なのかもしれませんが、このバグ発生率はいかがなものか。
バグ発生で一度もクリアできてないですからね。

ともかく、早く直ったほうが良いと思いました。

【参考URL】花粉症カードゲーム

【追記】
FlushPlayerを最新のものにしたら直りました。
最新のものでない場合でも、中途半端に動くようです。

(そしてゲームが壊れる)

テーマ : ゲーム - ジャンル : ゲーム

物凄い部活勧誘 (自分は逃げた。)

高校へ入学した後、
数週間の間 部活勧誘が激しかったのでその事を書いてみる。


他の高校などは良く分かりませんが、自分の高校は勧誘が凄かったです。

入学した後、数週間は※1 部活の勧誘期間というものがあるのですが、
どの部活も必死に勧誘しているのです。
※1・・・部活の勧誘期間を過ぎたら、 露骨な勧誘活動は出来ない

例えば、美術室・剣道場・柔道場など部活で使っている場所へ行けば、
ブラックホールみたいに中へ引きずり込まれていきます。
(そして、断りづらい雰囲気を作る)


まぁ、特定の場所へ行けば勧誘を受ける、というのはまだ良い方なのですが、
体育会系の部活となると、教室にまでやってきます。

で、「ちょっとそこの背の高い君!」とか呼びかけたりするのです。
(部活に入る予定の無い人にとっては恐怖。


【参考画像】
勧誘

このタイプの勧誘は、主に 休み時間&放課後にやって来ます。

部活に入ろうと思ってない人は、この2つの選択肢の内どちらかを取るしかないのです。
---------------------------------------------------------------------------
・適当に 楽そうな部活に入る。 (「もう部活に入っています」、と勧誘を断れる。)
・勧誘期間の間、先輩方から逃げ切る。
---------------------------------------------------------------------------
※たまに靴箱付近の入り口で待ち伏せされているので注意が必要。
(逃げられない。 教室かどこかで時間を潰したりしてスキを伺うしかない。
  ※部活開始時間になると、先輩方は勧誘を打切り、部活へ行かざるを得ないのである。)


で、一番怖いと感じたのがラグビー部です。
自分の友達が 被害 勧誘を受けたのですが、
ラグビー部の先輩方が円形に取り囲むんです。
※自分達は"円陣勧誘"と名づけてました。

【参考画像】
勧誘2

ほぼ脅迫ですよ コレ。
(見たとき腰抜かしましたよ自分は。)

その後、友達はこんな会話をして、
---------------------------------------------------------
先輩「名前は何かな?」
友達「×、××です」
先輩「そうか!××君か!」
先輩「1年△組の××君、よし覚えたぞ! 放課後待ってるよ!」
友達「あっ・・・はい」

---------------------------------------------------------
で、放課後どこかに連れて行かれました。
(友達は、 「んー・・・入る予定は無いんだけどなぁ・・・。」みたいな事を
 言っていたような気がします。)

いやぁ、これは怖かったです。
自分が勧誘されてたら、 恐らく断るのが大変だったでしょう。


あ、最後に、
勧誘された友達は、その後どうなってしまったのか? について。

んー・・・あれは、そう、
勧誘期間も終わり、自分は吹奏楽部の練習をしていた時の事でした。
ふとグラウンドの方を見てみると、ラグビー部で頑張る 友達の姿がありました。

テーマ : 日記 - ジャンル : 日記

これが マルチターゲットレンダリングなのです。

【リンク】 ◆解説系TOP◆
今回は、マルチターゲットレンダリングに挑戦してみました。

今まではずっとバックバッファに描画していたのですが↓、

【参考画像】
マルチターゲット2


実は、バックバッファ以外にも描画出来ます。

例えば、 バックバッファではなく テクスチャ にモデルを描画をして、
そのテクスチャを貼ったポリゴンをバックバッファに描画する
みたいな事が出来たりします。

【参考画像】
マルチターゲット3

今回も例の如く、 ソースコードがあるのですが、
そのソースコードを実行した結果がこちら。↓

【参考画像】
マルチターゲット


まず、 テクスチャに四角すいのポリゴンを描画して
その後に、 天上と底が無い箱みたいな形のポリゴン
四角すいが描画されたテクスチャを貼り付けてバックバッファに描画しています。
※背面カリングはしてません。

(平坦なポリゴンに3Dモデルが描画されたテクスチャを貼るので、何か面白いです。
 アニメーションさせたら 貼り付けたテクスチャが動きますし。)



大まかなやり方。
(細かい部分は、適宜解説します。)
-----------------------------------------------------------------
【1】新規テクスチャリソースを作成する。
【2】テクスチャの深度バッファを作成する。
【3】作成したテクスチャへアクセスする為のインターフェースを保存する。
【4】バックバッファへアクセスする為のインターフェースを保存する。
【5】レンダリングターゲットをテクスチャに変更する。
【6】テクスチャに何かを描画する。
【7】レンダリングターゲットをバックバッファに戻す。
【8】バックバッファに描画する。


【参考画像】
マルチターゲット4
-----------------------------------------------------------------

【1】新規テクスチャリソースを作成する。
まず、モデルを描画するためのテクスチャリソースを作成します。
作成には、CreateTexture関数を用います。

g_pD3DDevice->CreateTexture( 128,128,
1,
D3DUSAGE_RENDERTARGET,
D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT,
&g_pTexture,
NULL);

※128×128のテクスチャを作成。

そして、関数の詳細。

HRESULT CreateTexture(
UINT Width,
UINT Height,
UINT Levels,
DWORD Usage,
D3DFORMAT Format,
D3DPOOL Pool,
IDirect3DTexture9** ppTexture,
HANDLE* pHandle
);


Width・・・テクスチャの横幅を指定。
Height・・・テクスチャの縦幅を指定。
Levels・・・ミップマップのレベルを指定。 通常は1で問題ないです。
Usage・・・作成するテクスチャの使用法を設定する。
Format・・・作成するテクスチャのフォーマットを指定。([赤・緑・青]の情報を持つ、[赤・緑・青・透過度]の情報を持つ、などを指定する。)
Pool・・・作成するテクスチャの、メモリ確保方法を指定。
ppTexture・・・テクスチャ リソースを示す IDirect3DTexture9 インターフェイスへのポインタを指定。
pHandle・・・予約済み。NULLでOK。


【補足】
Levels(ミップマップレベル)について。
ミップマップとは、
同じイメージを徐々に低い解像度にした連続したテクスチャーの事です。
例えば、256×256のテクスチャをミップマップレベル4で作成すると、
128×128、64×64、32×32のテクスチャーも作成されます。
(256×256も含めて全部で4つ。)

で、これはどう利用されるかと言うと、例えば
256×256の元画像があった場合、32×32になるように画像を縮小しながら表示するよりも、
予め縮小した32×32の画像を用意しておいて、それをペタッと貼ったほうが速いのです。
また、適切な大きさを選ぶ事によって、テクスチャーの品質が向上します。
※その代わり、当然メモリの使用量が増えます。 諸刃の剣。

【参考URL】ミップマップによる テクスチャーフィルタリング


Usage(使用法)について。
これの指定には、定数D3DUSAGEを用います。
今回はテクスチャをレンダリングターゲットとして使用するので、
D3DUSAGE_RENDERTARGETを指定します。

【参考URL】定数 D3DUSAGE


Pool(メモリ確保方法)について。
メモリ確保方法は、D3DPOOL 列挙型で指定します。
色々とあるのですが、デフォルト指定(D3DPOOL_DEFAULT)が無難、との事。

【参考URL】D3DPOOL 列挙型


【2】テクスチャの深度バッファを作成する。
テクスチャをレンダリングターゲットにする以上、奥行きの情報も持たせないといけません。
なので、新規作成したテクスチャ用の深度バッファも確保します。

g_pD3DDevice->CreateDepthStencilSurface(
128,128,
D3DFMT_D16,
D3DMULTISAMPLE_NONE,
0,
TRUE,
&g_pTexz,
NULL);


こちらも、関数の詳細。↓
HRESULT CreateDepthStencilSurface(          
UINT Width,
UINT Height,
D3DFORMAT Format,
D3DMULTISAMPLE_TYPE MultiSample,
DWORD MultisampleQuality,
BOOL Discard,
IDirect3DSurface9** ppSurface,
HANDLE* pHandle
);


Width・・・深度バッファの横幅を指定。 (新規作成したテクスチャと同じ大きさにする)
Height・・・深度バッファの縦幅を指定。 (新規作成したテクスチャと同じ大きさにする)
Format・・・深度バッファのフォーマットを指定。(フォーマットについては前述)
MultiSample・・・マルチサンプリング(補間方法)を指定。
MultisampleQuality・・・画像の品質レベルを指定。
Discard・・・z バッファの破棄を有効にするか無効にするかを指定。(TRUEかFALSE)
ppSurface・・・深度バッファの格納先を示すポインタのアドレスを指定。
pHandle・・・予約済み。常にNULL。


【補足】
マルチサンプリング(補間方法)について
これは、 D3DMULTISAMPLE_TYPE 列挙型で指定します。
今回は利用しない(D3DMULTISAMPLE_NONE)にしています。

【参考URL】D3DMULTISAMPLE_TYPE 列挙型

画像の品質レベルについて
これは、0からnまでの値を指定できます。
で、nというのは
CheckDeviceMultiSampleType関数のpQualityLevelsに返される戻り値 - 1の値です。

【参考URL】IDirect3D9::CheckDeviceMultiSampleType メソッド


【3】作成したテクスチャへアクセスする為のインターフェースを保存する。
次に、テクスチャへアクセスする為のインターフェースを保存します。
g_pTexture->GetSurfaceLevel(0, &g_pTexSurface);

第一引数に、ミップマップのレベルを指定。 (元画像はレベル0)
第二引数に、アクセスしたいサーフェイスを示すIDirect3DSurface9型の変数を指定。

インターフェースを保存しておけば、それをデバイスにセットして
リソースなどにアクセス出来るようになります。
(上記の画像3段目の図)


【4】バックバッファへアクセスする為のインターフェースを保存する。
次に、 バックバッファに関する情報を保存します。
保存するのは、下記の3つです。
-----------------------------------
・バックバッファのビューポート
・バックバッファのインターフェース
・バックバッファの深度バッファ

-----------------------------------
これらの情報を、保存せずにレンダリングターゲットをテクスチャに切り替えた場合
このようになります。↓
マルチターゲット5

バックバッファを示すものがなくなります。
つまり、二度とバックバッファにアクセスできなくなります。

なので、切り替える前にバックバッファのインターフェースなどを保存
しないといけないのです。
(一番最初の画像を参考にして下さい。)

で、情報はそれぞれ
---------------------------------
・GetViewport関数  (ビューポート)
・GetRenderTarget関数  (インターフェース)
・GetDepthStencilSurface関数  (深度バッファ)

---------------------------------
で取得できます。

【参考URL】GetViewport メソッド
【参考URL】GetRenderTarget メソッド
【参考URL】GetDepthStencilSurface メソッド


【5】レンダリングターゲットをテクスチャに変更する。



【6】テクスチャに何かを描画する。
【7】レンダリングターゲットをバックバッファに戻す。
【8】バックバッファに描画する。



【ソースコード】Sample_MultiTarget.txt


<~続きは明日!~>

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

ジャンプ16号感想

●ワンピース
センゴクさんが黒ひげを攻撃しました。
以前、「仏らしい攻撃ってあるのかな?」と思ってましたが、
衝撃破を出すみたいです。

理屈は良く分かりませんが、 まぁ 気にしなくても良いでしょう。
仏様は衝撃波を出すのです。

で、場面転換してルフィ達の様子へ。

場面転換 早々、 イワさんが「オウ~」とか言いながら やられてました。
イナズマさんに至っては無言です。 なんかヤムチャみたいに倒れてました。

マゼランさんの時といい、
何だかやられキャラとして確立しつつあるような気が。
(活躍する時は活躍するんですけど)

で、その後 バギーやらクロコダイルやらジンベエさんがルフィをかろうじて守りきり、
最後にローさんが登場しました。

この方は確か、手足を無茶苦茶にしてくっつけたり出来る方ですね。
ローさんも恐らく能力者でしょう。
とりあえず"オペオペの実"の手術人間だと予想してみる。


●四ツ谷先輩の怪談
今回は、桜の木の下に死体が埋まっているというお話。

まぁ、つまり こんな感じですね。↓
【参考URL】タイムカプセル(Youtube)

で、多分
------------------------------------
・28年前の事件・・・田中先生の仕業
・今回の犯人・・・早乙女君

------------------------------------
だと思います。

そして、28年前の事件は下記の様にして起こったんじゃないかと。
-------------------------------------------------------------------
【1】田中先生が、桜の木を見る。
【2】「完璧な構図の為には、絶望先生的な要素が足りない」と感じる。
【3】犯行へ。

-------------------------------------------------------------------
もしくは、若かりし田中先生が 早乙女さんに対して
恋愛的な問題を抱えていたのかもしれません。

上手く行かない⇒殺害⇒「完璧な構図」で絵として残そうみたいな。

というか、 また学校関係者が犯人じゃないですか。
毎日毎日 犯人が逮捕されることについて生徒達はどう思っているのか。

その内 学校から人が居なくなりますよ。


●バクマン
----------------------------------------------------
シュージン:『やめちゃうか?』
サイコー:『タントの連載をやめたいと思ってます』
サイコー:『ジャンプに こだわって続けるか、やめるか
----------------------------------------------------

・・・・。

ミルコクロコップ

いや、本当に何を言っているんだ この2人は・・・。
特に最後の発言なんて、人によっては「もう辞めていいよ」と見切られてしまうかと。
(後で 「やっぱり続けます!」と言ったとしても)

大体 連載を通して得られる経験も色々とあるでしょうし、、
そういう経験を得ようとせず どうして短絡的に(以下略


●トリコ
トミーロッドさんが、もっと凄い事になりました。
顔の表情が変わったとかじゃなくて、 もう別の生き物です。

で、そんなトミーロッドさんに大ダメージを与えたのが 今回ひらめいた足技。

んー思ったんですけど強すぎないですか?
ダメージからいっても、
-------------------------------
レッグナイフ >> 13連釘パンチ
レッグフォーク >> 13連釘パンチ

-------------------------------
ですからね。

単純な連射数で比較しても13倍以上の差がありますよ。
(3~4倍どころの騒ぎじゃない)

「5連レッグフォーク!」とかやったら
大抵の敵は粉になるんじゃなかろうか。

まぁそこら辺は
--------------------------------------------------------------
・一日に3発まで
・瀕死の状態だったから、あの威力が出せた (火事場の馬鹿力)
--------------------------------------------------------------
こんな感じで上手くバランスを取ってくれるんじゃないかと。


●スケットダンス
ネテロ会長のセンスを否定する気か!(`・ω・´)
よろしい、ならば貧者の薔薇だ。

まぁ、ともかく
どうやら椿君は創作が苦手な様子。

最後に、シャツを作ってくれたボッスンの母親に免じて
泣きながら「スタイリッシュ☆」と言う生徒会長(安形さん)が
悲惨すぎました。
(しばらく 着続けるのだろうか?)

とりあえず、彼は良い人だ。


●ピューッと吹く!ジャガー
-----------------------------------------------------
ファーハハハ どうだホレ!
お笛様ですぅーー!
お笛様ですぅーー!!

-----------------------------------------------------
ミルコクロコップ


●賢い犬リリエンタール
あぁ・・・ウィルバーさんが骨折なさっている。
風呂場に乱入した時に、物凄い攻撃を受けたんでしょうね。

てつこは、ちょっと本気を出したら家の壁も粉砕できるので
怒らせちゃダメです。

で、今回はごむぞうを直しに行くお話。
カナリーナ様は、ライトニング光彦の事が相当 好きなようです。
(寄りかかってた時、顔がとろけてましたし)

しかし、素直になれずなんだかライトニング光彦からは嫌われてる模様。
うん、 頑張って素直になったほうが良いと思う。

そうしないと、こんな事になりますよ。
好きな子に意地悪

テーマ : 週刊少年ジャンプ全般 - ジャンル : アニメ・コミック

"ステンシルテスト"をやってみた

【リンク】 ◆解説系TOP◆
今日は、ステンシルテストをやってみました。


ステンシルテストを行うと、
-----------------------------------------------------
ピクセル単位で描画する、描画しない
-----------------------------------------------------
ということが出来るようになります。


DirectXなんかを使って描画をする場合、
普通はクライアント領域全体=描画対象になっていると思うのですが、
この描画対象の領域を変えられるというわけです。


【参考画像】
ステンシル2
※ピクセル単位の描画する、描画しないを切り替えるので、
3Dモデルだろうが2Dポリゴンだろうが、特定の場所からスパッと消えます。

更に、描画対象の領域は、四角ではなく
任意の形に切り取るような事も出来ます。

↓実際に実行してみました。 今回は五角形です。
【参考画像】
ステンシル

左から、通常、ステンシルテスト有り、ステンシルテスト有り、です。

※見ても分かるように、特定の領域だけ描画しないと指定する事も出来ますし、
特定の領域のみ描画すると指定する事も出来ます。


~やり方~
--------------------------------------------------------------------------
【1】デバイスのプレゼンテーションパラメータを設定する。
【2】ステンシルバッファをクリアするように設定する。
【3】ステンシルバッファにシルエットを描画する。
【4】普通に描画する

--------------------------------------------------------------------------


【1】デバイスのプレゼンテーションパラメータを設定する。
まず初めに、DirectXのデバイスを作成する時
色々なプレゼンテーションパラメータを設定する と思うのですが、

その中のEnableAutoDepthStencilの項目をTRUE
AutoDepthStencilFormatの項目をD3DFMT_D24S8に設定します。

設定例↓
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
※TRUEにしておかないと、
D3DFMT_D24S8と設定してもその設定は無視されます。

↓詳細はこのページに書かれてあります。
【参考URL】D3DPRESENT_PARAMETERS (プレゼンテーションパラメータ)


【2】ステンシルバッファをクリアするように設定する。
描画する際には、Clear関数でバッファをクリアしたりすると思うのですが、
この関数で、ステンシルバッファもクリアするように設定します。


やり方は、第3引数にD3DCLEAR_STENCILを追加するだけです。
g_pD3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL, D3DCOLOR_XRGB(0,0,60),1.0f, 0 );


ついでに、関数の詳細。

HRESULT Clear(  
DWORD Count,
const D3DRECT *pRects,
DWORD Flags,
D3DCOLOR Color,
float Z,
DWORD Stencil );


Count・・・pRectsの配列にある矩形の数を指定。
pRects・・・クリアする領域(矩形)を、D3DRECT 構造体の配列のポインタで指定する。 NULLに指定すると、描画領域全体がクリアされる。 (通常はNULL)
Flags・・・クリアする対象のフラグを指定する。
Color・・・レンダリング ターゲットをクリアする色を指定。 自分はD3DCOLOR_XRGB(0,0,60)と指定して、 背景を紺色っぽくしてます。
Z・・・深度バッファに保存する新しい z 値を指定する。 0.0が最も近い距離、1.0が最も遠い距離を示します。
Stencil・・・各ステンシル バッファに保存する整数値を指定する。 通常は0でOK。


Flagsについて。
フラグは、ステンシルバッファレンダリングターゲット深度バッファの3種類あり、
任意の組み合わせで指定できます。
(ただし、必ず1つ以上 指定しなければならない。)

そして、その3種類のフラグについて。
D3DCLEAR_STENCIL・・・ステンシル バッファをクリアし、Stencil の値にする。
D3DCLEAR_TARGET・・・レンダリング ターゲットをクリアし、Colorの色にする。
D3DCLEAR_ZBUFFER・・・深度バッファをクリアして、Zの値にする。


【3】ステンシルバッファにシルエットを描画する。
次にステンシルバッファへ任意の書き込みを行うわけですが、
ステンシルバッファ以外の書き込みは行わないようにします。
(深度バッファ(物体がどのくらいの奥行きにあるか?)を有効にしていると、
深度バッファも書き込まれてしまう。)

「どのピクセルを描画しないようにするか?」を設定できさえすれば良いので、
「物体がどれくらいの奥行きに存在するか?」という情報は要らないのです。

で、Zバッファ(深度バッファ)への書き込みを行わないようにするには
下記の様にします。
g_pD3DDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_NEVER );

そして、次にステンシルテストを有効にします。
 g_pD3DDevice->SetRenderState( D3DRS_STENCILENABLE, TRUE );
(有効にしておかないと、テストを行ってくれません。)

その後に ステンシルテストの為の設定を行うのですが、 その前に
ここでステンシルテストの詳細について書きます。

ステンシルテストは
--------------------------------------------------
ステンシルマスク
ステンシルバッファの値
ステンシル参照値

--------------------------------------------------
この3つの要素を設定し、それらを比較関数で判定を行います。

式としてはこんな感じ↓
-------------------------------------------------------------------------------
(StencilRef & StencilMask) CompFunc (StencilBufferValue & StencilMask)
-------------------------------------------------------------------------------
【参考URL】ステンシルバッファテクニック

論理積をとったものと、論理積を取ったものの値を比較する、という式になってます。
CompFuncには >、<、=、!=などが入る。

で、式は上記のモノなのですが、通常はStencilMask0xffffffffを指定して、
式を簡略化するっぽいです。
-------------------------------------------------------------------------------
( StencilRef ) CompFunc ( StencilBufferValue )
-------------------------------------------------------------------------------
※マスクとの論理積が消える。

要するに、ステンシル参照値と、ステンシルバッファの値を比較するだけ。
また、ステンシル参照値は自分で勝手に決められる値です。

×××××××××××××××××××××××××××××××××

例えば、ステンシル参照値を0x05にしてモデルを描画する とします。

すると、ステンシルバッファのモデルを書き込んだところは5それ以外は0になります。
※0になるのは、最初にClear関数でステンシルバッファを全部0にクリアしているため。

【参考画像】
ステンシル3JPG

で、ステンシルバッファに描き込んだ後、テクスチャの張った大きなポリゴンを
ステンシル参照値0x03、 比較関数をD3DCMP_LESSと指定して描画するとします。
※D3DCMP_LESS・・・"より小さい"()です。

この場合は、
------------------------------------------------
モデルを描き込んだ所は 3 < 5 (成立する)
モデルが書き込まれなかったところは 3 < 0  (成立しない)

------------------------------------------------
となり、モデルを描き込んだステンシルバッファの部分だけ
3Dモデルやポリゴンが描画される事になります。

【参考画像】
ステンシル4
×××××××××××××××××××××××××××××××××

続き。
ステンシルテストを有効にした後、 ステンシルテストを行う為の各種設定を行います。


//ステンシル参照値の設定
g_pD3DDevice->SetRenderState( D3DRS_STENCILREF, 0x05 ); //ステンシル参照値を0x05にする。

//マスクの設定
g_pD3DDevice->SetRenderState( D3DRS_STENCILMASK, 0xffffffff ); //ステンシルマスクの設定。
g_pD3DDevice->SetRenderState( D3DRS_STENCILWRITEMASK, 0xffffffff ); //ステンシルマスクの設定。

//どんな条件が成立した時にステンシルバッファに書き込むのか? の設定
g_pD3DDevice->SetRenderState( D3DRS_STENCILFUNC, D3DCMP_ALWAYS ); //必ずステンシルバッファに描きこませる、という設定。

//書き込む場合、どんな値を書き込むのか?の設定。
g_pD3DDevice->SetRenderState( D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP ); //ステンシルテストに不合格の時・・・何もしない。
g_pD3DDevice->SetRenderState( D3DRS_STENCILZFAIL, D3DSTENCILOP_REPLACE ); //ステンシルテストに合格、深度テストに不合格の時・・・指定したステンシル参照値を書き込む。
g_pD3DDevice->SetRenderState( D3DRS_STENCILPASS, D3DSTENCILOP_KEEP ); //ステンシルテストと深度テストに合格の時・・・何もしない。
※ややこしそうに見えますが、とにかくステンシル参照値を書き込むようにしている、と思ってください。

あと、他のフラグのまとめがあるページ↓
【参考URL】D3DSTENCILOP列挙型 (処理方法を定義)
【参考URL】D3DCMPFUNC列挙型 (比較関数を定義)


【4】普通に描画する
ステンシルバッファに書き込み終わったら、
変更した設定を元に戻したりした後、普通に描画します。

まず、マスクは先ほどと同じ0xffffffff

ステンシル参照値は、0x03にします。
(もちろん、他の任意の値でもOK。)

比較関数はLESS( < )にします。
(これも、別の任意の比較関数でもOKです。)


で、最後にZバッファの書き込みステンシルバッファの書き込みについて。
先ほどは、
----------------------
ステンシルバッファ 
Zバッファ  ×

----------------------

と指定していたのですが、今度は、
----------------------
ステンシルバッファ ×
Zバッファ  

----------------------
という風に設定します。
(モデルを描画する際は、奥行きの情報が必要。
  逆に、ステンシルバッファを書き込むつもりは無いので、そのように指定する。)

※記事が冗長になりそうなので、こちらは添付するソースコードを見てみてください。

今回のプログラムはこちら↓
【ソースコード】Sample_StencilTest.txt
※→キーを押すことによって、比較関数を切り替えられます。
( D3DCMP_GREATER ←→ D3DCMP_LESS )

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

今日は卒業式でした!

今日は 大学の卒業式でした!

会場に入ると、自分の後輩達が演奏してました。
-----------------------------------------------------------------------------
聞いてみたところ、さらに演奏が良くなってたです。

特にソロが上手くなってました。
ソロとなると、音程の合った音を真っ直ぐ綺麗に出すだけ という感じがあったんですけども、
結構 歌えるようになってました。
(演歌でいう所の、「こぶし」みたいなものです。)


あと、全体ではなく 自分の後輩の演奏(コントラバス)について。
現役の時にも思ったんですけども、
"銀河鉄道999"の[E]からが聞こえない。
※楽譜には、曲の始めが[A]、 30小節目が [B]というように
アルファベットが割り振られてたりします。

(特定の場所を練習したい時は「Bから始めます」と指示したりする。)



アレ、必死にピッチカートやってても殆ど 聞こえてこないです。
【参考URL】銀河鉄道999/樽屋雅徳 by sij
(1:17くらいからの低い音でポ・ポ・ポン、ポ・ポ・ポン、と弾き始める所)

※後輩は、ピッチカートのやりすぎで皮がむけたとか言ってました。
自分も現役の時はボロボロになった経験がある。
-----------------------------------------------------------------------------

まぁ、卒業式が終わった後は クラスの友達と合流して卒業証書を受け取ったりして、
その後サークルの送別会の方へ行きました。
(後輩の演奏 & プレゼントを貰う。)


で、送別会のあとは、打ち上げの方へ。
(打ち上げでは、いっぱいお肉を食べる。

2次会とかにも行って良かったんですけど、
雨が降ってきて、更に強風で傘が破壊されたため帰宅する事にしました。

【参考画像】
突風
風が強い雨の日の傘なんて、何の役にも立たないですよ。

テーマ : 日記 - ジャンル : 日記

たまたま見た 変なCM

たまたまテレビのCMを見ていたところ、
何だか不思議なCMを見つけました。

(まぁ、ただのシーチキンのCMなんですけども。


どんなCMかと言うと、
いきなり妙な音楽が流れてきて、
更に不可解なダンスを踊り始めるのです。

【参考画像】
シーチキンPlus!! シーチキンPlus!!2


シーチキンの紹介に その妙なダンスを踊る必要性があるのか とか、
この不可思議な音楽は一体何なのか とか
色々と突っ込みどころがあります。

※CMを見た瞬間に、
すぐさまPCのところへ行き『CM シーチキン』で検索しました。
(どうやらはごろもフーズのCMのようです。)


この不可思議さは、たらこのCMに通ずるものがありますね。
(以前 流行った「た~らこ~た~らこ~」というCM)
【参考URL】パスタソースたらこ

たらこと同じように、完全版がCDで販売されたりしないかな。



あと どうでもいいですが、
何回も見ているうちに"シーチキンPlus"という商品名にちなんで、
背景が+(プラス)だったり、ステージが+(プラス)だったり、
シーチキンを食べた後、+がハートマークに変わったりなど、

色々と演出がされてるなぁと思いました。
商品と全然 関係ないところばかり興味がいっている)

今回取り上げたCMです↓
【参考URL】のっけパスタ!:和風 + オムレツ編

テーマ : 日記 - ジャンル : 日記

大学で「支援制度」が広がっているらしい

なんか、大学で支援制度が広がってるらしいです。

就職先が決まっていない学生に対して、卒業を延期する制度との事。
(既卒になると、意味が分からないほど就職しにくくなるため。)

【参考URL】大学に広がる「卒業延期制度」


最近は結構 厳しいらしいですからね。
大学側も色々と支援しているようです。


あ、自分の大学でも『プラスワンプロジェクト』という
支援制度を行うらしいです。

こちらは、卒業を延期するのではなく、
-------------------------------------------
【1】個人面談
【2】ビジネスマナー
【3】履歴書添削
【4】企業研究の方法
【5】グループディスカッション

-------------------------------------------
↑これらの就活で必要な事のアドバイスや練習を補助してくれる制度との事。
(3月25日に申し込み開始らしい ので、行く予定。)



あと、聞いた話ですが、これから更に厳しくなるらしいです。
理由としてはこんな感じ↓
--------------------------------------------------------------------------
【今年】
新卒の人 & 就職が決まらなかった人 


【来年】
新卒の人 & 就職が決まらなかった人 & 大学院から卒業する人

就職が厳しいという理由から、大学院へ進学した人も混ざってくる。)
--------------------------------------------------------------------------

んー、 なんか物凄い事になりそうである。
今でも、一人当たり 平均200社 受けてるとか聞きました。
(何かの統計調査。 ・・・多い!)


最後に。

吹奏楽団の 1つ下の後輩も
今 就職活動をやっていて、 「やだー」みたいな事を言っておりました。

『もう 婚活する!』
なんか投げやりっぽくなってた人も居たり。

頑張れー\(`・ω・´;)/
(自分も ですけど)

テーマ : 就職・転職・仕事・求職・アルバイト・パートのNo1最新情報 - ジャンル : 就職・お仕事

頂点ブレンディングをやってみた(DirectX)

【リンク】 ◆解説系TOP◆
今日は、頂点ブレンディングをやってみました。

この頂点ブレンディングというのは、スキンメッシュアニメーション
使ったりするのですが、 自分はやり方が良く分からないので自前で計算してました。

だって頂点ブレンディングに関する参考書が少ないんですよ。

まぁ、それはともかく今日 ソースコードを書いて上手く実行できたので、
ソースコードを含め 頂点ブレンディングについて書こうかと思います。



で、解説へ入る前に
頂点ブレンディングについての説明をします。

頂点ブレンディングというのは、要するに
-----------------------------------------------------------------------
1つの頂点に対し、複数の行列を影響させてみよう
-----------------------------------------------------------------------
と言うことです。



例えば、下記の行列2つがあるとします。
----------------------------------
    行列        影響度
----------------------------------
X軸に4移動させる行列   0.5
Y軸に2移動させる行列   0.5
----------------------------------


この場合、通常ならば頂点に影響を与える行列は1つのみなので
--------------------
・X軸に4移動させる
・Y軸に2移動させる

--------------------
このどちらかしか出来ません。

しかし、影響度を設定して複数の行列を適用させるようにすると、
上記の場合、2つの行列の差分を混ぜて頂点を動かせるようになります。

今回はどちらも影響度が0.5なので、
----------------------------
X軸に4 × 0.5 = X軸に2
Y軸に2 × 0.5 = Y軸に1

----------------------------
つまり頂点をX軸に2、Y軸に1動かすことが出来ます。
2つの行列が半々ずつ反映される。)

↓詳しくはコチラの方にも書いてあります。
【参考URL】スキンメッシュアニメーションの解説4



【頂点ブレンディングをやるための手順】
-------------------------------------------------------------
【1】頂点ブレンディングを有効にする。
【2】影響度を含めた構造体を定義する。
【3】SetTransform関数で、複数の行列をセット。
【4】SetFVF関数で、頂点データのタイプを通知。
【5】DrawPrimitiveUP関数を呼ぶ。

-------------------------------------------------------------

【1】頂点ブレンディングを有効にする。
まず、頂点ブレンディングを有効にする必要があります。
これには、SetRenderState関数を用います。
g_pD3DDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_1WEIGHTS );

上記では、2つの行列による頂点ブレンディングを有効にしています。

D3DVBF_1WEIGHTSだから行列1つの重みしか設定できないのでは?
(2つの行列による頂点ブレンディングは出来ないのでは?)

と思うかもしれませんが、これは問題ありません。

行列A、Bがあり 行列Aの影響度を0.7とした場合、
行列Bの方は影響度を設定していなくても
1.0 - 0.7 = 0.3という風に自動計算してくれるようです。

よって、
----------------------------------------------------------------------
影響度を1つだけ設定する = 2つの行列の影響度でブレンディング出来る
----------------------------------------------------------------------
という事になります。

またD3DVBF_1WEIGHTS 以外のフラグも設定できます。
下記のページに詳しく書いてあります。
【参考URL】D3DVERTEXBLENDFLAGS 列挙型


【2】影響度を含めた構造体を定義する。
struct MY_VERTEX{
float px, py, pz; //頂点座標
float weight1; //重み(影響度)
DWORD color; //頂点色
};

影響度を含めた構造体を定義します。

ただし、この構造体の定義の仕方には順番があって、
影響度はRHWの後、法線定義の前に定義しないといけません。

詳しくはコチラに書いてあります↓
【参考URL】頂点フォーマットの順番


【3】SetTransform関数で、複数の行列をセット。
まず、ブレンディングしない場合は
下記の様にD3DTS_WORLD マクロを使って行列をセットします。
-----------------------------------------------------
g_pD3DDevice->SetTransform(D3DTS_WORLD, &mat);
-----------------------------------------------------

しかし、ブレンディングする場合は
D3DTS_WORLDMATRIX マクロを使います。
このマクロは、カッコつきで最後にインデックスを指定します。
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(0), &mat);
↑こんな感じ。

今回は2つの行列でブレンディングする訳ですが、
2つの行列にはそれぞれ0番、1番のインデックスが割り振られます。

※構造体で影響度を設定した方が0番
 1.0 - 影響度 で影響度が自動算出される方が1番です。


例えば下記の様な場合、

【行列】
X軸に4移動させる行列・・・mat
Y軸に2移動させる行列・・・mat2

【影響度】
MY_VERTEX v[] = {{-1.0f, 2.0f, 0.0f, 1.0f, 0xffff0000},
{ 1.0f, 2.0f, 0.0f, 0.5f, 0xff00ff00},
{ 1.0f, 2.0f, 0.0f, 0.0f, 0xff00ff00},
/* 以下略 */ };

【行列をセット】
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(0), &mat);
g_pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(1), &mat2);

それぞれの頂点はこのように動きます。
--------------------------------
頂点0番はX軸に4
頂点1番はX軸に2、Y軸に1
頂点2番はY軸に2

--------------------------------
※行列を何もセットしなかった場合は、
(SetTransform関数を一切呼ばなかった場合は)
全て単位行列として判断されるようです。


【4】SetFVF関数で、頂点データのタイプを通知。
そして通常の描画方法と同じく、
どんな頂点データを描画しようとしているか?を伝えなければなりません。

定義した構造体は頂点座標と、影響度1つと、頂点色の3つであり、
それぞれのフラグはD3DFVF_XYZD3DFVF_XYZB1D3DFVF_DIFFUSEです。

なので、↓このように設定すれば良いとおもいますが、
#define MY_VERTEX_FVF  ( D3DFVF_XYZ | D3DFVF_XYZB1 | D3DFVF_DIFFUSE )
g_pD3DDevice->SetFVF(MY_VERTEX_FVF);
影響度を設定するフラグ(D3DFVF_XYZB1)は、 頂点座標のフラグも兼ねているっぽいです。


つまり、下記の様に頂点座標のフラグは外してOKです。
#define MY_VERTEX_FVF  ( D3DFVF_XYZB1 | D3DFVF_DIFFUSE )
g_pD3DDevice->SetFVF(MY_VERTEX_FVF);



【5】DrawPrimitiveUP関数を呼ぶ。
最後はDrawPrimitiveUP関数を呼んで終了です。
呼び出し例↓
g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 6, v2, sizeof(MY_VERTEX));
※DrawPrimitiveUP関数については、以前の記事で詳しく書いています。↓
【参考URL】DirectX描画方法まとめ


で、サンプルコードについてですが、影響度を設定したポリゴン
Z軸方向中心に0~90°回転するようになっています。
↑と↓キーで、影響度の有り無しを切り替えられるようになっているので、
動き方の違いが分かると思います。

【ソースコード】Blending.txt


あ・全然関係無いのですが"Garden of Eden"って曲良いですよね。
ライアーゲームの曲の中で一番好きです。 Garden of Eden

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

高校の定期演奏会へ行って来た!

先日、高校(母校)の吹奏楽部の定期演奏会に行ってきました!
出演者として。


※自分は、 中学以降は吹奏楽部に所属していたりします。

【部活動まとめ】
-------------------------------------
小学4年生:将棋くらぶ
小学5年生:理科くらぶ
小学6年生:イラストくらぶ
中学生:吹奏楽部 (チューバ)
高校生:吹奏楽部 (チューバ)
大学生:吹奏楽部 (コントラバス)

-------------------------------------
※大学でなんでコントラバスに変わったの?というと、
「チューバ多すぎるから別のに回ってくれ」と指示されたからです。


で、本番に参加して思ったのですが、
自分達が定期演奏会をやってた頃よりも更にお客さんが増えてたような気がする。
(椅子の埋まり具合60%⇒75%ぐらいの変化)

その為、少々 緊張しましたが
特に問題も無く 終了する事が出来ました。


あとコレだけだとアレなので、
演奏会やコンクールで起こったハプニングをまとめてみる。


【1】演奏中に譜面台が下がる
本番の演奏中だったんですけども、突然「シュッ」とか言いながら
譜面台が腰の位置まで下がりました。

【参考画像】
ハプニング

限りなく楽譜が見づらくなりました。

おまけに片手だけじゃ直せないので、演奏終了までそのまま。
---------------------------------------------------------------
※譜面台を上に上げて、ねじを締める必要がある。
ねじは大体 腰の位置 付近にあります。
右手で譜面台を胸あたりの位置まであげても、腰付近のねじを締められない。
---------------------------------------------------------------


【2】楽器の忘れ物が見つかる
吹奏楽コンクール本番の事でした。

演奏終了後、結果発表を待っている状況だったのですが
突然「ステージにクラリネットの忘れ物がある」と放送が入ったんです。
※その放送が入った後は「えっ?」みたいな感じで会場がざわついてました。

演奏で使った楽器が忘れられるというのは
一体どういう状況だったのだろう。
(自分達の団体じゃないですよ)

演奏が終わった後は、当然 楽器は手に持っている訳ですから
忘れようが無いような気が・・・。
(何らかの理由で一時的に 手放したんでしょうかね。)

まぁ、しばらくして当事者が受け取りに行ったっぽいです。


【3】本番で大失敗。
これも自分の団体では無いのですが、
演奏の出だしから大失敗してました。

演奏を始める場合、
指揮者が指揮棒で1,2,3,4!と言う風に予備のカウントを取る事があるのですが、
そのカウントが上手く統一出来てなかった模様。

要するに1!と振った瞬間に演奏を始めるのか、
1、2、3、4!という予備動作の後に演奏を始めるのかが
上手く伝わってなかったっぽい。

すぐさま指揮者(顧問の先生)が
「うわぁーやめ!止め!」と演奏を中止させた後、

『もう一度やらせて下さい。』
観客の方に嘆願しておりました。

コンクールではなく、コンサートだった のでそれで万事OKとなりました。
コンサート・・・色んな学校の吹奏楽部が、1つの会場に集まって演奏をする。
        演奏技術の審査などは無い。

テーマ : 日記 - ジャンル : 日記

ジャンプ15号感想

●ワンピース
白ひげがお亡くなりになりました。

今までは、「死んだと思っても最終的に生き延びるんでしょ?」みたいな所
があったのですが、 (ペルーとか)
今後は死ぬキャラは死ぬ、という展開になりそうです。


で、今回 黒ひげが最高のショーを見せるといいながら、
黒い布で自分達が見えないように隠しました。

・・・何で隠す?
見せると言っているのだから一部始終見せてください。
(おまけに、黒い布を外しても外見上は何も変わってないという。)

とりあえず、何故 隠さないといけなかったのか?を考えてみる。
------------------------------------------------------------
【1】能力を奪い取る過程に、自身の弱点を示す何かがある。
【2】能力を奪い取る時に、見苦しい行為を伴う。(周囲への配慮)
【3】条件さえ揃えば、複数の能力獲得は 他人にも真似できるから。
【4】ただの気まぐれ。

------------------------------------------------------------
自分は【3】が可能性高いんじゃないかなーと思います。

悪魔の実は物体にも食べさせる事が出来るという前例があるわけですし、
(イヌイヌの実を食った "犬"銃ラッスー)
何らかの方法で「複数の能力を得たぜ!」みたいな事が出来るのかも。
なので、他の一般人に真似されないように手口を隠した、と。

今回、複数の能力を得られたのは「黒ひげの体の異形」によるもの
言われてましたし、
ヤミヤミの実は白ひげから能力を取り出すだけに使ったのかな、と。
(ヤミヤミの実 != 複数の能力を手に入れられる力)

で、「体の異形さ」というのは、体が2人分、もしくはそれ以上で構成
されている、とかそんな感じなのかも?
(もしくは武器に能力を付加させて、その武器を体内に埋め込んでいる、など。)


●スケットダンス
今回、スイッチの失くしたマダムファミリアのぬいぐるみというのが
出てきたのですが、
ライアーゲームの葛城さんに見えて仕方がなかったです。

↓葛城さん。
葛城さん

マダムファミリアじゃなくて葛城さんのぬいぐるみですよ。アレは。


●トリコ
トミーロッドさんの顔芸がとてもとても映えた回でした。
で、卵爆弾についてですが、熱すると本当にあんな感じで爆発しますよね。
電子レンジにかけたりするとヤバイです。 ※真似しないでね

【参考URL】Brainiac - Ostrich Egg in the microwave
(ダチョウの卵の実験動画(Youtube)です)


●ロックオン
そろそろリアクションを取るためだけのエキストラ(クラスメイト)に
名前を付けてあげた方が良いと思う。
(基本的にストーリーに関係のある人間しか、名前や性格が出ないのです。


●四ツ谷先輩の怪談。
演出は面白いと思うんです。
でも、まだ足りない。


脳噛ネウロの初期の見所と比べてみましょう。
ネウロの見所(興味をひく所)は、
--------------------------------------------------------------------
【1】犯人の予想。 (誰が犯人なのか?)
【2】犯行のトリック。
【3】追い詰められた後の、犯人の発狂モード。

--------------------------------------------------------------------
まぁ、大体この3つになると思います。

で、四ツ谷先輩についてですが、
犯人の行動が露骨過ぎるので、まず【1】はありません。
(容疑者も大抵1人ですし)

次にトリック。
今のところ面白いトリックで犯行を誤魔化して~みたいなものは無いので、
同様に【2】もありません。

最後に発狂モード。
四ツ谷先輩では、追い詰めたら犯人はブルブル震えるだけなので
発狂モードは存在しません。 つまり【3】も存在しません。


四ツ谷先輩には、これらの要素が足りないと思うのです。

具体的に言うと、
-----------------------------------------------------
・容疑者が複数居るので、その中から犯人を探し出す
・巧妙なトリックで、犯人はアリバイを作る
・追い詰められたら、変な行動に出始める

-----------------------------------------------------
みたいな展開があっても良いかと。
(流石にあからさまな犯人⇒逮捕だけじゃマンネリかと。)


●賢い犬リリエンタール
なぜかてつこの全裸シーンが。

んー
この作者の方にはバトルとか色欲要素は向いていないのではないかと思います。

タイトルのひらがな表記&漫画の中でのやや難しい言葉の注釈などを見てもわかるように、
作者は子供向けの楽しめる作品を作ろうとしてるとおもうんですよ。

ですから、仮に「サービスシーン的なもの描きなさい」とか指示されて描いたとしても、
Toらぶるみたいな突き抜けた領域には到達しないと思うのです。
(必ず作者の性格などにより、サービスシーンは控えめ、抑制されたものになるかと)

テーマ : 週刊少年ジャンプ全般 - ジャンル : アニメ・コミック

JavaScriptでゲームを作ろうとしてみる

現在JavaScriptを勉強中です。
何故かと言うと、
この記事内にゲームを表示できたら遊びやすいかなと思ってるからです。

なので、現在プログラミングの合間に少しずつ学習しております。
------------------------------------------------------
DirectXのプログラミング
JavaScriptの学習 & プログラミング
DirectXのプログラミング
------------------------------------------------------
こんな感じ。
プログラミング作業の休憩がプログラミング作業という
   意味の分からん状態になってます。)

で、このJavaScriptですが 大抵 上手く動きません。
(実にいまいましい)

まぁ、コードが色々とミスっているというのもあるんでしょうけど、

なんかブログ記事内では自動的に改行文字が付加されて、
それがJavaScriptのコードを成り立たなくさせているという、
まぁそんな問題があるっぽいです。

とりあえずブログ記事の設定で、 改行の扱い⇒HTMLタグのみ
にしたら、JavaScriptのサンプルコードが実行できました。
(その代わりエンターキーを押しても改行されないので、いちいち文末に<BR>
記述しなきゃいけないのでちょっと面倒。

とりあえず、上手くいった
JavaScriptのサンプル実行中。(時計)↓
ただいまです。

この調子でゲームも作れそうな気がするんですけど、
まだちょっと時間がかかりそうです。
(ブラウザによって処理を分けたり、 JavaScript対応、非対応でメッセージの表示を変えたりなど、
色々と考慮しないといけないことがある。

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

"落書き"の域を超えている絵

たまたま、こくばん.inというサイトを見つけました。
2008年 2月24日に 公開したらしい)

【参考URL】チョークの粉も再現 黒板に落書きできる「こくばん.in」のこだわり


なんだか、黒板にチョークで落書きをするかのように絵が描けるらしいです。
で、描いた絵は公開されてランキングなんかもついてる模様。

とりあえず、実際に投稿されている落書き↓

【参考画像】
こくばんin
※落書きには、リプレイ機能といって、
絵が完成するまでの過程をダイジェストで見る事も出来る模様。


で、驚いたのが一部の作品。
無駄に次元の違う落書きがあったりします。

例えばコレ。

【参考画像】
こくばんin2
もう落書きのレベルじゃない。
(な、なんだこれは・・・!?)

落書きではありません。 最早 絵画です。
【参考URL】ささくれP氏の曲を繋いでみる『ワンダーラスト』


後 他にも コレ↓

【参考画像】
こくばんin3
最初、 「何で写真を貼り付けてるの?」と思ったのですが、
これ、絵です。
(実物にしか見えない。)

【参考URL】ドーナツ


それにしても、凄すぎる。
いずれも落書きの域を超えております。
(絵 うまくなりたいな)

------------------------------------------------------------------------
最後に。
こくばん.inというサイトは、サービスが独特で面白いですね。

そして、独特なサービスと言えば 他に検定ごっこなんかもあります。
【参考URL】けんてーごっこ

※こちらはオリジナルの検定を作成したり、
他の人が作成した検定を受けたり出来るサービスです。
(会員数は1000万人を突破しているとの事。)


で、今後 独特かつ面白いサービスなんかが出来れば、
大ヒットしたりする可能性があるんじゃないかなーと思いました。
新種の娯楽サービスなんかが流行るかもしれない)

テーマ : 日記 - ジャンル : 日記

DirectXの描画方法を更に変えてみる

【リンク】 ◆解説系TOP◆

先日、 DrawPrimitiveUP関数だけでなく、
他の異なる描画方法として、
-------------------------------------
DrawPrimitive関数
DrawIndexedPrimitive関数
DrawIndexedPrimitiveUP関数
-------------------------------------
なども試したのですが、 更に描画方法を変えてみます。


まず、レンダリングパイプラインにデータを流す道のようなもの(データストリーム)
があり、それは最大16本あるのですが、

【参考画像】
レンダリングパイプライン

今まで、1本しか使っておりませんでした。


↓今までの大まかな流れ。
MY_VERTEX* v;
g_pD3DDevice->CreateVertexBuffer(//省略);
g_vb->Lock( 0, 0, (void**)&v, 0);
//頂点データを入れる
g_vb->Unlock();

g_pD3DDevice->SetStreamSource( 0, g_vb, 0, sizeof(MY_VERTEX) ); //データストリーム0番を指定。それだけ。
g_pD3DDevice->SetFVF(MY_VERTEX_FVF);
g_pD3DDevice->Primitive(//省略);


なので今回は、複数のデータストリームを使って描画しようと思います。
※具体的に言うと、頂点、法線、頂点色などの
データの種類ごとにデータストリームを分割します。

【参考画像】
パイプライン


で、こういう風にすると良い事があります。

まず、今までの構造体のデータをデータストリーム0番に流すという方式だと、
構造体の定義が面倒な事になります。
(データの組み合わせが無数に存在するため)


【組み合わせの例】
------------------------------------------------------------------------
パターン1:頂点座標スペキュラー色
パターン2:頂点座標法線頂点サイズ
パターン3:頂点座標法線頂点色
パターン4:頂点座標法線テクスチャ座標
パターン5:頂点座標法線頂点色テクスチャ座標
パターン6:頂点座標頂点色
パターン7:頂点座標頂点サイズ頂点色

------------------------------------------------------------------------
【構造体の定義例】
struct MY_VERTEX{
float px, py, pz;
float nx, ny, nz;
};
struct MY_VERTEX2{
float px, py, pz;
DWORD color;
};
struct MY_VERTEX3{
float px, py, pz;
DWORD color;
float u,v;
};
struct MY_VERTEX4{
float px, py, pz;
float nx, ny, nz;
DWORD color;
float u,v;
};
:
以下略
このように、可能性のある組み合わせの構造体を定義しておかなければなりません。


それと定義以外にも、自力でXファイルを読み込むクラスを作る場合、
データを最後まで読み込まないと、どの構造体を適用すればよいのか分かりません。
(上記で言えば、パターン何番なのかが分からない)

これも処理が面倒になります。

しかし、それぞれのデータをバラバラに定義しておけば、
構造体の数が増えまくることはありません。

struct VERTEX_POSITON{
float px, py, pz;
};
struct VERTEX_NORMAL{
float px, py, pz;
};
struct VERTEX_DIFFUSE{
DWORD color;
};
struct VERTEX_UV{
float u,v;
};

上の構造体を定義しておけば、 下記の組み合わせ全てに対応できます。
--------------------------------------------------------------
頂点座標頂点色
頂点座標頂点色テクスチャ座標1
頂点座標頂点色テクスチャ座標1テクスチャ座標2
頂点座標法線頂点色
頂点座標法線頂点色テクスチャ座標
頂点座標法線頂点色テクスチャ座標テクスチャ座標2

--------------------------------------------------------------
(バラバラの部品を用意しておいて、必要に応じて組み合わせる感じ。)


また、Xファイルの読み込みも
-------------------------------------------------------
頂点座標の情報が来たら、頂点座標のバッファ確保
法線の情報が来たら、法線のバッファ確保

-------------------------------------------------------
という風に、適宜 個別のバッファを確保して行けばいいだけになります。

※構造体形式だと、下記の様な手順になってしまいます。
----------------------------------------------------------------------
【1】全てのデータを一時的に保持しておく (頂点座標、法線、頂点色など全て)
【2】データを読み終わった後、どの組み合わせの構造体なのかを把握
【3】任意の頂点データの組み合わせの構造体のバッファを作成。
【4】構造体のバッファに、一時保存しておいたデータを代入していく。

----------------------------------------------------------------------


あと、データストリームを分割する事のメリットはもう1つあります。
分割しない場合は、データを流す、流さない、
つまり描画するか、しないかの2択しかない訳ですが、

【参考画像】
ストリーム

分割しておくと、一部のデータだけ流す、という事が出来るようになります。

【参考画像】
ストリーム2

モデリングソフトなんかでは、 頂点だけを表示面も表示線だけを表示など
切り替えられる機能があったりしますよね。
まさに あんな感じです。

で、概念だけでなく、実際のプログラムも書いてみようと思います。

【ソースコード】MultiStream.txt

※とりあえずソースコードをUPしました。
→と←で、表示が切り替わります。(頂点の 表示←→非表示)

解説は後日になります ε(´・ω・`)

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

大学のフォルダ整理してたら なんか出てきた

もうすぐ、
大学のPCに入れてるデータや、メールアドレスが使用できなくなるので、
ちょっと大学へ整理をしに行ってきました。
(必要なデータがあったら、移動させておこうかな、と思った)


殆どは無くなってもいいようなデータだったんですけど、
これは取っておきたいな、というデータがありました。

コレ↓

【参考画像】
城城2

いやぁ懐かしい。
これはVRMLの講義の課題で制作したものです。

「2週間ぐらいでとにかく何か作れ」と言われてたので、
瀕死になりながら作成した記憶があります。
(他の講義の課題とかもあったので、とにかく時間が無かった)

※VRML・・・3次元の物体を作成、表示できたりするモデリング言語。


データも引っ張って来たので、欲しい方はどうぞ。
(需要はあるのだろうか?)

【データ】vrml.txt
(拡張子を.wrlに変更する必要があります)


あと、更に調べてみたら
ききききききききききききフォルダが見つかりました。
(我ながら名前 適当すぎ

【参考画像】
大学

で、このフォルダの中には
かつて制作したゲームプログラムが入ってました。
(過去の記事で紹介したやつです。↓)
【参考URL】自作ゲーム(一応)完成!

【参考画像】
にんじん


これまた懐かしい。
しかもコードを見ていると、その中にBitBlt関数がありました。
(ビットブリット関数ってWindowsAPIでは無いか・・・!

制作したのは9ヶ月くらい前なのですが、
この頃はDirectXはおろか、DXライブラリすら使ってなかった頃だった模様。

とりあえず、アップロードしてみました。↓
【参考URL】 ぷぷっぷ!アップローダー
PASS:12345


ルール(仕様)は
-----------------------------------------------------------------------
・1000G貯まったらクリア (タイトル画面に突然遷移する)
・HPが0になったらゲームオーバー
・Zキーで弾発射、十字キーで移動。
・Pボタンでポーズ
-----------------------------------------------------------------------
です。

※ちょっとしたミニゲーム程度なので、過度な期待はしないで下さい(・ω・)

テーマ : 日記 - ジャンル : 日記

死ぬかと思った経験

今日は、死ぬかと思った経験を書いてみる。


【1】風呂にて。
昔、自分は 風呂でなぜか仮眠を取るクセがありました。
で、結構 長めに眠って起きた時の事でした。

体がマトモに動かない。

力を入れても上手く力が入らず、動いてくれないんですよ。
おまけに頭がフラフラして気分が悪い。

下手したらそのまま力が抜けて浴槽に沈むかもしれない状態でした。

「かなり浅いところなのに溺死した」みたいななニュースを聞いたりしたことがあるのですが、
うん、 本当に溺れます。
(怖い怖い)

---------------------------------------------------------------------------
あ、溺れるで思い出したのですが、 昔 謎の溺死をしたダイバーの方が居たそうです。
(ユーリ・リプスキー氏)

突然 何かに引っ張られるように物凄い勢いで落下していったとの事。
これも不可思議で 何だか怖いです。

【Youtube】あるダイバーの最期
(カメラが映していた最期の瞬間の映像を見て、知人達が考察している動画です)
---------------------------------------------------------------------------

その後、何とかズルズルと引きずるような形で浴槽から脱出。
井戸から這い上がる貞子を 忠実に再現した動き。)

しばらくは 気分悪くて立てませんでしたが(座った状態)、
数分ぐらいして、正常な状態に戻りました。

それ以来 風呂で寝ない & 早めに上がるようにしてます。


【2】階段にて。
5~6歳の頃だったと思います。
階段を下りようとしたら、 頭から落下していきました。
(つまずいた)

【参考画像】
階段
※落ちて行く瞬間、全ての動きがスローモーションに見えました。

落ち方によっては、大惨事になる可能性もあったのですが、
なんと、綺麗に前転しながら落下する形になり無傷でした。

【参考画像】
階段2

そして、回転している最中は何が何だか分からなかったんですけど、
気がついたら階段の1段目に座ってました。

【参考画像】

階段3

かなり危ない出来事でしたが、
何事も無くて良かったです。

テーマ : 日記 - ジャンル : 日記

3月9日は"初音ミクの日"らしい

3月9日は、初音ミクの日らしいです。
(ミク=3 9)

で、それにちなんでイベントも行われてるとか何とか。

【参考画像】
初音ミク
■ミクの日感謝祭 39’s Giving Day Project DIVA presents
「初音ミク・ソロコンサート ~こんばんは、初音ミクです。~」概要

【開催日時】2010年3月9日19:30~(開場18:30)
【開催会場】Zepp Tokyo(東京・台場)
【出演】初音ミク(THE 39S)、他
【料金】スタンディング4,390円(税込)、ドリンク代別
 ※入場時に『Project DIVA Arcade♪』特製ICカードをプレゼント
【参考URL】3月9日はミクの日! 初音ミクのソロコンサートが開催決定!!


なんか凄いことになってますね。

キャラクターは
--------------------------
一過性のブームのもの
継続して支持されるもの

--------------------------
の2通りあると思うのですが、ミクは後者になりそうです。

ここまで存在が大きくなるとは。


あと、他にもヴォーカロイドは居るのですが、
鏡音リンレン巡音ルカなど)

初音ミク程の人気まではいかないかな、と思いました。
(シリーズモノのゲームでも何でも良いですが、
  何かと元祖や元祖に近い方が支持されるような気がする。(例外もあると思いますが))


任天堂のキャラクターで例えると、
-----------------------------
初音ミク・・・マリオ
その他・・・ルイージか何か
-----------------------------
こんな感じではないかと。
超えられない何かがある。



それと最後に。
初音ミクは、最近では感情を付けられるようになってるらしいですね。
声が格段に良くなるとか。


で、探してみたらあったので聞いてみました。
【参考URL】「感情」を獲得した初音ミク


↓↓聴いた感想↓↓

全然 違う・・・!
こ、こんなにも違うとは・・・。 凄まじい進歩だ。

↓左から順に、 感情付加Ver2つ、原曲1つを並べてます。
恐らく、聴いたら違いが分かるでしょう。
ソフトでしっとりとした表情である「soft」バージョン。              通常よりも暗い表情の声である「dark」バージョン。              感情付加なしバージョン (原曲)
  


※まとめ※
初音ミクは凄いことになってる。

テーマ : 日記 - ジャンル : 日記

ジャンプ14号感想

●四ツ谷先輩
思ったのですが、話の流れが「脳噛ネウロっぽい」と思いました。

-------------------------------------------------------------------
【1】主人公の身の回りで 事件が起こる。
【2】不思議な人物が、とりあえず別の事件を解決する。
【3】主人公が自分の方の事件も解決してくれる事を謎の人物に期待。
【4】主人公の方の事件は2話以降へ。

-------------------------------------------------------------------

上のパターンに当てはめると、こんな具合。
-------------------------------------------------------------------
【1】ヤコの父親の不審な死。
【2】とりあえず、喫茶店で被害者がハデに吐血した事件を解決。
【3】ヤコが、ネウロなら父親の事件も解決してくれるかも?と期待。
【4】2話以降、父親の事件解決。

-------------------------------------------------------------------
-------------------------------------------------------------------
【1】主人公の親友が消える。
【2】その前に、"3本足のミカちゃん人形"の真相を解明。
【3】四ツ谷先輩なら、親友の失踪事件も解決できるのでは?と期待。
【4】2話以降、解決へ向かう。

-------------------------------------------------------------------

アレですかね。
最初は多くの読者を取り込まなければならないので、
とにかく次回に興味を持たせる展開を持ってくるみたいな。

しかし、実に犯罪者だらけの学校である。


●スケットダンス
今回、 "変なツンデレ"が登場したわけですが、
何だろう、"異質"を感じる。

異質といえば、他に早乙女ロマンさんが挙げられる訳ですが、
この方は、異質ながらも漫画自体には合っているような気がします。

しかし、今回のツンデレさんは何か、
-------------------------------------------------------------------------------
別の漫画からやってきたか、 
スイッチが好きなアニメのキャラクターが、現実世界に出てきた
-------------------------------------------------------------------------------
みたいな感じがする。

漫画の雰囲気、世界観を無視した別の何かから誕生したかのような印象。

スイッチ達が言っているように、
ギャルゲーの要素を片っ端から盛り込んだキャラクターだからかもしれない。


●ブリーチ
山本総隊長が、一番最後に『双骨』という技を放ちました。

で、「コレどこかで見たことある技だな?」と思ってたら、
『栓抜きショット』と全く同じ姿勢だと気付きました。
(トリコ)

吹き出しを「栓抜きショット!!」に変えたり、
来週、ワンダーワイスの体内から仙骨が発射されたりしても 違和感無いと思う。


●トリコ
トリコが突然 美しい森林になったと思ったら、ただのイメージでした。

どうやら、体から精油を放出していたようです。

話とは関係ないですが、
こういう ちゃんと現実に存在している現象、物質なんかは
予想を当てたいという気持ち になります。
(こんなのがあったのか!くそーみたいな気分になる。)

今のところトリコの腕が凍った描写があったのですが、
あれも何らかの現象なんでしょうかね。

んー全然ワカラン。


●ハンターハンター
王の生死はどうなのか? と思ってたら、
いつの間にか料理漫画になってました。

(麺類を食べたら、「こ、この麺は・・・!!」とか言いながら
背景に竜巻が巻き起こる映像が出てくる 、みたいな感じ。)


あとプフもユピーもハァハァ言い出して、
何か うん、ヤバイです。
(様々な意味で)

そして、
その料理漫画みたいな描写で今週が終わるとは思わなんだ。
(部下達がヘブン状態になるから・・・!)

テーマ : 週刊少年ジャンプ全般 - ジャンル : アニメ・コミック

"ライアーゲーム"を観て来た!

ライアーゲームを観てきました!(`・ω・´)

面白かったです。

【参考画像】
ライアーゲーム


ドラマの最終回の"ゴールドラッシュゲーム"は、
一番最後の方で「実は裏でこんな事をしていました」と打ち明ける感じだったので
???
みたいに、状況を上手くつかめない所があったんですけど、

この最終章のエデンの園ゲームでは、
リアルタイムで色んな戦略を編み出したり、裏切り行為が出たりする展開だったので、
「なるほどー!」と思えて楽しかったです。

少数派でも多数派になれる方法など。
(合計11人で、 6人 対 5人 のグループに分かれている場合であっても、
                とある作戦少数派に居る人間が多数派に勝てる。


状況が大きく2転3転するのも良かった。

あと11人ともナオさんみたいな人だったら、
-----------------------------------------------------------------------
ディーラー「第一回の結果を発表します。 赤リンゴ11個です。 」
ディーラー「第二回の結果を発表します。 赤リンゴ11個です。 」
ディーラー「第三回の結果を発表します。 赤リンゴ11個です。 」
事務局「なんか 赤ばっか揃ってるんだけど・・・」

-----------------------------------------------------------------------
こんな状況になったんだろうなぁ、と思いました。
映画が30分くらいで終わりますね)


この映画はドラマを観た事を前提とした登場人物などがあるので、
映画を見る前にドラマを見ておいたほうが良いかなーと思います。
(この人、 "24連装ロシアンルーレット"でボコボコにされてた人の弟か!、みたいな。)
※お前の事だ 西田!


ドラマを既にご覧になった方は、是非 観てみては、と思います。(・・)+

テーマ : 日記 - ジャンル : 日記

DirectX 描画方法まとめ(コードもあるよ)

【リンク】 ◆解説系TOP◆

今日はプログラミングのお話。

DirectXでは、ポリゴンなどを描画する関数は、
---------------------------------------------------
・DrawPrimitiveUP 関数
・DrawIndexedPrimitiveUP 関数
・DrawPrimitive 関数
・DrawIndexedPrimitive 関数

---------------------------------------------------
上記の4つ があります。
(まだ他にもあるかも?)


で、自分はその中のDrawPrimitiveUP関数しか使っておりませんでした。
(むしろ、描画 = DrawPrimitiveUP関数だと思ってた。)

さらに、最後にUPがつく関数は、
(DrawPrimitiveUP 関数 、DrawIndexedPrimitiveUP 関数 )
----------------------------------------------------------------------
バッファの作成 → 頂点データコピー → 描画 → バッファの開放
----------------------------------------------------------------------
毎回毎回このような手順を踏むため、遅いとの指摘を頂きました。
( そういえば、以前 "立体倉庫番"を作ったのですが 微妙に動きがカクカクしてました。
 絶対コレのせいだ・・・ Σ(・ω・`||)  )


まぁ、という訳で これからは快適な描画をする為に、
先日上記の4つの関数を理解し、実際にプログラムを組みました。

今日は、その4つの関数の使い方実際のソースコードを書きます。



DrawPrimitiveUP 関数


この関数を使う場合は、下記の様な流れになります。
-----------------------------------------
【1】頂点データの構造体を定義。
【2】構造体型の変数にデータを入れる。
【3】SetFVF関数を呼ぶ。
【4】DrawPrimitiveUP関数を呼ぶ。

-----------------------------------------

では、実際のコード。

【1】頂点データの構造体を定義する。
struct MY_VERTEX{
float px, py, pz;
DWORD color;
};
頂点座標頂点の色を持つ 頂点データです。)

【2】構造体型の変数(配列)に、データを入れる。
MY_VERTEX v1[] = {	{0, 2, 0, 0xffff0000},  //赤色
{2, 2, 0, 0xff00ff00}, //緑色
{0, 0, 0, 0xff0000ff}, //青色
{2, 0, 0, 0xffffffff},}; //白色

【3】SetFVF関数を呼ぶ。
g_pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE);
※頂点フォーマットの内容を伝達する。
(「描画しようとしているのは、頂点座標頂点の色を持つデータですよ」、みたいな。)


※補足※
"D3DFVF_XYZ"等は、オブジェクト形式マクロです。
オブジェクト形式マクロ・・・特定の文字列を置換する。
-------------------------------------------
#define D3DFVF_XYZ 0x002
#define D3DFVF_DIFFUSE 0x040

-------------------------------------------
ヘッダファイル内では 上記のようになっているので、
それぞれ16進数の 0x002、0x040に置換されます。

また、SetFVF関数を呼ぶときにD3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_SPECULAR ・・・
と言う風にすると長くなるので、 大抵は更にオブジェクト形式マクロを使って簡便化します。
#define MY_FVF  (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_SPECULAR)
//中略//
g_pD3DDevice->SetFVF(MY_FVF);

【4】DrawPrimitiveUP関数を呼ぶ。

g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, v1, sizeof(MY_VERTEX);


【具体的な引数の意味】
HRESULT DrawPrimitiveUP(
D3DPRIMITIVETYPE PrimitiveType,
UINT PrimitiveCount,
const void *pVertexStreamZeroData,
UINT VertexStreamZeroStride
);


PrimitiveType・・・プリミティブタイプ(頂点を結びつける順番を決めたりする)を指定する。
PrimitiveCount・・・三角ポリゴンの数。
*pVertexStreamZeroData・・・頂点データのポインタを渡す。  (今回は、【2】で定義した、v1を渡す)
VertexStreamZeroStride・・・頂点データ間のストライドを指定。

※補足※
4番目の引数のStride(ストライド)というのは"幅"という意味です。
今回の頂点と頂点色の配列を定義すると、メモリ上は下記の様になるのですが、

【参考画像】
Stride.jpg

この頂点データの先頭(px)から先頭までの幅がStrideになります。
要するに、sizeofで構造体の大きさを渡してやればOKです。

【ソースコード】Sample_PrimitiveUP.txt




DrawIndexedPrimitiveUP 関数


この関数を使う場合は下記の手順を踏みます。
-----------------------------------------
【1】頂点データの構造体を定義。
【2】インデックスの構造体を定義
【3】構造体型の変数にデータを入れる。
【4】SetFVF関数を呼ぶ。
【5】DrawIndexedPrimitiveUP関数を呼ぶ。

-----------------------------------------
※【1】、【3】、【4】は全く同じなので省略

【2】インデックスの構造体を定義
インデックスの構造体を定義します。
インデックスというのは、結ぶ頂点の順番を決めるための頂点番号の配列だと思ってください。

サンプルコードでは下記の様に定義してます。

WORD index[] = { 1, 2, 3, 0, 1, 2, 0, 1, 2, 3};
 
WORD型(unsigned short型)の一次元配列に なっており、
---------------------------------------
index[0]~index[2] までをインデックスA
index[3]~index[5] までをインデックスB
index[6]~index[9] までをインデックスC
---------------------------------------
として利用します。
※何故 「WORD型」の配列なのか?は後で説明します。

また、
【参考画像】
頂点
今回は 上記の様に4つの頂点で四角ポリゴンを定義しているので、
それぞれのインデックスを使った場合の描画されるポリゴンは下記の様になります。

【参考画像】
頂点2

【5】DrawIndexedPrimitiveUP関数を呼ぶ。
頂点データ、インデックス、そしてSetFVF関数の呼び出しが終わった後、
この関数を呼びます。

g_pD3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLESTRIP, 1, 3, 1, index, D3DFMT_INDEX16,v1,sizeof(MY_VERTEX));


【具体的な引数の意味】
HRESULT DrawIndexedPrimitiveUP(
D3DPRIMITIVETYPE PrimitiveType,
UINT MinVertexIndex,
UINT NumVertices,
UINT PrimitiveCount,
CONST void * pIndexData,
D3DFORMAT IndexDataFormat,
CONST void* pVertexStreamZeroData,
UINT VertexStreamZeroStride
);


PrimitiveType・・・プリミティブタイプ(頂点を結びつける順番を決めたりする)を指定する。
MinVertexIndex・・・最小のインデックス番号を指定します。 インデックスAは1(番)、Bは 0(番)、Cは 0(番)になります。
NumVertices・・・インデックスにより表示されるポリゴンの頂点の数を指定。インデックスAは3Bは 3Cは 4になります。
PrimitiveCount・・・三角ポリゴンの数を指定します。インデックスAは1Bは1Cは 2になります。
pIndexData・・・インデックス配列の(先頭の)ポインタを指定します。インデックスAは &index[0]Bは &index[3]Cは &index[6]になります。
ndexDataFormat・・・インデックスデータのフォーマットを定義します。有効なのはD3DFMT_INDEX16 と D3DFMT_INDEX32のみ。
pVertexStreamZeroData・・・頂点データのポインタを渡します。 今回はv1と指定。 (v1・・・頂点データの配列に与えた名前。)
VertexStreamZeroStride・・・頂点データ間のストライドを指定します。 "ストライド"の詳細は前述した通りです。


※補足※
ndexDataFormatで指定できるのは、 D3DFMT_INDEX16D3DFMT_INDEX32のみで、
それぞれ、「16 ビットですよ」「32ビットですよ」という意味です。

今回、インデックスの配列にWORD型を用いたのは、
上記の2種類の中からしか指定出来ないようになっていたからです。
WORD型は2バイト(16ビット)。)

【ソースコード】
Sample_IndexedPrimitiveUP.txt
※↑→← キーで、インデックスA,B,Cを切り替えられるようになってます。



DrawPrimitive 関数

この関数を使う場合は、下記の様な手順になります。
-----------------------------------------
【1】頂点データの構造体を定義。
【2】CreateVertexBuffer関数で、 バッファを作成。
【3】Lock関数を呼ぶ
【4】頂点データを入れて行く。
【5】Unlock関数を呼ぶ。
【6】SetStreamSource関数を呼ぶ

【7】SetFVF関数を呼ぶ。
【8】DrawPrimitive関数を呼ぶ。
【9】バッファの開放。 ←※重要!

-----------------------------------------
~UP関数より ちょっと手順が多いですが、一つ一つ確認していけば大丈夫でしょう。
(逆に言えば、~UP関数は上記の青字の部分の処理を隠蔽してくれているのです。

では、同様に青字の部分のみに絞って解説をば。


【2】CreateVertexBuffer関数を呼ぶ。

LPDIRECT3DVERTEXBUFFER9 g_vb = NULL;
 
g_pD3DDevice->CreateVertexBuffer(
4*sizeof(MY_VERTEX),
D3DUSAGE_WRITEONLY,
MY_VERTEX_FVF,
D3DPOOL_MANAGED,
&g_vb,
NULL);

まずCreateVertexBuffer関数を呼び、バッファを作成します。
※この関数を呼ぶ前にLPDIRECT3DVERTEXBUFFER9型の変数頂点データの構造体
定義しておく必要があります。

【具体的な引数の意味】
HRESULT CreateVertexBuffer(
UINT Length,
DWORD Usage,
DWORD FVF,
D3DPOOL Pool,
IDirect3DVertexBuffer9** ppVertexBuffer,
HANDLE* pHandle
);


Length・・・頂点バッファのサイズを指定。頂点の数×頂点データの構造体のサイズを指定すればOKです。 ※上記参照。
Usage ・・・使用方法の指定をする。上記の例では"D3DUSAGE_WRITEONLY"(バッファへの書込み操作しかしませんよ、の意)を指定。
FVF ・・・頂点フォーマットを指定。 頂点フォーマットについては、一番上の方の"オブジェクト形式マクロ"の部分に詳しく書いてあります。
Pool・・・バッファを保持するメモリ クラスをD3DPOOL 列挙型で指定する。
ppVertexBuffer ・・・作成した頂点バッファへのポインタのアドレスを指定。(LPDIRECT3DVERTEXBUFFER9型の変数のアドレスを渡す。)
pHandle・・・このパラメータは常にNULLでOKとのこと。
※補足※
Usage(使用法)とD3DPOOL 列挙型については下記に詳しく書いてあります。
【参考URL】D3DUSAGE
【参考URL】D3DPOOL 列挙型


【3】Lock関数を呼ぶ
バッファの作成が終わったら、CreateVertexBuffer関数に渡した
LPDIRECT3DVERTEXBUFFER9型の変数で Lock関数を呼びます。

MY_VERTEX* v;
g_vb->Lock( 0, 0, (void**)&v, 0);


Lock関数は、定義したい頂点データへのポインタのアドレス(上記のv)を
(void**)にキャストして渡します。

そして、他の引数は0で問題ないです。
(他の値を設定する事も出来ますが、特別な意図が無い限り0固定でOKかと。)
【参考URL】IDirect3DVertexBuffer9::Lock メソッド

また、Lock関数は
頂点バッファへ書き込み中にシステムが勝手にメモリを移動させたりしないようにする為に、
呼び出す必要があります。


【4】頂点データを入れて行く。
v[0].px = 0;	v[0].py = 2;	v[0].pz = 0;	v[0].color = 0xffff0000;
v[1].px = 2; v[1].py = 2; v[1].pz = 0; v[1].color = 0xff00ff00;
v[2].px = 0; v[2].py = 0; v[2].pz = 0; v[2].color = 0xff0000ff;
v[3].px = 2; v[3].py = 0; v[3].pz = 0; v[3].color = 0xffffffff;

Lock関数の呼び出しが終わったら、Lock関数に渡した頂点データの構造体のポインタを使って
データを定義していきます。

上記は、頂点座標と、頂点色を持っている構造体の場合の例です。


【5】Unlock関数を呼ぶ。
g_vb->Unlock();

頂点データの定義が終わった後、Unlock関数を呼びます。
(先ほどLock関数を呼んだLPDIRECT3DVERTEXBUFFER9型の変数から呼びます。)

引数は無いので単純に呼ぶだけです。
また、Unlock関数はLockした場所を解除する関数です。


【6】SetStreamSource関数を呼ぶ
先ほどまでバッファの作成を行う処理だったわけですが、
バッファを作成しただけでは描画出来ません。

「このバッファを描画対象としてセットしますよ」
デバイス側に通知する必要があります。 それがこのSetStreamSource関数です。


↓コード例
g_pD3DDevice->SetStreamSource( 0, g_vb, 0, sizeof(MY_VERTEX) );


【具体的な引数の意味】
HRESULT SetStreamSource( 
UINT StreamNumber,
IDirect3DVertexBuffer9 *pStreamData,
UINT OffsetInBytes,
UINT Stride
);


StreamNumber・・・データ ストリームの番号を指定する。
pStreamData・・・セットする頂点バッファを指定。(Lock関数などを呼び出したIDirect3DVertexBuffer9型の変数を渡す。)
OffsetInBytes・・・頂点データ先頭までのオフセット (バイト単位)を指定。 今回の構造体は、構造体の先頭 = 頂点データの先頭なので、オフセット(差分)はありません。
Stride・・・ストライド(一番上の方で説明済)を指定します。 sizeofを使って構造体の大きさを渡してやればOKです。


※補足※
データストリームについて。
まずDirectXでは、レンダリングパイプラインを通じて描画を行っています。
レンダリングパイプライン・・・座標の計算や、色を塗る等の加工を行う 一連の処理手順。

で、そのレンダリングパイプラインにデータを流し込む道のようなもの
複数 用意されているのです。
その道のようなものがデータストリームであり、図にすると下記の様な感じになります。

【参考画像】
レンダリングパイプライン

【8】DrawPrimitive関数を呼ぶ。
バッファの作成と、バッファのセット、
SetFVF関数の呼び出しが終われば、いよいよ描画です。
g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,4);


【具体的な引数の意味】
HRESULT DrawPrimitive(
D3DPRIMITIVETYPE PrimitiveType,
UINT StartVertex,
UINT PrimitiveCount
);


PrimitiveType・・・プリミティブタイプ(頂点を結びつける順番を決めたりする)を指定する。
StartVertex・・・描画を開始する最初の頂点の番号。
PrimitiveCount・・・三角ポリゴンの数。


引数が3つですし、簡単ですね。

通常はポリゴン全てを描画すると思いますが、2,3番目の引数を変更して
途中から描画したり最初から途中までを描画したりする事ができます。

【9】バッファの開放。 ←※重要!
最後は確保したバッファを開放します。
g_vb->Release();
g_vb = NULL;

※NULLを入れているのは、
開放した後バッファが開放されて何も無い場所にアクセスするのを防ぐためです。
(バッファに限らず、ポインタは使用前・後にNULLを入れたほうが良いでしょう。)

関係ないですが、自分は初め解放し忘れていた為、
------------------------------
・別ウィンドウが開かなくなる
・ペイントが起動出来なくなる

------------------------------
など酷い目に遭いました。

【ソースコード】Sample_DrawPrimitive.txt
↑・・・ポリゴンの最初から途中まで
→・・・ポリゴン全部
↓・・・ポリゴンの途中から最後まで

※上記のように、押したキーによって描画方法を分岐させてます。


DrawIndexedPrimitive 関数

この関数を使う際は、大体 下記の手順になります。
-----------------------------------------
【1】頂点データの構造体を定義。
【2】CreateVertexBuffer関数で、 頂点バッファを作成。
【3】Lock関数を呼ぶ
【4】頂点データを入れて行く。
【5】Unlock関数を呼ぶ。
【6】CreateIndexBuffer関数で、インデックスバッファを作成。
【7】Lock関数を呼ぶ
【8】インデックスのデータを入れて行く。
【9】Unlock関数を呼ぶ。

【10】SetStreamSource関数を呼ぶ。
【11】SetIndices関数を呼ぶ。
【12】SetFVF関数を呼ぶ。
【13】DrawIndexedPrimitive関数を呼ぶ。
【14】バッファの開放。 ←※重要!

-----------------------------------------

正直、この関数 めっさ面倒くさいです。

まぁでも さっきのDrawPrimitive関数の手順から
インデックスバッファの作成インデックスバッファのセットが増えただけです。

Lockの部分とかも同じなので、【11】と【13】に絞って説明します。

【11】SetIndices関数を呼ぶ。
Direct3DIndexBuffer9型の変数でインデックスバッファを作成した後、
頂点バッファと同様、インデックスバッファもセットする必要があります。
(このインデックスバッファを使いますよ、みたいな)
g_pD3DDevice->SetIndices(g_ib);
※単純に変数を渡せば終わりです。

【13】DrawIndexedPrimitive関数を呼ぶ。
この関数がまた面倒くさい。
後半に、5つの値を引数として渡すので、
何が何の値なのか分かりづらい のです。
g_pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP,0,0,4,0,1);


【具体的な引数の意味】
HRESULT DrawIndexedPrimitive(          
D3DPRIMITIVETYPE Type,
INT BaseVertexIndex,
UINT MinIndex,
UINT NumVertices,
UINT StartIndex,
UINT PrimitiveCount
);

PrimitiveType・・・プリミティブタイプ(頂点を結びつける順番を決めたりする)を指定する。
BaseVertexIndex・・・インデックス バッファの開始地点から最初のインデックスまでのオフセット(差分)。※通常は0で良いです。
MinIndex・・・描画で使用される最小の頂点番号。
NumVertices・・・最小インデックスから、最大インデックスまでの数。(頂点0 1 2の場合は0~2なので3。 頂点0 1 3の場合は0~3なので4。
StartIndex・・・インデックス配列の読み取りを開始する位置。
PrimitiveCount・・・三角ポリゴンの数。

サンプルでは、インデックスの一次元配列にインデックスA~Eを纏めて入れてます。↓
-------------------------------------------------------------------
i[0] = 0; i[1] = 1; i[2] = 3; //インデックスA
i[3] = 0; i[4] = 1; i[5] = 2; //インデックスB
i[6] = 0; i[7] = 3; i[8] = 2; //インデックスC
i[9] = 1; i[10] = 3; i[11] = 2; //インデックスD
i[12] = 0; i[13] = 1; i[14] = 2; i[15] = 3;//インデックスE

-------------------------------------------------------------------
そして、このA~Eインデックスを
十字キーとエンターキーで切り替えられるようになってますので、
上手く描画されているか確認してみてください。

ポリゴンの方は、頂点0番~3番で構成される単純な正方形のポリゴンです。
(既に上の方に 画像は貼ってあります)

【ソースコード】Sample_IndexedPrimitive.txt

長かったですが、以上!
まとめ -完-

テーマ : ゲーム - ジャンル : ゲーム

ゲーム関連の本を購入してみた

また、 ゲーム関連の参考書を買いました。

本当に 本を買うぐらいしかお金を使ってないような気がする。
(アルバイトの給料は、全て本の購入へ。 
   全部使い切っているわけではないので、 毎月数万円ずつ 貯金が増えている。)


という訳で、今回購入した本を紹介。


【1】Windowsプロフェッショナルゲームプログラミング
プロフェッショナル
【内容】
知られているところでは知られている、やねうらお氏の本。
ゲームを作る、というより 制作する際のクラスの構築の仕方をアドバイスするような内容です。
また、クラス構築以外に シリアライズ・デシリアライズ、スレッドの同期、ミューテックスなどの
細かいTipsみたいなものも記載されてます。

一通りC++、デザインパターン、テンプレートなどを把握した人向けだと思います。
最後に。時折ギャグとエグい下ネタが入ります。 人によって好みが分かれるところではないかと。



【2】Windowsプロフェッショナルゲームプログラミング2
プロフェッショナル2
【内容】
同じく やねうらお氏の本。
マルチスレッドのデザインパターンや、タスクシステム、ビット演算など、細かい部分の
アドバイスが載ってたりします。
タイトルに「ゲーム」と入っていますが、ゲーム制作というより
プログラミングのTips集といった方が適切かも知れない。

あと、今回はギャグのほかに4コマ漫画もあります。

※4コマ漫画で登場するキャラクター ↓
めもりちゃん
めもりちゃんと、 右側の変なのは お父さんらしい。
【参考URL】メモリ11歳
※いかがわしいページへのリンクがあったので、参考URLを削除しました。
(参考URL先自体は 問題なかったのですけども。)


【3】ゲームエンジンプログラミング
ゲームエンジン
【内容】
汎用的なゲーム開発手法が書かれています。
(スクリプト言語を構築、リソースの外部化、などなど)
C言語の部分が多いので、C++方式に変えたほうがいいかな、と思うところがあるかも。
(malloc, reallocなど)
一番最後には、具体的な実装例としてアドベンチャーゲーム開発の例が載っています。





今回 買ったのはこの3冊です。
で、その中でやねうらお氏 の本はもう在庫が無い状態なので、 出品者から買いました。

実は、以前買おうかなと思ったんですけど、
値段が6000~8000円とか 物凄く高騰してたんですよ。
(定価は2800円。)

だから買えなかったんですけど、 久しぶりに覗いてみたら
値段が1500~3000円程度に落ち着いていたので購入しました。

【参考画像】
プロフェッショナル3



※今 amazonを見てみたら また7000円ぐらいになってました。
【参考URL】Windowsプロフェッショナルゲームプログラミング2

テーマ : ゲーム - ジャンル : ゲーム

卒論終了! そして巨大プリン

卒論終了!

卒論が終わったので、
卒研メンバーで 軽く打ち上げのようなものをしました。
(ピザとお菓子を食べる。)


で、その打ち上げの時に
メンバーの一人が巨大プリンを作ってくれたので、
みんなで分けて食べました。
(分けたというか、 スプーンで削っていった)

どうやって作ったのかは不明ですが、
プリンの素(?)があるらしいので、それをつかってじっくり弱火で温めたとか何とか。

※作り方が載ってるサイトを見つけました↓
【参考URL】童心に帰るバケツプリンの作り方


いや、しかし巨大プリンは凄かったです。

まず、バケツにひっついて取れないので ハンマーとアイスピックでバケツの底を破壊。
すると、 「ズボォォーッ」 と 変な音を出しながら皿の上に落下。

で、無事に皿の上に乗るのですが、 揺れ方が大きい。
面白いぐらいぷるぷる揺れてました。

あまりにも物珍しかった ので写真を撮りました。

【参考画像】
巨大プリン
※右側がペットボトル、 後ろの3つの皿に入っているのが一般的なシュークリームです。
かなり大きい事が分かると思います。
(あと、後ろの方に 今回使用したバケツが。)


で、面白くて しばらくぷるぷるさせたりしていたのですが、
そうしている内に  真っ二つに割れました。

【参考画像】
巨大プリン2

悲しかったです。

テーマ : 日記 - ジャンル : 日記

英検2級 合格!

昨日、 英検の合否結果が見れるようになっていた事に気付いて
確認してみると、 英検2級 合格でした・・・!

【参考画像】
英検

※一部 加工されてるよ。


やった!(`・ω・´)

で、実はですね、 2次試験を受けたのは 2回目です。
1回 受けてみたんですけど、 見事に落ちました。

更に、2次試験の合格率が80%ぐらいあったので、
「落ちるとかありえんじゃろ(´・ω・`)」みたいな感じで ちょっと凹んでました。

【参考画像】
英検2



アレですね。
文法や単語などの暗記モノは出来るけど、リスニングや英会話は上手くできない、みたいな。
もっと練習しないといけないですね。

ともかく、2次試験 不合格となって リスニングと英会話を中心にあれこれ練習したところ、
今回合格する事が出来ました。

↓"あれこれ"の内容。

【参考画像】
英作文トレーニング Lucky Star

練習すれば何とかなるもんです。


ともかく、 合格する事が出来たので 
今後は英検準1級 や TOEICに挑戦しよう と思います!
あとプログラミングの方も どんどん作業を進めたいと思います! (`・ω・´)

テーマ : 日記 - ジャンル : 日記

ジャンプ13号感想

●ロックオン
第2話目で言うのもアレなんですが・・・打ち切られるかもしれない。

この漫画は"主人公がよく分からないタイプ"の漫画なのですが、
(性格・言動・生い立ち などなど)

この場合、次の後者にならなければならないと思うんです。
-------------------------------------------------
・意味が分からないので、感情移入できない
・よく分からない所に一種の魅力らしきものを感じる

-------------------------------------------------

※意味分からなくて敬遠したくなると思われたらアウト。
もし、そうなった場合は、主人公の欠点を補えるほど魅力のある脇役やストーリー
などが無いと、漫画の存続は無理。

最近の漫画で言うと、あねどきっでしょうか。
(桜井さんが居なかったら、"そのマンガもう読んでませーん ビャーッ"状態になってたかも。)

逆に、一種の魅力を感じるパターンの例としてはジャガーさんネウロ
あと今週始まった四ツ谷先輩などが挙げられるかな、と。


●賢い犬リリエンタール
おっと、令一郎さんは、 日野兄さんをライバル視していたようです。
天才 VS 天才 ですね。
(兄さん頑張れ!)

このまま、メカを開発したり分解したりのバトルが繰り広げられそうな気がしますが、
それはそれで面白いかもしれない。

この漫画の性質上、悲惨な結末を迎えたりする、というような心配は無用なので
純粋に、懸念も無く 展開を楽しめると思う!


●めだかボックス
ページをめくったら、
名瀬さんが一人バックドロップを決めてました。

地面に立っていた状態から、どんな落ち方をすれば頭から落下するのだろうか?
あと、あの状態から普通に会話続けられても困りますね。
(いろんな意味で)

もし自分が バックドロップ状態で話しかけられたら、多分 フリーズします。

【参考画像】
一人バックドロップ


●ハンターハンター
ネテロ会長の最後の最後の切り札は核爆弾でした。
そういえば戦ってた場所が"核の実験場"だとか何とか言ってたような。

しかし、心臓が停止すると作動するって事は、
ネテロ会長が普通に寿命を迎えられたら酷いことになるんじゃなかろうか。
病院周辺が吹き飛びますよ。

まぁ、そんなこんなで王を巻き込み大爆発。
百式観音『零』での王のダメージを見る限り、かなりダメージを受けているのではなかろうか。

あと、「和解とかあるのかな?」と思いましたが 普通にありえなさそうですね。
王の安否は不明ですが、瀕死or死 で確定だと思いますし、
残りのハンター VS 蟻 という展開になるのかも。
<続きは明日!>

テーマ : 週刊少年ジャンプ全般 - ジャンル : アニメ・コミック



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