From 0fd535a9e81ed2495cc4178e67b29cf37c33763a Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 6 Sep 2013 12:07:38 +0200 Subject: [PATCH] Added a lot more texture formats Former-commit-id: b3a553ea39a174d84c5cd6fcca853ee83c1e6670 --- include/Nazara/Utility/Enums.hpp | 52 +++++-- include/Nazara/Utility/PixelFormat.inl | 188 +++++++++++++++++++++++-- src/Nazara/Renderer/OpenGL.cpp | 159 ++++++++++++++++++++- src/Nazara/Renderer/Texture.cpp | 24 ++++ 4 files changed, 394 insertions(+), 29 deletions(-) diff --git a/include/Nazara/Utility/Enums.hpp b/include/Nazara/Utility/Enums.hpp index 74fc5fa13..bed2adbf7 100644 --- a/include/Nazara/Utility/Enums.hpp +++ b/include/Nazara/Utility/Enums.hpp @@ -152,25 +152,49 @@ enum nzPixelFormat { nzPixelFormat_Undefined = -1, - nzPixelFormat_BGR8, // 3*nzUInt8 - nzPixelFormat_BGRA8, // 4*nzUInt8 + nzPixelFormat_BGR8, // 3*uint8 + nzPixelFormat_BGRA8, // 4*uint8 nzPixelFormat_DXT1, nzPixelFormat_DXT3, nzPixelFormat_DXT5, - nzPixelFormat_L8, // 1*nzUInt8 - nzPixelFormat_LA8, // 2*nzUInt8 - nzPixelFormat_RGB5A1, // 1*nzUInt16 - nzPixelFormat_RGB8, // 3*nzUInt8 - nzPixelFormat_RGB16F, - nzPixelFormat_RGB16I, // 4*nzUInt16 + nzPixelFormat_L8, // 1*uint8 + nzPixelFormat_LA8, // 2*uint8 + nzPixelFormat_R8, // 1*uint8 + nzPixelFormat_R8I, // 1*int8 + nzPixelFormat_R8UI, // 1*uint8 + nzPixelFormat_R16, // 1*uint16 + nzPixelFormat_R16F, // 1*half + nzPixelFormat_R16I, // 1*int16 + nzPixelFormat_R16UI, // 1*uint16 + nzPixelFormat_R32F, // 1*float + nzPixelFormat_R32I, // 1*uint16 + nzPixelFormat_R32UI, // 1*uint32 + nzPixelFormat_RG8, // 2*int8 + nzPixelFormat_RG8I, // 2*int8 + nzPixelFormat_RG8UI, // 2*uint8 + nzPixelFormat_RG16, // 2*uint16 + nzPixelFormat_RG16F, // 2*half + nzPixelFormat_RG16I, // 2*int16 + nzPixelFormat_RG16UI, // 2*uint16 + nzPixelFormat_RG32F, // 2*float + nzPixelFormat_RG32I, // 2*uint16 + nzPixelFormat_RG32UI, // 2*uint32 + nzPixelFormat_RGB5A1, // 3*uint5 + alpha bit + nzPixelFormat_RGB8, // 3*uint8 + nzPixelFormat_RGB16F, // 3*half + nzPixelFormat_RGB16I, // 4*int16 + nzPixelFormat_RGB16UI, // 4*uint16 nzPixelFormat_RGB32F, // 3*float - nzPixelFormat_RGB32I, // 4*nzUInt32 - nzPixelFormat_RGBA4, // 1*nzUInt16 - nzPixelFormat_RGBA8, // 4*nzUInt8 - nzPixelFormat_RGBA16F, - nzPixelFormat_RGBA16I, // 4*nzUInt16 + nzPixelFormat_RGB32I, // 4*int32 + nzPixelFormat_RGB32UI, // 4*uint32 + nzPixelFormat_RGBA4, // 4*uint4 + nzPixelFormat_RGBA8, // 4*uint8 + nzPixelFormat_RGBA16F, // 4*half + nzPixelFormat_RGBA16I, // 4*int16 + nzPixelFormat_RGBA16UI, // 4*uint16 nzPixelFormat_RGBA32F, // 4*float - nzPixelFormat_RGBA32I, // 4*nzUInt32 + nzPixelFormat_RGBA32I, // 4*int32 + nzPixelFormat_RGBA32UI, // 4*uint32 nzPixelFormat_Depth16, nzPixelFormat_Depth24, nzPixelFormat_Depth24Stencil8, diff --git a/include/Nazara/Utility/PixelFormat.inl b/include/Nazara/Utility/PixelFormat.inl index 2eb07c2c7..7c7eba451 100644 --- a/include/Nazara/Utility/PixelFormat.inl +++ b/include/Nazara/Utility/PixelFormat.inl @@ -189,28 +189,56 @@ inline nzUInt8 NzPixelFormat::GetBitsPerPixel(nzPixelFormat format) case nzPixelFormat_LA8: return 16; - case nzPixelFormat_RGB16F: - return 48; + case nzPixelFormat_R8: + case nzPixelFormat_R8I: + case nzPixelFormat_R8UI: + return 8; + case nzPixelFormat_R16: + case nzPixelFormat_R16F: + case nzPixelFormat_R16I: + case nzPixelFormat_R16UI: + return 16; + + case nzPixelFormat_R32F: + case nzPixelFormat_R32I: + case nzPixelFormat_R32UI: + return 32; + + case nzPixelFormat_RG8: + case nzPixelFormat_RG8I: + case nzPixelFormat_RG8UI: + return 16; + + case nzPixelFormat_RG16: + case nzPixelFormat_RG16F: + case nzPixelFormat_RG16I: + case nzPixelFormat_RG16UI: + return 32; + + case nzPixelFormat_RG32F: + case nzPixelFormat_RG32I: + case nzPixelFormat_RG32UI: + return 64; + + case nzPixelFormat_RGB16F: case nzPixelFormat_RGB16I: + case nzPixelFormat_RGB16UI: return 48; case nzPixelFormat_RGB32F: - return 96; - case nzPixelFormat_RGB32I: + case nzPixelFormat_RGB32UI: return 96; case nzPixelFormat_RGBA16F: - return 64; - case nzPixelFormat_RGBA16I: + case nzPixelFormat_RGBA16UI: return 64; case nzPixelFormat_RGBA32F: - return 128; - case nzPixelFormat_RGBA32I: + case nzPixelFormat_RGBA32UI: return 128; case nzPixelFormat_RGBA4: @@ -280,18 +308,42 @@ inline nzPixelFormatType NzPixelFormat::GetType(nzPixelFormat format) case nzPixelFormat_DXT5: case nzPixelFormat_L8: case nzPixelFormat_LA8: + case nzPixelFormat_R8: + case nzPixelFormat_R8I: + case nzPixelFormat_R8UI: + case nzPixelFormat_R16: + case nzPixelFormat_R16F: + case nzPixelFormat_R16I: + case nzPixelFormat_R16UI: + case nzPixelFormat_R32F: + case nzPixelFormat_R32I: + case nzPixelFormat_R32UI: + case nzPixelFormat_RG8: + case nzPixelFormat_RG8I: + case nzPixelFormat_RG8UI: + case nzPixelFormat_RG16: + case nzPixelFormat_RG16F: + case nzPixelFormat_RG16I: + case nzPixelFormat_RG16UI: + case nzPixelFormat_RG32F: + case nzPixelFormat_RG32I: + case nzPixelFormat_RG32UI: case nzPixelFormat_RGB5A1: case nzPixelFormat_RGB8: case nzPixelFormat_RGB16F: case nzPixelFormat_RGB16I: + case nzPixelFormat_RGB16UI: case nzPixelFormat_RGB32F: case nzPixelFormat_RGB32I: + case nzPixelFormat_RGB32UI: case nzPixelFormat_RGBA4: case nzPixelFormat_RGBA8: case nzPixelFormat_RGBA16F: case nzPixelFormat_RGBA16I: + case nzPixelFormat_RGBA16UI: case nzPixelFormat_RGBA32F: case nzPixelFormat_RGBA32I: + case nzPixelFormat_RGBA32UI: return nzPixelFormatType_Color; case nzPixelFormat_Depth16: @@ -327,8 +379,10 @@ inline bool NzPixelFormat::HasAlpha(nzPixelFormat format) case nzPixelFormat_RGB5A1: case nzPixelFormat_RGBA16F: case nzPixelFormat_RGBA16I: + case nzPixelFormat_RGBA16UI: case nzPixelFormat_RGBA32F: case nzPixelFormat_RGBA32I: + case nzPixelFormat_RGBA32UI: case nzPixelFormat_RGBA4: case nzPixelFormat_RGBA8: return true; @@ -336,11 +390,33 @@ inline bool NzPixelFormat::HasAlpha(nzPixelFormat format) case nzPixelFormat_BGR8: case nzPixelFormat_DXT1: case nzPixelFormat_L8: + case nzPixelFormat_R8: + case nzPixelFormat_R8I: + case nzPixelFormat_R8UI: + case nzPixelFormat_R16: + case nzPixelFormat_R16F: + case nzPixelFormat_R16I: + case nzPixelFormat_R16UI: + case nzPixelFormat_R32F: + case nzPixelFormat_R32I: + case nzPixelFormat_R32UI: + case nzPixelFormat_RG8: + case nzPixelFormat_RG8I: + case nzPixelFormat_RG8UI: + case nzPixelFormat_RG16: + case nzPixelFormat_RG16F: + case nzPixelFormat_RG16I: + case nzPixelFormat_RG16UI: + case nzPixelFormat_RG32F: + case nzPixelFormat_RG32I: + case nzPixelFormat_RG32UI: case nzPixelFormat_RGB8: case nzPixelFormat_RGB16F: case nzPixelFormat_RGB16I: + case nzPixelFormat_RGB16UI: case nzPixelFormat_RGB32F: case nzPixelFormat_RGB32I: + case nzPixelFormat_RGB32UI: case nzPixelFormat_Depth16: case nzPixelFormat_Depth24: case nzPixelFormat_Depth24Stencil8: @@ -372,18 +448,42 @@ inline bool NzPixelFormat::IsCompressed(nzPixelFormat format) case nzPixelFormat_BGRA8: case nzPixelFormat_L8: case nzPixelFormat_LA8: + case nzPixelFormat_R8: + case nzPixelFormat_R8I: + case nzPixelFormat_R8UI: + case nzPixelFormat_R16: + case nzPixelFormat_R16F: + case nzPixelFormat_R16I: + case nzPixelFormat_R16UI: + case nzPixelFormat_R32F: + case nzPixelFormat_R32I: + case nzPixelFormat_R32UI: + case nzPixelFormat_RG8: + case nzPixelFormat_RG8I: + case nzPixelFormat_RG8UI: + case nzPixelFormat_RG16: + case nzPixelFormat_RG16F: + case nzPixelFormat_RG16I: + case nzPixelFormat_RG16UI: + case nzPixelFormat_RG32F: + case nzPixelFormat_RG32I: + case nzPixelFormat_RG32UI: case nzPixelFormat_RGB5A1: case nzPixelFormat_RGB8: case nzPixelFormat_RGB16F: case nzPixelFormat_RGB16I: + case nzPixelFormat_RGB16UI: case nzPixelFormat_RGB32F: case nzPixelFormat_RGB32I: + case nzPixelFormat_RGB32UI: case nzPixelFormat_RGBA4: case nzPixelFormat_RGBA8: case nzPixelFormat_RGBA16F: case nzPixelFormat_RGBA16I: + case nzPixelFormat_RGBA16UI: case nzPixelFormat_RGBA32F: case nzPixelFormat_RGBA32I: + case nzPixelFormat_RGBA32UI: case nzPixelFormat_Depth16: case nzPixelFormat_Depth24: case nzPixelFormat_Depth24Stencil8: @@ -450,6 +550,66 @@ inline NzString NzPixelFormat::ToString(nzPixelFormat format) case nzPixelFormat_LA8: return "LA8"; + case nzPixelFormat_R8: + return "R8"; + + case nzPixelFormat_R8I: + return "R8I"; + + case nzPixelFormat_R8UI: + return "R8UI"; + + case nzPixelFormat_R16: + return "R16"; + + case nzPixelFormat_R16F: + return "R16F"; + + case nzPixelFormat_R16I: + return "R16I"; + + case nzPixelFormat_R16UI: + return "R16UI"; + + case nzPixelFormat_R32F: + return "R32F"; + + case nzPixelFormat_R32I: + return "R32I"; + + case nzPixelFormat_R32UI: + return "R32UI"; + + case nzPixelFormat_RG8: + return "RG8"; + + case nzPixelFormat_RG8I: + return "RG8I"; + + case nzPixelFormat_RG8UI: + return "RG8UI"; + + case nzPixelFormat_RG16: + return "RG16"; + + case nzPixelFormat_RG16F: + return "RG16F"; + + case nzPixelFormat_RG16I: + return "RG16I"; + + case nzPixelFormat_RG16UI: + return "RG16UI"; + + case nzPixelFormat_RG32F: + return "RG32F"; + + case nzPixelFormat_RG32I: + return "RG32I"; + + case nzPixelFormat_RG32UI: + return "RG32UI"; + case nzPixelFormat_RGB5A1: return "RGB5A1"; @@ -462,12 +622,18 @@ inline NzString NzPixelFormat::ToString(nzPixelFormat format) case nzPixelFormat_RGB16I: return "RGB16I"; + case nzPixelFormat_RGB16UI: + return "RGB16UI"; + case nzPixelFormat_RGB32F: return "RGB32F"; case nzPixelFormat_RGB32I: return "RGB32I"; + case nzPixelFormat_RGB32UI: + return "RGB32UI"; + case nzPixelFormat_RGBA4: return "RGBA4"; @@ -480,12 +646,18 @@ inline NzString NzPixelFormat::ToString(nzPixelFormat format) case nzPixelFormat_RGBA16I: return "RGBA16I"; + case nzPixelFormat_RGBA16UI: + return "RGBA16UI"; + case nzPixelFormat_RGBA32F: return "RGBA32F"; case nzPixelFormat_RGBA32I: return "RGBA32I"; + case nzPixelFormat_RGBA32UI: + return "RGBA32UI"; + case nzPixelFormat_Depth16: return "Depth16"; diff --git a/src/Nazara/Renderer/OpenGL.cpp b/src/Nazara/Renderer/OpenGL.cpp index 989328fec..55aac5b99 100644 --- a/src/Nazara/Renderer/OpenGL.cpp +++ b/src/Nazara/Renderer/OpenGL.cpp @@ -1340,6 +1340,7 @@ void NzOpenGL::SetViewport(const NzRecti& viewport) bool NzOpenGL::TranslateFormat(nzPixelFormat pixelFormat, Format* format, FormatType type) { + ///FIXME: Vérifier certains dataType switch (pixelFormat) { case nzPixelFormat_BGR8: @@ -1376,6 +1377,126 @@ bool NzOpenGL::TranslateFormat(nzPixelFormat pixelFormat, Format* format, Format case nzPixelFormat_LA8: return false; + case nzPixelFormat_R8: + format->dataFormat = GL_RED; + format->dataType = GL_UNSIGNED_BYTE; + format->internalFormat = GL_R8; + return true; + + case nzPixelFormat_R8I: + format->dataFormat = GL_RED; + format->dataType = GL_BYTE; + format->internalFormat = GL_R8I; + return true; + + case nzPixelFormat_R8UI: + format->dataFormat = GL_RED; + format->dataType = GL_UNSIGNED_BYTE; + format->internalFormat = GL_R8UI; + return true; + + case nzPixelFormat_R16: + format->dataFormat = GL_RED; + format->dataType = GL_UNSIGNED_SHORT; + format->internalFormat = GL_R16; + return true; + + case nzPixelFormat_R16F: + format->dataFormat = GL_RED; + format->dataType = GL_HALF_FLOAT; ///FIXME: Correct ? + format->internalFormat = GL_R16F; + return true; + + case nzPixelFormat_R16I: + format->dataFormat = GL_RED; + format->dataType = GL_SHORT; + format->internalFormat = GL_R16I; + return true; + + case nzPixelFormat_R16UI: + format->dataFormat = GL_RED; + format->dataType = GL_UNSIGNED_SHORT; + format->internalFormat = GL_R16UI; + return true; + + case nzPixelFormat_R32F: + format->dataFormat = GL_RED; + format->dataType = GL_FLOAT; + format->internalFormat = GL_R32F; + return true; + + case nzPixelFormat_R32I: + format->dataFormat = GL_RED; + format->dataType = GL_INT; + format->internalFormat = GL_R32I; + return true; + + case nzPixelFormat_R32UI: + format->dataFormat = GL_RED; + format->dataType = GL_UNSIGNED_INT; + format->internalFormat = GL_R32UI; + return true; + + case nzPixelFormat_RG8: + format->dataFormat = GL_RG; + format->dataType = GL_UNSIGNED_BYTE; + format->internalFormat = GL_RG8; + return true; + + case nzPixelFormat_RG8I: + format->dataFormat = GL_RG; + format->dataType = GL_BYTE; + format->internalFormat = GL_RG8I; + return true; + + case nzPixelFormat_RG8UI: + format->dataFormat = GL_RG; + format->dataType = GL_UNSIGNED_BYTE; + format->internalFormat = GL_RG8UI; + return true; + + case nzPixelFormat_RG16: + format->dataFormat = GL_RG; + format->dataType = GL_UNSIGNED_SHORT; + format->internalFormat = GL_RG16; + return true; + + case nzPixelFormat_RG16F: + format->dataFormat = GL_RG; + format->dataType = GL_HALF_FLOAT; ///FIXME: Correct ? + format->internalFormat = GL_RG16F; + return true; + + case nzPixelFormat_RG16I: + format->dataFormat = GL_RG; + format->dataType = GL_SHORT; + format->internalFormat = GL_RG16I; + return true; + + case nzPixelFormat_RG16UI: + format->dataFormat = GL_RG; + format->dataType = GL_UNSIGNED_SHORT; + format->internalFormat = GL_RG16UI; + return true; + + case nzPixelFormat_RG32F: + format->dataFormat = GL_RG; + format->dataType = GL_FLOAT; + format->internalFormat = GL_RG32F; + return true; + + case nzPixelFormat_RG32I: + format->dataFormat = GL_RG; + format->dataType = GL_INT; + format->internalFormat = GL_RG32I; + return true; + + case nzPixelFormat_RG32UI: + format->dataFormat = GL_RG; + format->dataType = GL_UNSIGNED_INT; + format->internalFormat = GL_RG32UI; + return true; + case nzPixelFormat_RGB5A1: format->dataFormat = GL_RGBA; format->dataType = GL_UNSIGNED_SHORT_5_5_5_1; @@ -1390,16 +1511,22 @@ bool NzOpenGL::TranslateFormat(nzPixelFormat pixelFormat, Format* format, Format case nzPixelFormat_RGB16F: format->dataFormat = GL_RGB; - format->dataType = GL_FLOAT; + format->dataType = GL_HALF_FLOAT; ///FIXME: Correct ? format->internalFormat = GL_RGB16F; return true; case nzPixelFormat_RGB16I: format->dataFormat = GL_RGB; - format->dataType = GL_INT; + format->dataType = GL_SHORT; format->internalFormat = GL_RGB16I; return true; + case nzPixelFormat_RGB16UI: + format->dataFormat = GL_RGB; + format->dataType = GL_UNSIGNED_SHORT; + format->internalFormat = GL_RGB16UI; + return true; + case nzPixelFormat_RGB32F: format->dataFormat = GL_RGB; format->dataType = GL_FLOAT; @@ -1412,6 +1539,12 @@ bool NzOpenGL::TranslateFormat(nzPixelFormat pixelFormat, Format* format, Format format->internalFormat = GL_RGB32I; return true; + case nzPixelFormat_RGB32UI: + format->dataFormat = GL_RGB; + format->dataType = GL_UNSIGNED_INT; + format->internalFormat = GL_RGB32UI; + return true; + case nzPixelFormat_RGBA4: format->dataFormat = GL_RGBA; format->dataType = GL_UNSIGNED_SHORT_4_4_4_4; @@ -1426,14 +1559,20 @@ bool NzOpenGL::TranslateFormat(nzPixelFormat pixelFormat, Format* format, Format case nzPixelFormat_RGBA16F: format->dataFormat = GL_RGBA; - format->dataType = GL_FLOAT; + format->dataType = GL_HALF_FLOAT; ///FIXME: Correct ? format->internalFormat = GL_RGBA16F; return true; case nzPixelFormat_RGBA16I: + format->dataFormat = GL_RGBA; + format->dataType = GL_SHORT; + format->internalFormat = GL_RGBA16I; + return true; + + case nzPixelFormat_RGBA16UI: format->dataFormat = GL_RGBA; format->dataType = GL_INT; - format->internalFormat = GL_RGBA32I; + format->internalFormat = GL_RGBA16UI; return true; case nzPixelFormat_RGBA32F: @@ -1448,21 +1587,27 @@ bool NzOpenGL::TranslateFormat(nzPixelFormat pixelFormat, Format* format, Format format->internalFormat = GL_RGB32I; return true; + case nzPixelFormat_RGBA32UI: + format->dataFormat = GL_RGB; + format->dataType = GL_UNSIGNED_INT; + format->internalFormat = GL_RGB32UI; + return true; + case nzPixelFormat_Depth16: format->dataFormat = GL_DEPTH_COMPONENT; - format->dataType = GL_UNSIGNED_BYTE; + format->dataType = GL_UNSIGNED_SHORT; format->internalFormat = GL_DEPTH_COMPONENT16; return true; case nzPixelFormat_Depth24: format->dataFormat = GL_DEPTH_COMPONENT; - format->dataType = GL_UNSIGNED_BYTE; + format->dataType = GL_UNSIGNED_INT; format->internalFormat = GL_DEPTH_COMPONENT24; return true; case nzPixelFormat_Depth24Stencil8: format->dataFormat = GL_DEPTH_STENCIL; - format->dataType = GL_UNSIGNED_BYTE; + format->dataType = GL_UNSIGNED_INT_24_8; format->internalFormat = GL_DEPTH24_STENCIL8; return true; diff --git a/src/Nazara/Renderer/Texture.cpp b/src/Nazara/Renderer/Texture.cpp index b25f71e36..adca65bf3 100644 --- a/src/Nazara/Renderer/Texture.cpp +++ b/src/Nazara/Renderer/Texture.cpp @@ -1307,14 +1307,38 @@ bool NzTexture::IsFormatSupported(nzPixelFormat format) return true; // Formats supportés depuis OpenGL 3 + case nzPixelFormat_R8: + case nzPixelFormat_R8I: + case nzPixelFormat_R8UI: + case nzPixelFormat_R16: + case nzPixelFormat_R16F: + case nzPixelFormat_R16I: + case nzPixelFormat_R16UI: + case nzPixelFormat_R32F: + case nzPixelFormat_R32I: + case nzPixelFormat_R32UI: + case nzPixelFormat_RG8: + case nzPixelFormat_RG8I: + case nzPixelFormat_RG8UI: + case nzPixelFormat_RG16: + case nzPixelFormat_RG16F: + case nzPixelFormat_RG16I: + case nzPixelFormat_RG16UI: + case nzPixelFormat_RG32F: + case nzPixelFormat_RG32I: + case nzPixelFormat_RG32UI: case nzPixelFormat_RGB16F: case nzPixelFormat_RGB16I: + case nzPixelFormat_RGB16UI: case nzPixelFormat_RGB32F: case nzPixelFormat_RGB32I: + case nzPixelFormat_RGB32UI: case nzPixelFormat_RGBA16F: case nzPixelFormat_RGBA16I: + case nzPixelFormat_RGBA16UI: case nzPixelFormat_RGBA32F: case nzPixelFormat_RGBA32I: + case nzPixelFormat_RGBA32UI: return NzOpenGL::GetVersion() >= 300; // Formats de profondeur (Supportés avec les FBOs)