bool RGBtoRGBA::supports(const PixelFormat& targetFormat, const PixelFormat& sourceFormat) { if (targetFormat.type() != sourceFormat.type()) return false; if (targetFormat.semantic() != PixelFormat::RGBA || sourceFormat.semantic() != PixelFormat::RGB) { return false; } return true; }
GLenum ConvertToGL( const PixelFormat& format, bool sRGB ) { switch(format.componentType()) { case PixelComponent_UInt8: { switch(format.semantic()) { case PixelSemantic_Luminance: { if(sRGB) return GL_SLUMINANCE8; else return GL_LUMINANCE8; } case PixelSemantic_LuminanceAlpha: { if(sRGB) return GL_SLUMINANCE8_ALPHA8; else return GL_LUMINANCE8_ALPHA8; } case PixelSemantic_RGB: { if(sRGB) return GL_SRGB8; else return GL_RGB8; } case PixelSemantic_RGBA: { if(sRGB) return GL_SRGB8_ALPHA8; else return GL_RGBA8; } default: ; } break; } case PixelComponent_UInt16: { if(format.semantic() == PixelSemantic_Depth) return GL_DEPTH_COMPONENT16; break; } case PixelComponent_UInt24: { if(format.semantic() == PixelSemantic_Depth) return GL_DEPTH_COMPONENT24; break; } case PixelComponent_UInt32: { if(format.semantic() == PixelSemantic_Depth) return GL_DEPTH_COMPONENT32; break; } case PixelComponent_Float16: { switch(format.semantic()) { case PixelSemantic_Luminance: { if(!GLEW_ARB_texture_float) { FatalError("GLEW_ARB_texture_float not supported"); break; } return GL_LUMINANCE16F_ARB; } case PixelSemantic_LuminanceAlpha: { if(!GLEW_ARB_texture_float) { FatalError("GLEW_ARB_texture_float not supported"); break; } return GL_LUMINANCE_ALPHA16F_ARB; } case PixelSemantic_RGB: return GL_RGB16F; case PixelSemantic_RGBA: return GL_RGBA16F; default: ; } break; } case PixelComponent_Float32: { switch(format.semantic()) { case PixelSemantic_Luminance: { if(!GLEW_ARB_texture_float) { FatalError("GLEW_ARB_texture_float not supported"); break; } return GL_LUMINANCE32F_ARB; } case PixelSemantic_LuminanceAlpha: { if(!GLEW_ARB_texture_float) { FatalError("GLEW_ARB_texture_float not supported"); break; } return GL_LUMINANCE_ALPHA32F_ARB; } case PixelSemantic_RGB: return GL_RGB32F; case PixelSemantic_RGBA: return GL_RGBA32F; default: ; } break; } default: ; } FatalError("Pixel format '%s' not supported!", format.asString().c_str()); return 0; }
std::string stringCast(PixelFormat format) { return std::string(stringCast(format.semantic())) + stringCast(format.type()); }
GLenum convertToGL(const PixelFormat& format, bool sRGB) { switch (format.type()) { case PixelFormat::UINT8: { switch (format.semantic()) { case PixelFormat::L: { if (sRGB) return GL_SLUMINANCE8; else return GL_LUMINANCE8; } case PixelFormat::LA: { if (sRGB) return GL_SLUMINANCE8_ALPHA8; else return GL_LUMINANCE8_ALPHA8; } case PixelFormat::RGB: { if (sRGB) return GL_SRGB8; else return GL_RGB8; } case PixelFormat::RGBA: { if (sRGB) return GL_SRGB8_ALPHA8; else return GL_RGBA8; } default: break; } break; } case PixelFormat::UINT16: { if (format.semantic() == PixelFormat::DEPTH) return GL_DEPTH_COMPONENT16; break; } case PixelFormat::UINT24: { if (format.semantic() == PixelFormat::DEPTH) return GL_DEPTH_COMPONENT24; break; } case PixelFormat::UINT32: { if (format.semantic() == PixelFormat::DEPTH) return GL_DEPTH_COMPONENT32; break; } case PixelFormat::FLOAT16: { switch (format.semantic()) { case PixelFormat::L: { if (!GLEW_ARB_texture_float) { logError("Half-precision floating point textures not supported; " "cannot convert pixel format"); return 0; } return GL_LUMINANCE16F_ARB; } case PixelFormat::LA: { if (!GLEW_ARB_texture_float) { logError("Half-precision floating point textures not supported; " "cannot convert pixel format"); return 0; } return GL_LUMINANCE_ALPHA16F_ARB; } case PixelFormat::RGB: return GL_RGB16F; case PixelFormat::RGBA: return GL_RGBA16F; default: break; } break; } case PixelFormat::FLOAT32: { switch (format.semantic()) { case PixelFormat::L: { if (!GLEW_ARB_texture_float) { logError("Floating point textures not supported; cannot convert pixel format"); return 0; } return GL_LUMINANCE32F_ARB; } case PixelFormat::LA: { if (!GLEW_ARB_texture_float) { logError("Floating point textures not supported; cannot convert pixel format"); return 0; } return GL_LUMINANCE_ALPHA32F_ARB; } case PixelFormat::RGB: return GL_RGB32F; case PixelFormat::RGBA: return GL_RGBA32F; default: break; } break; } default: break; } logError("No OpenGL equivalent for pixel format %s", format.asString().c_str()); return 0; }