1
0
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:
Thaddeus Crews
2025-09-23 12:08:46 -05:00
13 changed files with 914 additions and 63 deletions

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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,