/
redgpu
/
ezEngine
Обзор
Документация
Войти
/
redgpu
/
ezEngine
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
Code/Engine/Texture/TexConv/Implementation/OutputFormat.cpp
127 строк
4 KB
Jan Krassnigg
A couple of fixes (#1413)
22 окт 2024, 10:15
Не верифицирован
22 окт 2024, 10:15
ccc8e4f
Код
Авторство
О чём код?
#include <Texture/TexturePCH.h> #include <Foundation/Profiling/Profiling.h> #include <Texture/TexConv/TexConvProcessor.h> static ezImageFormat::Enum DetermineOutputFormatPC( ezTexConvUsage::Enum targetFormat, ezTexConvCompressionMode::Enum compressionMode, ezUInt32 uiNumChannels) { if (targetFormat == ezTexConvUsage::NormalMap || targetFormat == ezTexConvUsage::NormalMap_Inverted || targetFormat == ezTexConvUsage::BumpMap) { if (compressionMode >= ezTexConvCompressionMode::High) return ezImageFormat::BC5_UNORM; if (compressionMode >= ezTexConvCompressionMode::Medium) return ezImageFormat::R8G8_UNORM; // TODO: in the rare case that the input texture has higher precision, we could use R16G16_UNORM or R16G16_FLOAT here // R16G16_UNORM isn't supported on all platforms, so R16G16_FLOAT may be better // return ezImageFormat::R16G16_FLOAT; return ezImageFormat::R8G8_UNORM; } if (targetFormat == ezTexConvUsage::Color) { if (compressionMode >= ezTexConvCompressionMode::High && uiNumChannels < 4) return ezImageFormat::BC1_UNORM_SRGB; if (compressionMode >= ezTexConvCompressionMode::Medium) return ezImageFormat::BC7_UNORM_SRGB; return ezImageFormat::R8G8B8A8_UNORM_SRGB; } if (targetFormat == ezTexConvUsage::Linear) { switch (uiNumChannels) { case 1: if (compressionMode >= ezTexConvCompressionMode::Medium) return ezImageFormat::BC4_UNORM; return ezImageFormat::R8_UNORM; case 2: if (compressionMode >= ezTexConvCompressionMode::Medium) return ezImageFormat::BC5_UNORM; return ezImageFormat::R8G8_UNORM; case 3: if (compressionMode >= ezTexConvCompressionMode::High) return ezImageFormat::BC1_UNORM; if (compressionMode >= ezTexConvCompressionMode::Medium) return ezImageFormat::BC7_UNORM; return ezImageFormat::R8G8B8A8_UNORM; case 4: if (compressionMode >= ezTexConvCompressionMode::Medium) return ezImageFormat::BC7_UNORM; return ezImageFormat::R8G8B8A8_UNORM; default: EZ_ASSERT_NOT_IMPLEMENTED; } } if (targetFormat == ezTexConvUsage::Hdr) { switch (uiNumChannels) { case 1: if (compressionMode >= ezTexConvCompressionMode::High) return ezImageFormat::BC6H_UF16; return ezImageFormat::R16_FLOAT; case 2: return ezImageFormat::R16G16_FLOAT; case 3: if (compressionMode >= ezTexConvCompressionMode::High) return ezImageFormat::BC6H_UF16; if (compressionMode >= ezTexConvCompressionMode::Medium) return ezImageFormat::R11G11B10_FLOAT; return ezImageFormat::R16G16B16A16_FLOAT; case 4: return ezImageFormat::R16G16B16A16_FLOAT; } } return ezImageFormat::UNKNOWN; } ezResult ezTexConvProcessor::ChooseOutputFormat(ezEnum<ezImageFormat>& out_Format, ezEnum<ezTexConvUsage> usage, ezUInt32 uiNumChannels) const { EZ_PROFILE_SCOPE("ChooseOutputFormat"); EZ_ASSERT_DEV(out_Format == ezImageFormat::UNKNOWN, "Output format already set"); switch (m_Descriptor.m_TargetPlatform) { // case ezTexConvTargetPlatform::Android: // out_Format = DetermineOutputFormatAndroid(m_Descriptor.m_TargetFormat, m_Descriptor.m_CompressionMode); // break; case ezTexConvTargetPlatform::PC: out_Format = DetermineOutputFormatPC(usage, m_Descriptor.m_CompressionMode, uiNumChannels); break; default: EZ_ASSERT_NOT_IMPLEMENTED; } if (out_Format == ezImageFormat::UNKNOWN) { ezLog::Error("Failed to decide for an output image format."); return EZ_FAILURE; } return EZ_SUCCESS; }