You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
Merge pull request #106200 from BlueCube3310/image-16-u16
Image: Implement 16-bit unorm and uint formats
This commit is contained in:
@@ -90,6 +90,7 @@ Config::Config() {
|
||||
s3tc_supported = true;
|
||||
rgtc_supported = true; //RGTC - core since OpenGL version 3.0
|
||||
srgb_framebuffer_supported = true;
|
||||
unorm16_texture_supported = true;
|
||||
} else {
|
||||
float_texture_supported = extensions.has("GL_EXT_color_buffer_float");
|
||||
float_texture_linear_supported = extensions.has("GL_OES_texture_float_linear");
|
||||
@@ -104,6 +105,7 @@ Config::Config() {
|
||||
#endif
|
||||
rgtc_supported = extensions.has("GL_EXT_texture_compression_rgtc") || extensions.has("GL_ARB_texture_compression_rgtc");
|
||||
srgb_framebuffer_supported = extensions.has("GL_EXT_sRGB_write_control");
|
||||
unorm16_texture_supported = extensions.has("GL_EXT_texture_norm16");
|
||||
}
|
||||
|
||||
glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &max_vertex_texture_image_units);
|
||||
|
||||
@@ -82,6 +82,7 @@ public:
|
||||
bool astc_layered_supported = false;
|
||||
bool astc_3d_supported = false;
|
||||
bool srgb_framebuffer_supported = false;
|
||||
bool unorm16_texture_supported = false;
|
||||
|
||||
bool force_vertex_shading = false;
|
||||
bool specular_occlusion = false;
|
||||
|
||||
@@ -505,6 +505,126 @@ static inline Error _get_gl_uncompressed_format(const Ref<Image> &p_image, Image
|
||||
r_gl_format = GL_RGB;
|
||||
r_gl_type = GL_UNSIGNED_INT_5_9_9_9_REV;
|
||||
} break;
|
||||
case Image::FORMAT_R16: {
|
||||
if (config->unorm16_texture_supported) {
|
||||
r_gl_internal_format = _EXT_R16;
|
||||
r_gl_format = GL_RED;
|
||||
r_gl_type = GL_UNSIGNED_SHORT;
|
||||
} else {
|
||||
if (config->float_texture_linear_supported) {
|
||||
if (p_image.is_valid()) {
|
||||
p_image->convert(Image::FORMAT_RF);
|
||||
}
|
||||
r_real_format = Image::FORMAT_RF;
|
||||
r_gl_internal_format = GL_R32F;
|
||||
r_gl_format = GL_RED;
|
||||
r_gl_type = GL_FLOAT;
|
||||
} else {
|
||||
if (p_image.is_valid()) {
|
||||
p_image->convert(Image::FORMAT_RH);
|
||||
}
|
||||
r_real_format = Image::FORMAT_RH;
|
||||
r_gl_internal_format = GL_R16F;
|
||||
r_gl_format = GL_RED;
|
||||
r_gl_type = GL_HALF_FLOAT;
|
||||
}
|
||||
}
|
||||
} break;
|
||||
case Image::FORMAT_RG16: {
|
||||
if (config->unorm16_texture_supported) {
|
||||
r_gl_internal_format = _EXT_RG16;
|
||||
r_gl_format = GL_RG;
|
||||
r_gl_type = GL_UNSIGNED_SHORT;
|
||||
} else {
|
||||
if (config->float_texture_linear_supported) {
|
||||
if (p_image.is_valid()) {
|
||||
p_image->convert(Image::FORMAT_RGF);
|
||||
}
|
||||
r_real_format = Image::FORMAT_RGF;
|
||||
r_gl_internal_format = GL_RG32F;
|
||||
r_gl_format = GL_RG;
|
||||
r_gl_type = GL_FLOAT;
|
||||
} else {
|
||||
if (p_image.is_valid()) {
|
||||
p_image->convert(Image::FORMAT_RGH);
|
||||
}
|
||||
r_real_format = Image::FORMAT_RGH;
|
||||
r_gl_internal_format = GL_RG16F;
|
||||
r_gl_format = GL_RG;
|
||||
r_gl_type = GL_HALF_FLOAT;
|
||||
}
|
||||
}
|
||||
} break;
|
||||
case Image::FORMAT_RGB16: {
|
||||
if (config->unorm16_texture_supported) {
|
||||
r_gl_internal_format = _EXT_RGB16;
|
||||
r_gl_format = GL_RGB;
|
||||
r_gl_type = GL_UNSIGNED_SHORT;
|
||||
} else {
|
||||
if (config->float_texture_linear_supported) {
|
||||
if (p_image.is_valid()) {
|
||||
p_image->convert(Image::FORMAT_RGBF);
|
||||
}
|
||||
r_real_format = Image::FORMAT_RGBF;
|
||||
r_gl_internal_format = GL_RGB32F;
|
||||
r_gl_format = GL_RGB;
|
||||
r_gl_type = GL_FLOAT;
|
||||
} else {
|
||||
if (p_image.is_valid()) {
|
||||
p_image->convert(Image::FORMAT_RGBH);
|
||||
}
|
||||
r_real_format = Image::FORMAT_RGBH;
|
||||
r_gl_internal_format = GL_RGB16F;
|
||||
r_gl_format = GL_RGB;
|
||||
r_gl_type = GL_HALF_FLOAT;
|
||||
}
|
||||
}
|
||||
} break;
|
||||
case Image::FORMAT_RGBA16: {
|
||||
if (config->unorm16_texture_supported) {
|
||||
r_gl_internal_format = _EXT_RGBA16;
|
||||
r_gl_format = GL_RGBA;
|
||||
r_gl_type = GL_UNSIGNED_SHORT;
|
||||
} else {
|
||||
if (config->float_texture_linear_supported) {
|
||||
if (p_image.is_valid()) {
|
||||
p_image->convert(Image::FORMAT_RGBAF);
|
||||
}
|
||||
r_real_format = Image::FORMAT_RGBAF;
|
||||
r_gl_internal_format = GL_RGBA32F;
|
||||
r_gl_format = GL_RGBA;
|
||||
r_gl_type = GL_FLOAT;
|
||||
} else {
|
||||
if (p_image.is_valid()) {
|
||||
p_image->convert(Image::FORMAT_RGH);
|
||||
}
|
||||
r_real_format = Image::FORMAT_RGH;
|
||||
r_gl_internal_format = GL_RGBA16F;
|
||||
r_gl_format = GL_RGBA;
|
||||
r_gl_type = GL_HALF_FLOAT;
|
||||
}
|
||||
}
|
||||
} break;
|
||||
case Image::FORMAT_R16I: {
|
||||
r_gl_internal_format = GL_R16UI;
|
||||
r_gl_format = GL_RED_INTEGER;
|
||||
r_gl_type = GL_UNSIGNED_SHORT;
|
||||
} break;
|
||||
case Image::FORMAT_RG16I: {
|
||||
r_gl_internal_format = GL_RG16UI;
|
||||
r_gl_format = GL_RG_INTEGER;
|
||||
r_gl_type = GL_UNSIGNED_SHORT;
|
||||
} break;
|
||||
case Image::FORMAT_RGB16I: {
|
||||
r_gl_internal_format = GL_RGB16UI;
|
||||
r_gl_format = GL_RGB_INTEGER;
|
||||
r_gl_type = GL_UNSIGNED_SHORT;
|
||||
} break;
|
||||
case Image::FORMAT_RGBA16I: {
|
||||
r_gl_internal_format = GL_RGBA16UI;
|
||||
r_gl_format = GL_RGBA_INTEGER;
|
||||
r_gl_type = GL_UNSIGNED_SHORT;
|
||||
} break;
|
||||
default: {
|
||||
return ERR_UNAVAILABLE;
|
||||
}
|
||||
|
||||
@@ -112,6 +112,11 @@ namespace GLES3 {
|
||||
|
||||
#define _EXT_TEXTURE_CUBE_MAP_SEAMLESS 0x884F
|
||||
|
||||
#define _EXT_R16 0x822A
|
||||
#define _EXT_RG16 0x822C
|
||||
#define _EXT_RGB16 0x8054
|
||||
#define _EXT_RGBA16 0x805B
|
||||
|
||||
enum DefaultGLTexture {
|
||||
DEFAULT_GL_TEXTURE_WHITE,
|
||||
DEFAULT_GL_TEXTURE_BLACK,
|
||||
|
||||
Reference in New Issue
Block a user