Created
July 4, 2018 20:24
-
-
Save alexsr/034bb802ae43a1adb0863b735fda0ab9 to your computer and use it in GitHub Desktop.
OpenGL internal texture format conversion
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
enum class format : GLenum { | |
r = GL_RED, | |
g = GL_GREEN, | |
b = GL_BLUE, | |
rg = GL_RG, | |
rgb = GL_RGB, | |
bgr = GL_BGR, | |
rgba = GL_RGBA, | |
bgra = GL_BGRA, | |
r_int = GL_RED_INTEGER, | |
g_int = GL_GREEN_INTEGER, | |
b_int = GL_BLUE_INTEGER, | |
rg_int = GL_RG_INTEGER, | |
rgb_int = GL_RGB_INTEGER, | |
bgr_int = GL_BGR_INTEGER, | |
rgba_int = GL_RGBA_INTEGER, | |
bgra_int = GL_BGRA_INTEGER, | |
depth = GL_DEPTH_COMPONENT, | |
stencil = GL_STENCIL_INDEX, | |
depth_stencil = GL_DEPTH_STENCIL | |
}; | |
enum class type : GLenum { | |
ubyte = GL_UNSIGNED_BYTE, | |
byte = GL_BYTE, | |
ushort = GL_UNSIGNED_SHORT, | |
s = GL_SHORT, | |
uint = GL_UNSIGNED_INT, | |
i = GL_INT, | |
half_f = GL_HALF_FLOAT, | |
f = GL_FLOAT, | |
ubyte_3_3_2 = GL_UNSIGNED_BYTE_3_3_2, | |
ubyte_2_3_3_r = GL_UNSIGNED_BYTE_2_3_3_REV, | |
ushort_5_6_5 = GL_UNSIGNED_SHORT_5_6_5, | |
ushort_5_6_5_r = GL_UNSIGNED_SHORT_5_6_5_REV, | |
ushort_4_4_4_4 = GL_UNSIGNED_SHORT_4_4_4_4, | |
ushort_4_4_4_4_r = GL_UNSIGNED_SHORT_4_4_4_4_REV, | |
ushort_5_5_5_1 = GL_UNSIGNED_SHORT_5_5_5_1, | |
ushort_1_5_5_5_r = GL_UNSIGNED_SHORT_1_5_5_5_REV, | |
uint_8_8_8_8 = GL_UNSIGNED_INT_8_8_8_8, | |
uint_8_8_8_8_r = GL_UNSIGNED_INT_8_8_8_8_REV, | |
uint_10_10_10_2 = GL_UNSIGNED_INT_10_10_10_2, | |
uint_2_10_10_10_r = GL_UNSIGNED_INT_2_10_10_10_REV, | |
uint_24_8 = GL_UNSIGNED_INT_24_8, | |
uint_10f_11f_11f_r = GL_UNSIGNED_INT_10F_11F_11F_REV, | |
uint_5_9_9_9_r = GL_UNSIGNED_INT_5_9_9_9_REV, | |
f32_uint_24_8_r = GL_FLOAT_32_UNSIGNED_INT_24_8_REV | |
}; | |
enum class intern { | |
r8 = GL_R8, | |
r8_n = GL_R8_SNORM, | |
r16 = GL_R16, | |
r16_n = GL_R16_SNORM, | |
r8i = GL_R8I, | |
r8ui = GL_R8UI, | |
r16i = GL_R16I, | |
r16ui = GL_R16UI, | |
r32i = GL_R32I, | |
r32ui = GL_R32UI, | |
r16f = GL_R16F, | |
r32f = GL_R32F, | |
rg8 = GL_RG8, | |
rg8_n = GL_RG8_SNORM, | |
rg16 = GL_RG16, | |
rg16_n = GL_RG16_SNORM, | |
rg8i = GL_RG8I, | |
rg8ui = GL_RG8UI, | |
rg16i = GL_RG16I, | |
rg16ui = GL_RG16UI, | |
rg32i = GL_RG32I, | |
rg32ui = GL_RG32UI, | |
rg16f = GL_RG16F, | |
rg32f = GL_RG32F, | |
r3_g3_b2 = GL_R3_G3_B2, | |
rgb4 = GL_RGB4, | |
rgb5 = GL_RGB5, | |
rgb565 = GL_RGB565, | |
rgb8 = GL_RGB8, | |
rgb8_n = GL_RGB8_SNORM, | |
rgb10 = GL_RGB10, | |
rgb12 = GL_RGB12, | |
rgb16 = GL_RGB16, | |
rgb16_n = GL_RGB16_SNORM, | |
srgb8 = GL_SRGB8, | |
r11f_g11f_b10f = GL_R11F_G11F_B10F, | |
rgb9_e5 = GL_RGB9_E5, | |
rgb8i = GL_RGB8I, | |
rgb8ui = GL_RGB8UI, | |
rgb16i = GL_RGB16I, | |
rgb16ui = GL_RGB16UI, | |
rgb32i = GL_RGB32I, | |
rgb32ui = GL_RGB32UI, | |
rgb16f = GL_RGB16F, | |
rgb32f = GL_RGB32F, | |
rgba2 = GL_RGBA2, | |
rgba4 = GL_RGBA4, | |
rgb5_a1 = GL_RGB5_A1, | |
rgba8 = GL_RGBA8, | |
rgba8_n = GL_RGBA8_SNORM, | |
rgb10_a2 = GL_RGB10_A2, | |
rgb10_a2ui = GL_RGB10_A2UI, | |
rgba12 = GL_RGBA12, | |
rgba16 = GL_RGBA16, | |
rgba16_n = GL_RGBA16_SNORM, | |
srgb8_a8 = GL_SRGB8_ALPHA8, | |
rgba8i = GL_RGBA8I, | |
rgba8ui = GL_RGBA8UI, | |
rgba16i = GL_RGBA16I, | |
rgba16ui = GL_RGBA16UI, | |
rgba32i = GL_RGBA32I, | |
rgba32ui = GL_RGBA32UI, | |
rgba16f = GL_RGBA16F, | |
rgba32f = GL_RGBA32F, | |
depth16 = GL_DEPTH_COMPONENT16, | |
depth24 = GL_DEPTH_COMPONENT24, | |
depth32 = GL_DEPTH_COMPONENT32, | |
depth32f = GL_DEPTH_COMPONENT32F, | |
stencil1 = GL_STENCIL_INDEX1, | |
stencil4 = GL_STENCIL_INDEX4, | |
stencil8 = GL_STENCIL_INDEX8, | |
stencil16 = GL_STENCIL_INDEX16, | |
depth24_stencil8 = GL_DEPTH24_STENCIL8, | |
depth32f_stencil8 = GL_DEPTH32F_STENCIL8 | |
}; | |
constexpr format to_format(const intern internal_format) { | |
switch (internal_format) { | |
case intern::r8: | |
case intern::r8_n: | |
case intern::r16: | |
case intern::r16_n: | |
case intern::r16f: | |
case intern::r32f: | |
return format::r; | |
case intern::r8i: | |
case intern::r8ui: | |
case intern::r16i: | |
case intern::r16ui: | |
case intern::r32i: | |
case intern::r32ui: | |
return format::r_int; | |
case intern::rg8: | |
case intern::rg8_n: | |
case intern::rg16: | |
case intern::rg16_n: | |
case intern::rg16f: | |
case intern::rg32f: | |
return format::rg; | |
case intern::rg8i: | |
case intern::rg8ui: | |
case intern::rg16i: | |
case intern::rg16ui: | |
case intern::rg32i: | |
case intern::rg32ui: | |
return format::rg_int; | |
case intern::r3_g3_b2: | |
case intern::rgb4: | |
case intern::rgb5: | |
case intern::rgb565: | |
case intern::rgb8: | |
case intern::rgb8_n: | |
case intern::rgb10: | |
case intern::rgb12: | |
case intern::rgb16: | |
case intern::rgb16_n: | |
case intern::srgb8: | |
case intern::r11f_g11f_b10f: | |
case intern::rgb9_e5: | |
case intern::rgb16f: | |
case intern::rgb32f: | |
return format::rgb; | |
case intern::rgb8i: | |
case intern::rgb8ui: | |
case intern::rgb16i: | |
case intern::rgb16ui: | |
case intern::rgb32i: | |
case intern::rgb32ui: | |
return format::rgb_int; | |
case intern::rgba2: | |
case intern::rgba4: | |
case intern::rgb5_a1: | |
case intern::rgba8: | |
case intern::rgba8_n: | |
case intern::rgb10_a2: | |
case intern::rgba12: | |
case intern::rgba16: | |
case intern::rgba16_n: | |
case intern::srgb8_a8: | |
case intern::rgba16f: | |
case intern::rgba32f: | |
return format::rgba; | |
case intern::rgb10_a2ui: | |
case intern::rgba8i: | |
case intern::rgba8ui: | |
case intern::rgba16i: | |
case intern::rgba16ui: | |
case intern::rgba32i: | |
case intern::rgba32ui: | |
return format::rgba_int; | |
case intern::depth16: | |
case intern::depth24: | |
case intern::depth32: | |
case intern::depth32f: | |
return format::depth; | |
case intern::stencil1: | |
case intern::stencil4: | |
case intern::stencil8: | |
case intern::stencil16: | |
return format::stencil; | |
case intern::depth24_stencil8: | |
case intern::depth32f_stencil8: | |
return format::depth_stencil; | |
default: | |
return format::rgba; | |
} | |
} | |
constexpr type to_type(const intern internal_format) { | |
switch (internal_format) { | |
case intern::r8: | |
case intern::r8ui: | |
case intern::rg8: | |
case intern::rg8ui: | |
case intern::rgb8: | |
case intern::rgb8ui: | |
case intern::rgba8: | |
case intern::rgba8ui: | |
case intern::srgb8: | |
case intern::srgb8_a8: | |
case intern::stencil8: | |
return type::ubyte; | |
case intern::r8i: | |
case intern::r8_n: | |
case intern::rg8i: | |
case intern::rg8_n: | |
case intern::rgb8i: | |
case intern::rgb8_n: | |
case intern::rgba8i: | |
case intern::rgba8_n: | |
return type::byte; | |
case intern::r16: | |
case intern::r16ui: | |
case intern::rg16: | |
case intern::rg16ui: | |
case intern::rgb16: | |
case intern::rgb16ui: | |
case intern::rgba16: | |
case intern::rgba16ui: | |
case intern::depth16: | |
case intern::stencil16: | |
return type::ushort; | |
case intern::r16i: | |
case intern::r16_n: | |
case intern::rg16i: | |
case intern::rg16_n: | |
case intern::rgb16i: | |
case intern::rgb16_n: | |
case intern::rgba16i: | |
case intern::rgba16_n: | |
return type::s; | |
case intern::r32ui: | |
case intern::rg32ui: | |
case intern::rgb32ui: | |
case intern::rgba32ui: | |
case intern::depth32: | |
return type::uint; | |
case intern::r32i: | |
case intern::rg32i: | |
case intern::rgb32i: | |
case intern::rgba32i: | |
return type::i; | |
case intern::r16f: | |
case intern::rg16f: | |
case intern::rgb16f: | |
case intern::rgba16f: | |
return type::half_f; | |
case intern::r32f: | |
case intern::rg32f: | |
case intern::rgb32f: | |
case intern::rgba32f: | |
case intern::depth32f: | |
return type::f; | |
case intern::r11f_g11f_b10f: | |
return type::uint_10f_11f_11f_r; | |
case intern::r3_g3_b2: | |
return type::ubyte_2_3_3_r; | |
case intern::rgba4: | |
return type::ushort_4_4_4_4_r; | |
case intern::rgb565: | |
return type::ushort_5_6_5_r; | |
case intern::rgb9_e5: | |
return type::uint_5_9_9_9_r; | |
case intern::rgb5_a1: | |
return type::ushort_1_5_5_5_r; | |
case intern::rgb10_a2: | |
case intern::rgb10_a2ui: | |
return type::uint_2_10_10_10_r; | |
case intern::depth24_stencil8: | |
return type::uint_24_8; | |
case intern::depth32f_stencil8: | |
return type::f32_uint_24_8_r; | |
case intern::depth24: | |
case intern::stencil1: | |
case intern::stencil4: | |
case intern::rgb4: | |
case intern::rgb5: | |
case intern::rgb10: | |
case intern::rgb12: | |
case intern::rgba2: | |
case intern::rgba12: | |
throw std::exception{"These types cannot be deduced."}; | |
default: | |
return type::f; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment