プロフィール

Na-7

Author:Na-7
SE(システムエンジニア)として約15年間システム系ソフト会社を勤めあげ、2008年3月退社。現在、ゲーム制作会社設立を目指して活動中。


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
縦横に並べた
バグ状況確認画面
先日のUVアニメサンプルがバグってたようなので、縦横に並べてUV座標の反映状況を確認した。



◎はじめに

前々回で、DrawIndexedPrimitivesのstartIndexの値がどうしても納得できませんでした。私のカンでは、これはかなり重要なポイントという気がしたので、今回は疑問が解消できるまで頂点/インデックスバッファを使用した描画をいろいろ試すつもりでした。

しかし、yohさんから頂いたコメントをきっかけに自問自答を繰り返したら、いろいろなことが分かってきました。startIndexも理解したので、今回はそれらについて説明します。



◎複製する数

先日のプログラムでは、動的頂点バッファにUVデータを格納するために、頂点データとインデックスデータを“全インスタンス数”複製しました。

しかし通常のシェーダインスタンスは“一度に描画するインスタンス数”だけ複製し、描画時はこれを何度も使いまわして、シェーダに渡すパラメータだけを変更します。

私はこの常識が頭から抜け落ちていたので、デモプログラムのstartIndexが0であることが納得できませんでした(今は納得しました)。



◎バグ?

通常は0で良いことは理解しました。しかし逆に、先日のプログラムはstartIndexをずらさないとマズイのでは?

試しに、「一度に描画するインスタンス数=10」として、縦横に並べてみました。

縦横に並べた

0、1、2…と横に並べ、11番目以降はその上に並べました。アニメのタイミングは全てランダムで設定したはずなのに、縦のタイミングがピタリ一致しています。これはつまり、最初の10個の頂点データ(UV座標)だけを使いまわして、11番目以降の頂点データ(UV座標)を無視している、ということです。

明らかに、バグってます。ガーン!



◎バグ修正

11個目以降の頂点データを読み取らせるには、やはりstartIndexをずらさないといけません。しかしstartIndexをずらすと、画像が乱れたりちらついたりします。

startIndexをずらしたら画像が乱れた

下から2行目の描画が抜け落ちた例です。

この現象が発生する原因は、頂点データ内のインスタンス番号を「通し番号」でセットしたのに、シェーダ側は“一度に描画するインスタンス数”を超えた番号をサポートしてないからです(シェーダ定数配列の上限を超えて、未使用メモリにアクセスした状態)。

手っ取り早く直したかったので、「通し番号」をやめて、“一度に描画するインスタンス数”を超える度にインスタンス番号を0から付け直しました。

また、startIndexだけずらすと画面が乱れましたが、minVertexIndexも併せてずらしたら直りました。

this.graphics.GraphicsDevice.DrawIndexedPrimitives(
  PrimitiveType.TriangleList,
  0,
  4 * (objIdx - drawInstanceCount),
  modelMeshPart.NumVertices * drawInstanceCount,
  6 * 2 * (objIdx - drawInstanceCount),
  modelMeshPart.PrimitiveCount * drawInstanceCount);


startIndex修正後

11番目以降のUV情報が正しく反映されて、全画像のアニメタイミングがバラバラになりました。


というわけで、HPにバグFIX版をUPしました。
ちなみに、パフォーマンスは以前と変わりません。
(メインPCとサブPCで確認済)



◎次回予告

今回はバグ報告となってしまいましたが、早めに修正出来て良かったです。バグに気付くきっかけを与えてくれたyohさん、どうもありがとうございました!


できればサブPCのパフォーマンスをもっと上げたいので、次回は普通のシェーダインスタンス版を作成して、パフォーマンスを比較します。

スポンサーサイト

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

コメント

コメントの投稿


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

トラックバック


この記事にトラックバックする(FC2ブログユーザー)



copyright © ゲーム制作の舞台裏 all rights reserved.Powered by FC2ブログ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。