Merge pull request #116852 from Chaosus/rendering_fix_texture_array
Fix repeating last valid texture in samplers array
This commit is contained in:
commit
d7ed107cd8
4 changed files with 204 additions and 176 deletions
|
|
@ -832,7 +832,6 @@ MaterialData::~MaterialData() {
|
|||
}
|
||||
|
||||
void MaterialData::update_textures(const HashMap<StringName, Variant> &p_parameters, const HashMap<StringName, HashMap<int, RID>> &p_default_textures, const Vector<ShaderCompiler::GeneratedCode::Texture> &p_texture_uniforms, RID *p_textures, bool p_is_3d_shader_type) {
|
||||
TextureStorage *texture_storage = TextureStorage::get_singleton();
|
||||
MaterialStorage *material_storage = MaterialStorage::get_singleton();
|
||||
|
||||
#ifdef TOOLS_ENABLED
|
||||
|
|
@ -926,91 +925,9 @@ void MaterialData::update_textures(const HashMap<StringName, Variant> &p_paramet
|
|||
}
|
||||
}
|
||||
|
||||
RID gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_WHITE);
|
||||
|
||||
if (textures.is_empty()) {
|
||||
//check default usage
|
||||
switch (p_texture_uniforms[i].type) {
|
||||
case ShaderLanguage::TYPE_ISAMPLER2D:
|
||||
case ShaderLanguage::TYPE_USAMPLER2D:
|
||||
case ShaderLanguage::TYPE_SAMPLER2D: {
|
||||
switch (p_texture_uniforms[i].hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_BLACK);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_TRANSPARENT);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_ANISOTROPY: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_ANISO);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_NORMAL: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_NORMAL);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_ROUGHNESS_NORMAL: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_NORMAL);
|
||||
} break;
|
||||
default: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_WHITE);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
|
||||
case ShaderLanguage::TYPE_SAMPLERCUBE: {
|
||||
switch (p_texture_uniforms[i].hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_CUBEMAP_BLACK);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_CUBEMAP_TRANSPARENT);
|
||||
} break;
|
||||
default: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_CUBEMAP_WHITE);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
case ShaderLanguage::TYPE_SAMPLERCUBEARRAY: {
|
||||
ERR_PRINT_ONCE("Type: SamplerCubeArray is not supported in the Compatibility renderer, please use another type.");
|
||||
} break;
|
||||
case ShaderLanguage::TYPE_SAMPLEREXT: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_EXT);
|
||||
} break;
|
||||
|
||||
case ShaderLanguage::TYPE_ISAMPLER3D:
|
||||
case ShaderLanguage::TYPE_USAMPLER3D:
|
||||
case ShaderLanguage::TYPE_SAMPLER3D: {
|
||||
switch (p_texture_uniforms[i].hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_3D_BLACK);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_3D_TRANSPARENT);
|
||||
} break;
|
||||
default: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_3D_WHITE);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
|
||||
case ShaderLanguage::TYPE_ISAMPLER2DARRAY:
|
||||
case ShaderLanguage::TYPE_USAMPLER2DARRAY:
|
||||
case ShaderLanguage::TYPE_SAMPLER2DARRAY: {
|
||||
switch (p_texture_uniforms[i].hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_2D_ARRAY_BLACK);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_2D_ARRAY_TRANSPARENT);
|
||||
} break;
|
||||
default: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_2D_ARRAY_WHITE);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
|
||||
default: {
|
||||
}
|
||||
}
|
||||
RID gl_texture = get_default_texture_id(p_texture_uniforms[i].type, p_texture_uniforms[i].hint);
|
||||
#ifdef TOOLS_ENABLED
|
||||
if (roughness_detect_texture && normal_detect_texture && !normal_detect_texture->path.is_empty()) {
|
||||
roughness_detect_texture->detect_roughness_callback(roughness_detect_texture->detect_roughness_callback_ud, normal_detect_texture->path, roughness_channel);
|
||||
|
|
@ -1024,8 +941,11 @@ void MaterialData::update_textures(const HashMap<StringName, Variant> &p_paramet
|
|||
p_textures[k++] = gl_texture;
|
||||
}
|
||||
} else {
|
||||
RID gl_default;
|
||||
|
||||
for (int j = 0; j < textures.size(); j++) {
|
||||
Texture *tex = TextureStorage::get_singleton()->get_texture(textures[j]);
|
||||
RID gl_texture;
|
||||
|
||||
if (tex) {
|
||||
gl_texture = textures[j];
|
||||
|
|
@ -1051,6 +971,12 @@ void MaterialData::update_textures(const HashMap<StringName, Variant> &p_paramet
|
|||
roughness_detect_texture->detect_roughness_callback(roughness_detect_texture->detect_roughness_callback_ud, normal_detect_texture->path, roughness_channel);
|
||||
}
|
||||
#endif
|
||||
if (gl_texture.is_null()) {
|
||||
if (gl_default.is_null()) {
|
||||
gl_default = get_default_texture_id(p_texture_uniforms[i].type, p_texture_uniforms[i].hint);
|
||||
}
|
||||
gl_texture = gl_default;
|
||||
}
|
||||
p_textures[k++] = gl_texture;
|
||||
}
|
||||
}
|
||||
|
|
@ -1085,6 +1011,95 @@ void MaterialData::update_textures(const HashMap<StringName, Variant> &p_paramet
|
|||
}
|
||||
}
|
||||
|
||||
RID MaterialData::get_default_texture_id(ShaderLanguage::DataType p_type, ShaderLanguage::ShaderNode::Uniform::Hint p_hint) {
|
||||
TextureStorage *texture_storage = TextureStorage::get_singleton();
|
||||
RID gl_texture;
|
||||
|
||||
switch (p_type) {
|
||||
case ShaderLanguage::TYPE_ISAMPLER2D:
|
||||
case ShaderLanguage::TYPE_USAMPLER2D:
|
||||
case ShaderLanguage::TYPE_SAMPLER2D: {
|
||||
switch (p_hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_BLACK);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_TRANSPARENT);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_ANISOTROPY: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_ANISO);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_NORMAL: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_NORMAL);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_ROUGHNESS_NORMAL: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_NORMAL);
|
||||
} break;
|
||||
default: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_WHITE);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
|
||||
case ShaderLanguage::TYPE_SAMPLERCUBE: {
|
||||
switch (p_hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_CUBEMAP_BLACK);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_CUBEMAP_TRANSPARENT);
|
||||
} break;
|
||||
default: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_CUBEMAP_WHITE);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
case ShaderLanguage::TYPE_SAMPLERCUBEARRAY: {
|
||||
ERR_PRINT_ONCE("Type: SamplerCubeArray is not supported in the Compatibility renderer, please use another type.");
|
||||
} break;
|
||||
case ShaderLanguage::TYPE_SAMPLEREXT: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_EXT);
|
||||
} break;
|
||||
|
||||
case ShaderLanguage::TYPE_ISAMPLER3D:
|
||||
case ShaderLanguage::TYPE_USAMPLER3D:
|
||||
case ShaderLanguage::TYPE_SAMPLER3D: {
|
||||
switch (p_hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_3D_BLACK);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_3D_TRANSPARENT);
|
||||
} break;
|
||||
default: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_3D_WHITE);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
|
||||
case ShaderLanguage::TYPE_ISAMPLER2DARRAY:
|
||||
case ShaderLanguage::TYPE_USAMPLER2DARRAY:
|
||||
case ShaderLanguage::TYPE_SAMPLER2DARRAY: {
|
||||
switch (p_hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_2D_ARRAY_BLACK);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_2D_ARRAY_TRANSPARENT);
|
||||
} break;
|
||||
default: {
|
||||
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_2D_ARRAY_WHITE);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
|
||||
default: {
|
||||
}
|
||||
}
|
||||
|
||||
return gl_texture;
|
||||
}
|
||||
|
||||
void MaterialData::update_parameters_internal(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty, const HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> &p_uniforms, const uint32_t *p_uniform_offsets, const Vector<ShaderCompiler::GeneratedCode::Texture> &p_texture_uniforms, const HashMap<StringName, HashMap<int, RID>> &p_default_texture_params, uint32_t p_ubo_size, bool p_is_3d_shader_type) {
|
||||
if ((uint32_t)ubo_data.size() != p_ubo_size) {
|
||||
p_uniform_dirty = true;
|
||||
|
|
|
|||
|
|
@ -87,6 +87,7 @@ struct Shader {
|
|||
struct MaterialData {
|
||||
void update_uniform_buffer(const HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> &p_uniforms, const uint32_t *p_uniform_offsets, const HashMap<StringName, Variant> &p_parameters, uint8_t *p_buffer, uint32_t p_buffer_size);
|
||||
void update_textures(const HashMap<StringName, Variant> &p_parameters, const HashMap<StringName, HashMap<int, RID>> &p_default_textures, const Vector<ShaderCompiler::GeneratedCode::Texture> &p_texture_uniforms, RID *p_textures, bool p_use_linear_color);
|
||||
RID get_default_texture_id(ShaderLanguage::DataType p_type, ShaderLanguage::ShaderNode::Uniform::Hint p_hint);
|
||||
|
||||
virtual void set_render_priority(int p_priority) = 0;
|
||||
virtual void set_next_pass(RID p_pass) = 0;
|
||||
|
|
|
|||
|
|
@ -868,7 +868,6 @@ MaterialStorage::MaterialData::~MaterialData() {
|
|||
}
|
||||
|
||||
void MaterialStorage::MaterialData::update_textures(const HashMap<StringName, Variant> &p_parameters, const HashMap<StringName, HashMap<int, RID>> &p_default_textures, const Vector<ShaderCompiler::GeneratedCode::Texture> &p_texture_uniforms, RID *p_textures, bool p_use_linear_color, bool p_3d_material) {
|
||||
TextureStorage *texture_storage = TextureStorage::get_singleton();
|
||||
MaterialStorage *material_storage = MaterialStorage::get_singleton();
|
||||
|
||||
#ifdef TOOLS_ENABLED
|
||||
|
|
@ -962,98 +961,9 @@ void MaterialStorage::MaterialData::update_textures(const HashMap<StringName, Va
|
|||
}
|
||||
}
|
||||
|
||||
RID rd_texture;
|
||||
|
||||
if (textures.is_empty()) {
|
||||
//check default usage
|
||||
switch (p_texture_uniforms[i].type) {
|
||||
case ShaderLanguage::TYPE_ISAMPLER2D:
|
||||
case ShaderLanguage::TYPE_USAMPLER2D:
|
||||
case ShaderLanguage::TYPE_SAMPLER2D: {
|
||||
switch (p_texture_uniforms[i].hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_BLACK);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_TRANSPARENT);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_ANISOTROPY: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_ANISO);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_NORMAL: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_NORMAL);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_ROUGHNESS_NORMAL: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_NORMAL);
|
||||
} break;
|
||||
default: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_WHITE);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
|
||||
case ShaderLanguage::TYPE_SAMPLERCUBE: {
|
||||
switch (p_texture_uniforms[i].hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_BLACK);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_TRANSPARENT);
|
||||
} break;
|
||||
default: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_WHITE);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
case ShaderLanguage::TYPE_SAMPLERCUBEARRAY: {
|
||||
switch (p_texture_uniforms[i].hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_WHITE: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_WHITE);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_TRANSPARENT);
|
||||
} break;
|
||||
default: { // previously this only had the black texture available. Keeping black as the default to minimize breaking anything.
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_BLACK);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
|
||||
case ShaderLanguage::TYPE_ISAMPLER3D:
|
||||
case ShaderLanguage::TYPE_USAMPLER3D:
|
||||
case ShaderLanguage::TYPE_SAMPLER3D: {
|
||||
switch (p_texture_uniforms[i].hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_3D_BLACK);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_3D_TRANSPARENT);
|
||||
} break;
|
||||
default: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
|
||||
case ShaderLanguage::TYPE_ISAMPLER2DARRAY:
|
||||
case ShaderLanguage::TYPE_USAMPLER2DARRAY:
|
||||
case ShaderLanguage::TYPE_SAMPLER2DARRAY: {
|
||||
switch (p_texture_uniforms[i].hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_BLACK);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_TRANSPARENT);
|
||||
} break;
|
||||
default: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
|
||||
default: {
|
||||
}
|
||||
}
|
||||
RID rd_texture = get_default_texture_id(p_texture_uniforms[i].type, p_texture_uniforms[i].hint);
|
||||
#ifdef TOOLS_ENABLED
|
||||
if (roughness_detect_texture && normal_detect_texture && !normal_detect_texture->path.is_empty()) {
|
||||
roughness_detect_texture->detect_roughness_callback(roughness_detect_texture->detect_roughness_callback_ud, normal_detect_texture->path, roughness_channel);
|
||||
|
|
@ -1068,9 +978,11 @@ void MaterialStorage::MaterialData::update_textures(const HashMap<StringName, Va
|
|||
}
|
||||
} else {
|
||||
bool srgb = p_use_linear_color && p_texture_uniforms[i].use_color;
|
||||
RID rd_default;
|
||||
|
||||
for (int j = 0; j < textures.size(); j++) {
|
||||
TextureStorage::Texture *tex = TextureStorage::get_singleton()->get_texture(textures[j]);
|
||||
RID rd_texture;
|
||||
|
||||
if (tex) {
|
||||
rd_texture = (srgb && tex->rd_texture_srgb.is_valid()) ? tex->rd_texture_srgb : tex->rd_texture;
|
||||
|
|
@ -1096,7 +1008,10 @@ void MaterialStorage::MaterialData::update_textures(const HashMap<StringName, Va
|
|||
}
|
||||
}
|
||||
if (rd_texture.is_null()) {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_WHITE);
|
||||
if (rd_default.is_null()) {
|
||||
rd_default = get_default_texture_id(p_texture_uniforms[i].type, p_texture_uniforms[i].hint);
|
||||
}
|
||||
rd_texture = rd_default;
|
||||
}
|
||||
#ifdef TOOLS_ENABLED
|
||||
if (roughness_detect_texture && normal_detect_texture && !normal_detect_texture->path.is_empty()) {
|
||||
|
|
@ -1137,6 +1052,102 @@ void MaterialStorage::MaterialData::update_textures(const HashMap<StringName, Va
|
|||
}
|
||||
}
|
||||
|
||||
RID MaterialStorage::MaterialData::get_default_texture_id(ShaderLanguage::DataType p_type, ShaderLanguage::ShaderNode::Uniform::Hint p_hint) {
|
||||
TextureStorage *texture_storage = TextureStorage::get_singleton();
|
||||
RID rd_texture;
|
||||
|
||||
switch (p_type) {
|
||||
case ShaderLanguage::TYPE_ISAMPLER2D:
|
||||
case ShaderLanguage::TYPE_USAMPLER2D:
|
||||
case ShaderLanguage::TYPE_SAMPLER2D: {
|
||||
switch (p_hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_BLACK);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_TRANSPARENT);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_ANISOTROPY: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_ANISO);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_NORMAL: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_NORMAL);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_ROUGHNESS_NORMAL: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_NORMAL);
|
||||
} break;
|
||||
default: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_WHITE);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
|
||||
case ShaderLanguage::TYPE_SAMPLERCUBE: {
|
||||
switch (p_hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_BLACK);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_TRANSPARENT);
|
||||
} break;
|
||||
default: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_WHITE);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
case ShaderLanguage::TYPE_SAMPLERCUBEARRAY: {
|
||||
switch (p_hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_WHITE: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_WHITE);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_TRANSPARENT);
|
||||
} break;
|
||||
default: { // previously this only had the black texture available. Keeping black as the default to minimize breaking anything.
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_BLACK);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
|
||||
case ShaderLanguage::TYPE_ISAMPLER3D:
|
||||
case ShaderLanguage::TYPE_USAMPLER3D:
|
||||
case ShaderLanguage::TYPE_SAMPLER3D: {
|
||||
switch (p_hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_3D_BLACK);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_3D_TRANSPARENT);
|
||||
} break;
|
||||
default: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
|
||||
case ShaderLanguage::TYPE_ISAMPLER2DARRAY:
|
||||
case ShaderLanguage::TYPE_USAMPLER2DARRAY:
|
||||
case ShaderLanguage::TYPE_SAMPLER2DARRAY: {
|
||||
switch (p_hint) {
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_BLACK);
|
||||
} break;
|
||||
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_TRANSPARENT);
|
||||
} break;
|
||||
default: {
|
||||
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE);
|
||||
} break;
|
||||
}
|
||||
} break;
|
||||
|
||||
default: {
|
||||
}
|
||||
}
|
||||
|
||||
return rd_texture;
|
||||
}
|
||||
|
||||
void MaterialStorage::MaterialData::free_parameters_uniform_set(RID p_uniform_set) {
|
||||
if (p_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(p_uniform_set)) {
|
||||
RD::get_singleton()->uniform_set_set_invalidation_callback(p_uniform_set, nullptr, nullptr);
|
||||
|
|
|
|||
|
|
@ -96,6 +96,7 @@ public:
|
|||
void update_uniform_buffer(const HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> &p_uniforms, const uint32_t *p_uniform_offsets, const HashMap<StringName, Variant> &p_parameters, uint8_t *p_buffer, uint32_t p_buffer_size, bool p_use_linear_color);
|
||||
void update_textures(const HashMap<StringName, Variant> &p_parameters, const HashMap<StringName, HashMap<int, RID>> &p_default_textures, const Vector<ShaderCompiler::GeneratedCode::Texture> &p_texture_uniforms, RID *p_textures, bool p_use_linear_color, bool p_3d_material);
|
||||
void set_as_used();
|
||||
RID get_default_texture_id(ShaderLanguage::DataType p_type, ShaderLanguage::ShaderNode::Uniform::Hint p_hint);
|
||||
|
||||
virtual void set_render_priority(int p_priority) = 0;
|
||||
virtual void set_next_pass(RID p_pass) = 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue