/
redgpu
/
ezEngine
Обзор
Документация
Войти
/
redgpu
/
ezEngine
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
Code/Engine/Texture/TexConv/TexConvProcessor.h
100 строк
4 KB
Jan Krassnigg
Decals now support atlas textures for more variation (#1999)
22 июл 2026, 16:02
Не верифицирован
22 июл 2026, 16:02
12c0472
Код
Авторство
О чём код?
#pragma once #include <Foundation/IO/MemoryStream.h> #include <Foundation/Math/Rect.h> #include <Texture/TexConv/TexConvDesc.h> struct ezTextureAtlasCreationDesc; class EZ_TEXTURE_DLL ezTexConvProcessor { EZ_DISALLOW_COPY_AND_ASSIGN(ezTexConvProcessor); public: ezTexConvProcessor(); ezTexConvDesc m_Descriptor; ezResult Process(); ezImage m_OutputImage; ezImage m_LowResOutputImage; ezImage m_ThumbnailOutputImage; ezDefaultMemoryStreamStorage m_TextureAtlas; private: ////////////////////////////////////////////////////////////////////////// // Modifying the Descriptor ezResult LoadInputImages(); ezResult ForceSRGBFormats(); ezResult ConvertAndScaleInputImages(ezUInt32 uiResolutionX, ezUInt32 uiResolutionY, ezEnum<ezTexConvUsage> usage); ezResult ConvertToNormalMap(ezImage& bumpMap) const; ezResult ConvertToNormalMap(ezArrayPtr<ezImage> bumpMap) const; ezResult ClampInputValues(ezArrayPtr<ezImage> images, float maxValue) const; ezResult ClampInputValues(ezImage& image, float maxValue) const; ezResult DetectNumChannels(ezArrayPtr<const ezTexConvSliceChannelMapping> channelMapping, ezUInt32& uiNumChannels); ezResult InvertNormalMap(ezImage& img); ////////////////////////////////////////////////////////////////////////// // Reading from the descriptor enum class MipmapChannelMode { AllChannels, SingleChannel }; ezResult ChooseOutputFormat(ezEnum<ezImageFormat>& out_Format, ezEnum<ezTexConvUsage> usage, ezUInt32 uiNumChannels) const; ezResult DetermineTargetResolution( const ezImage& image, ezEnum<ezImageFormat> OutputImageFormat, ezUInt32& out_uiTargetResolutionX, ezUInt32& out_uiTargetResolutionY) const; ezResult Assemble2DTexture(const ezImageHeader& refImg, ezImage& dst) const; ezResult Assemble2DArrayTexture(ezImage& dst) const; ezResult AssembleCubemap(ezImage& dst) const; ezResult Assemble3DTexture(ezImage& dst) const; ezResult AdjustHdrExposure(ezImage& img) const; ezResult PremultiplyAlpha(ezImage& image) const; ezResult DilateColor2D(ezImage& img) const; ezResult Assemble2DSlice(const ezTexConvSliceChannelMapping& mapping, ezUInt32 uiResolutionX, ezUInt32 uiResolutionY, ezColor* pPixelOut) const; ezResult GenerateMipmaps(ezImage& img, ezUInt32 uiNumMips /* =0 */, MipmapChannelMode channelMode = MipmapChannelMode::AllChannels) const; ////////////////////////////////////////////////////////////////////////// // Purely functional static ezResult AdjustUsage(ezStringView sFilename, const ezImage& srcImg, ezEnum<ezTexConvUsage>& inout_Usage); static ezResult ConvertAndScaleImage(ezStringView sImageName, ezImage& inout_Image, ezUInt32 uiResolutionX, ezUInt32 uiResolutionY, ezEnum<ezTexConvUsage> usage); ////////////////////////////////////////////////////////////////////////// // Output Generation static ezResult GenerateOutput(ezImage&& src, ezImage& dst, ezEnum<ezImageFormat> format); static ezResult GenerateThumbnailOutput(const ezImage& srcImg, ezImage& dstImg, ezUInt32 uiTargetRes); static ezResult GenerateLowResOutput(const ezImage& srcImg, ezImage& dstImg, ezUInt32 uiLowResMip); ////////////////////////////////////////////////////////////////////////// // Texture Atlas struct TextureAtlasItem { ezUInt32 m_uiUniqueID = 0; ezUInt32 m_uiFlags = 0; ezImage m_InputImage[4]; ezRectU32 m_AtlasRect[4]; ezUInt8 m_uiNumVariationsX = 1; ezUInt8 m_uiNumVariationsY = 1; }; ezResult LoadAtlasInputs(const ezTextureAtlasCreationDesc& atlasDesc, ezDynamicArray<TextureAtlasItem>& items) const; ezResult CreateAtlasLayerTexture( const ezTextureAtlasCreationDesc& atlasDesc, ezDynamicArray<TextureAtlasItem>& atlasItems, ezInt32 layer, ezImage& dstImg); static ezResult WriteTextureAtlasInfo(const ezDynamicArray<TextureAtlasItem>& atlasItems, ezUInt32 uiNumLayers, ezStreamWriter& stream); static ezResult TrySortItemsIntoAtlas(ezDynamicArray<TextureAtlasItem>& items, ezUInt32 uiWidth, ezUInt32 uiHeight, ezInt32 layer); static ezResult SortItemsIntoAtlas(ezDynamicArray<TextureAtlasItem>& items, ezUInt32& out_ResX, ezUInt32& out_ResY, ezInt32 layer); static ezResult CreateAtlasTexture(ezDynamicArray<TextureAtlasItem>& items, ezUInt32 uiResX, ezUInt32 uiResY, ezImage& atlas, ezInt32 layer); static ezResult FillAtlasBorders(ezDynamicArray<TextureAtlasItem>& items, ezImage& atlas, ezInt32 layer); ////////////////////////////////////////////////////////////////////////// // Texture Atlas ezResult GenerateTextureAtlas(ezMemoryStreamWriter& stream); };