始まり
こんな初歩的なことならネットに情報が載っていると思ったんですが、意外と見つからなかったので自分で補間しておきますわ。
Unreal Engineもそれなりに浸透してきたと思ったのですが、やっぱりUnityに比べると日本語の情報が少ない気がしますね。Unityも料金体制が見直されたり、Unreal Engineはちゃっかり大して使い物にならない(私怨)UDNがバカほど高くなったり、なんか色々とどうなるんでしょうね。筆者的にはコードを書ける環境であれば基本的には楽しめるので、ぶっちゃけそこまで興味ないですけど。
ワールド座標からビューポート座標に変換
float4 OutPosition = mul(float4(WorldPos, 1.0), LWCHackToFloat(ResolvedView.WorldToClip)); OutPosition.xy /= OutPosition.w; OutPosition.xy *= float2(0.5, -0.5); OutPosition.xy += 0.5; return OutPosition.xy;
見ての通り、一般的な行列計算です。
LWCHackToFloat
は、UE5からオープンワールドのような広大なフィールドに標準対応したことで扱われる数値が大きくなりました。そのあたりに関連するシェーダー側の対応箇所です。LargeWorldCoordinatesの略がLWCです。実装名からしてなんとなく分かりますよね。
0.5まわりはフルスクリーンシェーダーでよくあるアレですね。説明要らんだろ。
ちょっと解せないのがWorldToClip行列などをGPUで計算している点ですね。CPUで1回計算してCBufferで渡した方が最適化じゃないのかなぁとか思ってます。LWCが原因かと思ったんですけどMatrixTilePosition
はCPU計算だし、やっぱり無駄じゃないかなぁと思っている筆者さんです。こういうしょうもないことを考えられる程度には少しずつ知識が付いてきて我ながらちょっと嬉しい。
ワールド座標からビューポート座標に変換(その2)
軽く寄り道しましょうか。
上記の内容からConstantBufferに興味を持った方はきっとエンジンコードを覗いたことでしょう。探して見ると似たような変数がありませんでしたか。
そう、TranslatedWorldToClip
とRelativeWorldToClip
ですね。
はぁ。UEってこういうところがあるので嫌いです。機能性と汎用性で色々と面倒なのはお察ししますが、こういう変なものを増やし過ぎです。しかもUnreal Engine独自の規格だったりするので、他のゲームエンジンだと大して活かせない知見。それ故に覚える意欲に繋がりにくいんですよ。
TranslatedWorldToClip
TranslatedWorldToClip行列とWorldToClip行列の違いは原点です。
TranslatedWorldToClipはカメラ座標が原点となるように調整された行列です。用途としては一部計算箇所は精度が重要になるため、オブジェクトの位置をカメラ座標にズラして色々と処理します。その際に使用するのが本行列という訳です。
なので、TranslatedWorldToClip行列で算出したい場合は、原点(カメラ座標)をズラす必要があるのです。以下のようにね。
float4 OutPosition = mul(float4(WorldPos + LWCHackToFloat(ResolvedView.ViewTranslation), 1.0), LWCHackToFloat(ResolvedView.TranslatedWorldToClip)); OutPosition.xy /= OutPosition.w; OutPosition.xy *= float2(0.5, -0.5); OutPosition.xy += 0.5; return OutPosition.xy;
実装場所はここです。ちなみに普通にブレークポイントを置いて確認するとゼロベクトルしか見えなくて頭が???になります。そういう時はアクションに指定してコード実行を継続するにしてください。これフォーカスしているビューのカメラ座標しか値が出てこないので、VisualStudioにフォーカスしている状態だと永遠とゼロベクトルなんですよね。
Addするコストが無駄なので、基本的には使う必要のない行列です。
使う必要はないですが、WorldToClipとTranslatedWorldToClipには明確な違いがあるため、そこだけは押さえておきましょう。理解して使わないと、事故の元ですからね(何度経験したことか)。
RelativeWorldToClip
RelativeWorldToClip
は、ワールドサイズが小さければ普通に使えますが、前述のLWCが絡むとタイル座標を考慮できていないため、算出結果が不正になります。
要は使っちゃダメです。
ではこの使ったらダメな子は、なんのために存在しているのか。VisualStudioで全検索してもらえば分かると思いますが、シェーダー側で1か所だけ使用されています。
そう、先ほどのWorldToClip行列の算出箇所です。
RelativeWorldToClip
とタイル座標(MatrixTilePosition
)をうにゃうにゃーとしたものがWorldToClipだったのです。
うにゃうにゃが気になる方はここの実装を見てください。
おわり!!!
筆者別にUnreal Engineのこと好きじゃないですよ。
ツンデレとかじゃなくて、ツンです。
ツンツンしてそのまま穴開けたいくらい好き(嫌い)です。
Unityと違って全体的に公開されているので勝手に勉強できるという点においては若手としては大変助かっておりますが、それ以上に「はぁ?!」「聞いていないんですけどぉ?!」「余計な事スンナ」「また非推奨関数増えた!!」と悩まされることの方が多いので、総合的に見て嫌いです。ビルド時間長いし。
嫌い嫌い。
でも仕事で使わないといけないから最新エンジンの知見を取り込むためにもエンジン改造とは付き合い続けないといけない。。。
これからもよろしく(半ギレ)。
雑談
ここから先は年齢制限のかかっている作品を取り扱うページとなります。
表示する
2024/03/29 (金) !!!
セレオブの予約開始!!! いぇーい。
とりあえずトウリさんの特典だけ集めておきました。駿河屋だけなんかページ更新が遅かったので、後日(当日)にポチりました。
ゲーマーズのくくるさんをどうしようか悩み中です。
あれ、やばない??わかるよね。いいよね。
筆者、茉優先輩が推し2位なので、同じく研究者という立ち位置でくくるさんもアリかなぁとも思っているんですが、う~ん。悩む。。。
※現時点ではくくるさんの情報はキャラ紹介の内容しか知らねぇですわ。
我ながらに特典目当てに買うのはバカだと思うんですけど、まぁ、バカでいいんですよ。これが楽しい。
セレオブは明らかな推しキャラがいらっしゃるので全攻略頑張ります。(決意表明)
もうだめだ、みなとくんの姉妹にしか見えん。。。
あぁぁぁぁ。考えるだけで気分上がるわ。コード書こ。
結局去年の天使騒々は共通ルートで終えたんですよねぇ。
オリエさんと百里先生は興味あったんですけど、割と順当に攻略したいタイプなので、道のりが長そうで諦めました。あ、3月はオリエさんの抱き枕カバーでしたね。4月は百里先生です。えぇ。買いますとも。買います。毎月買っておりました。しっかり段ボールに入っております。抱き枕本体がねぇんですわ。
普通に休みが終わったらやる暇もなかったし。というのは言い訳で、実際には途中からコード書き始めちゃって攻略おざなりになっちゃったんですよね。
コードを書くのが趣味なのは色々と都合がいいので楽なのですが、ゲームプログラマでありながら逆に入社してからゲームを1本も遊んでいないという異端児が生まれてしまいました。結局プレイしても18禁の恋愛アドベンチャーゲームという本業に微塵も参考にならねぇジャンルで草だし。
思い出したかのように制服カラーを桜元学園にしているんですけど、Tonemapperの色差分のせいで簡単には進まないんですよね。
いつになるか分からないですが最近は生成AIまわりにも手を出し始めたので、Tonemapperを逆算したテクスチャ生成まわりをいつか作る計画です。ちょっくら制服改変したいだけで1時間も拘束されるのはきつすぎる。その時間あればコード書けるし。
う~ん、話が脈略なく飛んでカオスだけど、これこれ~♪
こういう内容を書きたくてわざわざ企業ブログを離れて個人ブログで展開を始めたのよ~。
徐々にフォーマットも定まってきて、気分が落ち込むことなく書けて楽しい!!!
好きな言語でコード書けて、好きなゲームジャンルを買えて(遊ぶ時間を確保できるかは別。。。)、色々と充実しておりますわ。
みんなもゲームプログラマ(クライアントとR&Dを彷徨う我)おすすめ!!!
エッチなゲームの話題から随分と着地点がズレたけど、まぁ、いいか。
おやすみー。
あぁ、そうだ。
ALcotの最終作『CloverMemory's』はクラウドファンディングにて制作致します。4月13日(土)から5月31日(金)の間で受け付け予定。
ALcot 筆者にとっては Clover Day's ひとつの世界がまた終わりますね。
※なおClover Day'sはエロゲ用ノートPCを売却した際にセーブデータの移植失敗したため、記憶でしか残っておりません(泣)。
とりあえずは、お疲れさまでした。
そしてありがと、とだけ。
これはまた別の機会に。