PackedLightAndShadowMapTexutreSizeが1024(デフォルト値)になっている状態でもLightMapTexture2Dがそれを超えたサイズになっているのは仕様でしょうか??
たとえば特定のメッシュのOverriddenLightMapResに1024といれてライトをビルドすると2048のライトマップが生まれました。
この場合、クックしてコンソール機で確認した場合にはどうなってしまうのでしょうか??
2048x2048が読まれるのか、1024x1024に落とされたものが使用されることになるのか気になります。
プロジェクト側ではたまに4096x4096になっているライトマップの存在が確認されましたので、PackedLightAndShadowMapTextureSizeが何に使われるものなのか再確認したいと思った次第です。
解像度を変更しているプログラムコードは
LightMap.cpp
void FLightMap2D::EncodeTextures( UWorld* InWorld, bool bLightingSuccessful, bool bMultithreadedEncode)
のようなのですが、PackedLightAndShadowMapTextureSizeを使用していくつかの処理をしているようなのですが、
何をしようとしているコードなのかを読み解くことができませんでした。
こちらもよろしければご教授して頂けますと助かります。
よろしくお願いいたします。
おっしゃる通りです。ご指摘された部分で、LightmapTextureのサイズを決定しております。
if (!Texture)
{
int32 NewTextureSizeX = PackedLightAndShadowMapTextureSize;
int32 NewTextureSizeY = PackedLightAndShadowMapTextureSize / 2;
// Assumes identically-sized allocations, fit into the smallest 2x1 rectangle
const int32 AllocationCountX = FMath::CeilToInt(FMath::Sqrt(FMath::DivideAndRoundUp(PendingGroup.Allocations.Num() * 2 * MaxHeight, MaxWidth)));
const int32 AllocationCountY = FMath::DivideAndRoundUp(PendingGroup.Allocations.Num(), AllocationCountX);
const int32 AllocationSizeX = AllocationCountX * MaxWidth;
const int32 AllocationSizeY = AllocationCountY * MaxHeight;
if (AllocationSizeX > NewTextureSizeX || AllocationSizeY > NewTextureSizeY)
{
NewTextureSizeX = FMath::RoundUpToPowerOfTwo(AllocationSizeX);
NewTextureSizeY = FMath::RoundUpToPowerOfTwo(AllocationSizeY);
// Force 2:1 aspect
NewTextureSizeX = FMath::Max(NewTextureSizeX, NewTextureSizeY * 2);
NewTextureSizeY = FMath::Max(NewTextureSizeY, NewTextureSizeX / 2);
}
PackedLightAndShadowMapTextureSize自身は、最後にPackされるLightmap Textureの最小解像度だと思って良いと思います。このサイズになるべく詰めていこうと試みますが、これよりも大きなライトマップサイズを持つようなオブジェクトがあった場合、より大きなテクスチャを確保するようにしております。実際に大きなサイズを取るときの条件などは上記のコードから見て取れる様にに少々複雑なのですが、もしも厳密に理解したい場合、挙動を更に確認いたします。
ご確認して頂きありがとうございます。
大変お忙しい中申し訳ないのですが、コードが何を行おうとしているのか教えていただけますと助かります。
最も疑問に思っていることは最終的にPackされて小さくなるにも関わらず、高解像度状態でEditor上で表示されるという事は、実際にゲームを行った場合には低解像度の見た目となり、Editorでの見た目と、パッケージング済みのゲームでは見た目が大きく変わることになると思うのですが、何故これを良しとしているのかという事となります。
手動で大きなライトマップ解像度を指定されたとしても、Editor上でPackedLightAndShadowMapTextureSize以内に収めてもらえればパッケージ版でのみ何かおかしいという問題が発生しないと思いましたので、、、
もしかしてなのですが、Editor上で2048x2048になっていたとしてもパッケージ版では1024x1024が4枚とかになってくれているのでしょうか???
よろしくお願いいたします。
連続で申し訳ありません、、、
「Lightmap Textureの最小解像度」ということは、PackedLightAndShadowMapTexutreSizeが1024だったとして、Editor上で2048x2048になっていた場合、パッケージ版も2048x2048が使用されているという事であっていますでしょうか??
多分誤解されている点があるのかなと思うのですが、
最終的にPackされて小さくなるにも関わらず、
各オブジェクトのライトマップがPackされる際、そのライトマップは縮小されません。もとの解像度のままパックされます。これは、例えば解像度64のライトマップ毎にテクスチャを用意した場合、もしもPackしなければ各オブジェクト毎にその小さなライトマップテクスチャを持ち、結果として大量のテクスチャを持つことになってしまいます。ですので、PackedLightAndShadowMapTextureSizeのテクスチャにひとまとめになるようにライトマップを作成しております。
なるほど。教えていただきありがとうございました。
小さいものは複数まとめられて指定された解像度のテクスチャになるのは教えていただいたとおりだったのですが、大きなものがどうなるのかが気になっていました。
プロジェクト側では何故か実機で解像度が荒くなるものがあるという報告があがっており、そのオブジェクトには大きな解像度が指定されていましたので、PackedLightAndShadowMapTexutreSizeより大きなサイズを指定されていたらどうなるのか疑問に感じていました。
オブジェクトのライトマップがパックされる際にライトマップは縮小されないということで、了解いたしました。
ありがとうございました。
PackedLightAndShadowMapTexutreSize=1024と仮定し、なにか大きなライトマップを持つオブジェクトでその解像度が2048だったとすると、そのオブジェクトのライトマップはもちろんPackedLightAndShadowMapTexutreSizeで指定したサイズには収まらないので、それを越えた2048のライトマップテクスチャを(この場合、そのオブジェクト一個のためだけの贅沢なものになりますが)作成します。
プロジェクト側で実機で解像度が荒くなるものがあるとのことですが、こちらLightMapのストリーミング及びMipが関係しているのではと疑っております。少なくとも、実際のライトマップの解像度がエディタサイズよりも実機では小さくなるということはないと認識しております。