プロフィール

Na-7

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


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
自作地形24
開発中の自作地形
テクスチャの境界線が解消された。奇数列のテクスチャは反転表示しているが、ぱっと見気付かないだろう。



◎新たな問題

前回は3つの課題をクリアしましたが、これにより新たな懸案が1つ増えました。川と道のテクスチャに境界線が生じてしまったのです。

川道の境界線の問題

この懸案は、見栄えに関するプログラムの最後の課題です。かなり厄介そうですが、何とかしましょう。



◎調査開始

境界線が生じる原因を探るために、テクスチャを差し替えてみました。

川と道を芝テクスチャに差し替え   川と道を赤テクスチャに差し替え
川と道のテクスチャを芝(左図)と赤(右図)に差し替え

上図では、いずれも境界線が存在しません。

テクスチャを差し替えただけで境界線が消えたということは、プログラムの問題ではなく、テクスチャの性質の問題と考えられます。

多分、テクスチャ画像の左端と右端、上端と下端が繋がった模様になっていないために、境界線が生じたのでしょう。



◎試行錯誤

では、テクスチャの左端と右端、上端と下端を合わせてみましょう。このようなテクスチャを用意しました。

Water512A2

このテクスチャは、画像を4分の1に分割して、配置を変えたものです。

AB → DC
CD → BA

この画像は、上下左右に敷き詰めて並べると、画像の継ぎ目が無くて綺麗に見えます。(ペイントソフトで実際に4枚並べて確認しました)
水テクスチャをこの画像に差し替えて確認します。

川道の境界線が消えない

あれ?境界線(赤矢印)が消えないぞ。おかしいな??

黄矢印の色については、テクスチャを描き変えれば直るので良いのですが、赤矢印の境界線は、テクスチャを描き変えても直りません。しかもこの境界線は、飛行モードで視点を僅かに変化させただけで、消えたり出現したりします。

XNAの誤差のレベルっぽいけど…?もしかしてテクスチャ座標の誤差とか?

試しにterrainScale=256として、テクスチャ座標を全て整数にしてみました。

terrainScale=256

ダメですね~境界線が消えません。

果たして原因はプログラム?テクスチャ?どうすれば解消できるのでしょうか?



◎原因判明

そんなこんなで2日間悩みまくってましたが、「犯罪捜査に行き詰ったら現場に戻れ」とはよく言ったものです。画面を何度も見直していると、下記の事実に気付きました。

・真っ青のパターンと真っ青のパターンの境界
 →境界線が存在しない

・真っ青のパターンと他のパターンの境界
 →境界線が存在する

結論から言うと、この現象はTextureAddressModeをWrapにしているために発生しました。

Wrapは、同じパターンを繰り返すことを想定したモードなので、左端ピクセルの色計算に、テクスチャの左端と右端の色が影響していたのです。



◎TextureAddressModeの検討

TextureAddressModeは、Wrapの他にBorder、Clamp、Mirror、MirrorOnceがあります。変更可否を検討しましょう。
(各モードの表示イメージはこちら

まず、境界線を無くしたいのでBorderは論外です。

また、Clampは、現状の頂点データ(=テクスチャ座標)共有方式では、採用不可です。共有方式をやめてテクスチャ座標を4倍増やすという選択肢もありますが、無駄にバッファを喰うと全体のパフォーマンスが低下しそうなので、極力避けたいですね。

残るはMirrorとMirrorOnceです。実際に試してみました。

TextureAddressMode=Mirror   TextureAddressMode=MirrorOnce
Mirror(左図)とMirrorOnce(右図)

Mirrorは、奇数列(または偶数列)のテクスチャを反転します。縦方向の奇数列のテクスチャを上下反転、横方向の奇数列のテクスチャを左右反転すると、本来の地形に戻ります。

MirrorOnceは、Mirrorの回数指定バージョンです。指定回数を超えた部分は、Clampと同様に表示されます。今回は回数を指定しなかったので、Clampと同様の表示になりました。回数を大きく指定すれば、Mirrorと同様の表示になります。


というわけで、単純にTextureAddressModeを変更しただけでは解決できそうにありません。



◎対処方法の検討

上記を踏まえて、私が考えた対処案を記述します。

A案
 頂点フォーマットのテクスチャ座標データを4つに増やす。

B案
 地形作成処理内のパターン判定時に、奇数列の割り当てを反転する。

C案
 カスタムエフェクトにより、テクスチャ座標の左上隅と右下隅を内側にずらして表示する。

前述したように、A案はなるべく避けたい所です。
B案は実現可能と思いますが、今後デバッグが混乱する要因になりそうで心配です。
C案は、実際にテクスチャの右下隅を指定することが可能かどうか不明です。

う~ん…C案だとBasicEffectを全て自力で再現する必要があるので、開発に時間がかかる上にメンテナンス負荷も増大します。そう考えると、消去法でB案ですね。



◎実装

というわけで、TextureAddressModeをMirrorとして、これに合うようにパターン判定を補正しました。(冒頭図参照)

ついに境界線が無くなって、綺麗に表示されましたね!!

奇数列は反転するという制約付きですが、地形テクスチャの性質上あまり問題無さそうなので、境界線の問題はこれで対処完了とします。



◎補足

下記の手法も試してみました。

「TextureAddressMode=Clampとし、テクスチャ座標を偶数列=0.0、奇数列=1.0と反転させ、これに伴いパターン判定を修正する」

画面の見た目はMirrorと同様になりました。まぁ、やってることは一緒ですからね。速度的な違いも無いようなので、とりあえずMirrorに戻しておきました。



◎残課題について

当初想像していた以上に細かく表示されたので、

・メモリ消費を抑えてカラーマップの解像度を上げる
・カラーマップ修正

上記の必要性が感じられなくなりました。課題一覧から削除します。(もし後日必要と感じたら、その時に取り組みます)

というわけで、地形の残課題は下記4点です。

・パターンテクスチャの一括修正
・地形描画負荷調査&速度向上
・地形種別の追加
・パターンテクスチャの手描き修正



◎次回予告

次回は「パターンテクスチャの一括修正」です。
これでさらに綺麗になると予想していますが、果たして??

スポンサーサイト

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

コメント

コメントの投稿


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

トラックバック


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



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