From 7c86b9641243ac9e1a2b33e3ec624676cdcd4324 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Tue, 25 Apr 2023 22:37:13 +0300 Subject: [PATCH] Resolve texture warnings --- src/CRE/Glitter/render_scene.cpp | 8 ++--- src/CRE/draw_object.cpp | 12 ++++---- src/CRE/post_process/tone_map.cpp | 6 ++++ src/CRE/render_context.cpp | 51 ++++++++++++++++++++++++++----- src/CRE/render_context.hpp | 3 ++ src/CRE/render_manager.cpp | 18 +++++++---- src/CRE/sprite.cpp | 16 +++++++--- src/CRE/texture.cpp | 42 ++++++++++++------------- src/CRE/texture.hpp | 3 ++ 9 files changed, 109 insertions(+), 50 deletions(-) diff --git a/src/CRE/Glitter/render_scene.cpp b/src/CRE/Glitter/render_scene.cpp index a9e41e75..bda39636 100644 --- a/src/CRE/Glitter/render_scene.cpp +++ b/src/CRE/Glitter/render_scene.cpp @@ -986,8 +986,8 @@ namespace Glitter { gl_state_set_blend_func(blend_src, blend_dst); gl_state_set_blend_equation(GL_FUNC_ADD); - GLuint texture = 0; - GLuint mask_texture = 0; + GLuint texture = rctx_ptr->empty_texture_2d; + GLuint mask_texture = rctx_ptr->empty_texture_2d; if (rend_group->type != PARTICLE_LINE && rend_group->texture) { texture = rend_group->texture; if (rend_group->mask_texture) { @@ -2179,8 +2179,8 @@ namespace Glitter { gl_state_set_blend_func(blend_src, blend_dst); gl_state_set_blend_equation(GL_FUNC_ADD); - GLuint texture = 0; - GLuint mask_texture = 0; + GLuint texture = rctx_ptr->empty_texture_2d; + GLuint mask_texture = rctx_ptr->empty_texture_2d; if (rend_group->type != PARTICLE_LINE && rend_group->texture) { texture = rend_group->texture; if (rend_group->mask_texture) { diff --git a/src/CRE/draw_object.cpp b/src/CRE/draw_object.cpp index adcc4c07..1f7076f1 100644 --- a/src/CRE/draw_object.cpp +++ b/src/CRE/draw_object.cpp @@ -14,7 +14,7 @@ static bool draw_object_blend_set(render_context* rctx, static void draw_object_chara_color_fog_set(render_context* rctx, const mdl::ObjSubMeshArgs* args, bool disable_fog); static void draw_object_material_reset_default(const obj_material_data* mat_data); -static void draw_object_material_reset_reflect(); +static void draw_object_material_reset_reflect(render_context* rctx); static void draw_object_material_set_default(render_context* rctx, const mdl::ObjSubMeshArgs* args, bool use_shader); static void draw_object_material_set_parameter(render_context* rctx, @@ -254,7 +254,7 @@ namespace mdl { sub_mesh->index_format, sub_mesh->index_offset); - draw_object_material_reset_reflect(); + draw_object_material_reset_reflect(rctx); draw_object_vertex_attrib_reset_reflect(args); uniform_value_reset(); @@ -275,7 +275,7 @@ namespace mdl { sub_mesh->index_format, sub_mesh->index_offset); - draw_object_material_reset_reflect(); + draw_object_material_reset_reflect(rctx); draw_object_vertex_attrib_reset_reflect(args); rctx->draw_state.stats.object_reflect_draw_count++; @@ -389,7 +389,7 @@ namespace mdl { sub_mesh->index_offset); if (tex_id != -1) - gl_state_active_bind_texture_2d(tex_index, 0); + gl_state_active_bind_texture_2d(tex_index, rctx->empty_texture_2d); gl_state_enable_cull_face(); draw_object_vertex_attrib_reset_default(args); @@ -534,8 +534,8 @@ static void draw_object_material_reset_default(const obj_material_data* mat_data uniform_value_reset(); } -static void draw_object_material_reset_reflect() { - gl_state_active_bind_texture_2d(0, 0); +static void draw_object_material_reset_reflect(render_context* rctx) { + gl_state_active_bind_texture_2d(0, rctx->empty_texture_2d); gl_state_enable_cull_face(); uniform_value_reset(); } diff --git a/src/CRE/post_process/tone_map.cpp b/src/CRE/post_process/tone_map.cpp index 2d6a4d41..535feefd 100644 --- a/src/CRE/post_process/tone_map.cpp +++ b/src/CRE/post_process/tone_map.cpp @@ -7,11 +7,14 @@ #include "../fbo.hpp" #include "../gl_state.hpp" #include "../post_process.hpp" +#include "../render_context.hpp" #include "../shader_ft.hpp" static void post_process_tone_map_calculate_data(post_process_tone_map* tm); static void post_process_tone_map_calculate_tex(post_process_tone_map* tm); +extern render_context* rctx_ptr; + post_process_tone_map_data::post_process_tone_map_data() : tex_data(), exposure(), auto_exposure(), gamma(), gamma_rate(), saturate_power(), saturate_coeff(), scene_fade_blend_func(), tone_map_method(), lens_flare(), lens_shaft(), lens_ghost(), lens_flare_power(), lens_flare_appear_power(), update(), update_tex() { @@ -72,6 +75,9 @@ void post_process_tone_map::apply(render_texture* in_tex, texture* light_proj_te gl_state_active_bind_texture_2d(1, in_tex_0); gl_state_active_bind_texture_2d(2, tone_map_tex); gl_state_active_bind_texture_2d(3, in_tex_1); + gl_state_active_bind_texture_2d(4, rctx_ptr->empty_texture_2d); + gl_state_active_bind_texture_2d(5, rctx_ptr->empty_texture_2d); + gl_state_active_bind_texture_2d(6, rctx_ptr->empty_texture_2d); if (back_2d_tex) { gl_state_active_bind_texture_2d(6, back_2d_tex->tex); diff --git a/src/CRE/render_context.cpp b/src/CRE/render_context.cpp index c43e76d0..5e10aafb 100644 --- a/src/CRE/render_context.cpp +++ b/src/CRE/render_context.cpp @@ -995,8 +995,9 @@ namespace mdl { bool reflect = uniform_value[U_REFLECT] == 1; void(*func)(render_context * rctx, const ObjSubMeshArgs * args) = draw_sub_mesh_default; - for (int32_t i = 0; i < 6; i++) - gl_state_active_bind_texture_2d(i, 0); + for (int32_t i = 0; i < 5; i++) + gl_state_active_bind_texture_2d(i, rctx_ptr->empty_texture_2d); + gl_state_active_bind_texture_cube_map(5, rctx_ptr->empty_texture_cube_map); gl_state_active_texture(0); gl_state_set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); uniform_value_reset(); @@ -1145,8 +1146,9 @@ namespace mdl { bool reflect = uniform_value[U_REFLECT] == 1; void(*func)(render_context * rctx, const ObjSubMeshArgs * args) = draw_sub_mesh_default; - for (int32_t i = 0; i < 6; i++) - gl_state_active_bind_texture_2d(i, 0); + for (int32_t i = 0; i < 5; i++) + gl_state_active_bind_texture_2d(i, rctx_ptr->empty_texture_2d); + gl_state_active_bind_texture_cube_map(5, rctx_ptr->empty_texture_cube_map); gl_state_active_texture(0); gl_state_set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); uniform_value_reset(); @@ -1216,8 +1218,9 @@ namespace mdl { if (get_obj_count(type) < 1) return; - for (int32_t i = 0; i < 6; i++) - gl_state_active_bind_texture_2d(i, 0); + for (int32_t i = 0; i < 5; i++) + gl_state_active_bind_texture_2d(i, rctx_ptr->empty_texture_2d); + gl_state_active_bind_texture_cube_map(5, rctx_ptr->empty_texture_cube_map); gl_state_active_texture(0); gl_state_set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); uniform_value_reset(); @@ -2480,8 +2483,8 @@ void obj_batch_shader_data::set_transforms(const mat4& model, const mat4& view, g_transforms[3] = temp.row3; } -render_context::render_context() : litproj(), chara_reflect(), -chara_refract(), view_mat(), matrix_buffer(), box_vao(), box_vbo() { +render_context::render_context() : litproj(), chara_reflect(), chara_refract(), view_mat(), +matrix_buffer(), box_vao(), box_vbo(), empty_texture_2d(), empty_texture_cube_map() { camera = new ::camera; static const float_t box_texcoords[] = { @@ -2557,9 +2560,41 @@ chara_refract(), view_mat(), matrix_buffer(), box_vao(), box_vbo() { obj_scene_ubo.Create(sizeof(obj_scene_shader_data)); obj_batch_ubo.Create(sizeof(obj_batch_shader_data)); obj_skinning_ubo.Create(sizeof(obj_skinning_shader_data)); + + static const uint8_t empty_texture_data[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + + static const GLenum target_cube_map_array[] = { + GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, + GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, + GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z + }; + + static const int32_t max_level = 2; + + glGenTextures(1, &empty_texture_2d); + gl_state_bind_texture_2d(empty_texture_2d); + texture_set_params(empty_texture_2d, GL_TEXTURE_2D, max_level, false); + for (int32_t level = 0, size = 1 << max_level; level <= max_level; size /= 2, level++) + glCompressedTexImage2D(GL_TEXTURE_2D, level, + GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, size, size, 0, 8, empty_texture_data); + gl_state_bind_texture_2d(0); + + glGenTextures(1, &empty_texture_cube_map); + gl_state_bind_texture_cube_map(empty_texture_cube_map); + texture_set_params(empty_texture_cube_map, GL_TEXTURE_CUBE_MAP, max_level, false); + for (int32_t side = 0; side < 6; side++) + for (int32_t level = 0, size = 1 << max_level; level <= max_level; size /= 2, level++) + glCompressedTexImage2D(target_cube_map_array[side], level, + GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, size, size, 0, 8, empty_texture_data); + gl_state_bind_texture_cube_map(0); } render_context::~render_context() { + glDeleteTextures(1, &empty_texture_cube_map); + glDeleteTextures(1, &empty_texture_2d); + obj_skinning_ubo.Destroy(); obj_batch_ubo.Destroy(); obj_scene_ubo.Destroy(); diff --git a/src/CRE/render_context.hpp b/src/CRE/render_context.hpp index a763eb91..be1fbd30 100644 --- a/src/CRE/render_context.hpp +++ b/src/CRE/render_context.hpp @@ -859,6 +859,9 @@ struct render_context { GL::UniformBuffer obj_batch_ubo; GL::UniformBuffer obj_skinning_ubo; + GLuint empty_texture_2d; + GLuint empty_texture_cube_map; + render_context(); ~render_context(); diff --git a/src/CRE/render_manager.cpp b/src/CRE/render_manager.cpp index df93058e..ce97d3ac 100644 --- a/src/CRE/render_manager.cpp +++ b/src/CRE/render_manager.cpp @@ -564,13 +564,17 @@ namespace rndr { gl_state_active_bind_texture_2d(15, refl_tex.color_texture->tex); uniform_value[U_WATER_REFLECT] = 1; } - else + else { + gl_state_active_bind_texture_2d(15, rctx->empty_texture_2d); uniform_value[U_WATER_REFLECT] = 0; + } uniform_value[U12] = field_320 ? 1 : 0; if (effect_texture) gl_state_active_bind_texture_2d(14, effect_texture->tex); + else + gl_state_active_bind_texture_2d(14, rctx->empty_texture_2d); gl_state_active_bind_texture_2d(16, sss_data.textures[1].color_texture->tex); gl_state_active_texture(0); @@ -709,13 +713,11 @@ namespace rndr { } #endif - if (effect_texture) - gl_state_active_bind_texture_2d(14, 0); + gl_state_active_bind_texture_2d(14, 0); + gl_state_active_bind_texture_2d(15, 0); gl_state_disable_depth_test(); - if (pass_sw[RND_PASSID_REFLECT] && reflect) - gl_state_active_bind_texture_2d(15, 0); if (shadow) draw_pass_3d_shadow_reset(rctx); shader::unbind(); @@ -843,6 +845,8 @@ namespace rndr { if (effect_texture) gl_state_active_bind_texture_2d(14, effect_texture->tex); + else + gl_state_active_bind_texture_2d(14, rctx->empty_texture_2d); gl_state_enable_depth_test(); gl_state_disable_blend(); } @@ -1374,8 +1378,10 @@ static void draw_pass_3d_shadow_set(shadow* shad, render_context* rctx) { } for (int32_t i = 0, j = 0; i < 2; i++) { - if (!shad->field_2F0[i]) + if (!shad->field_2F0[i]) { + gl_state_active_bind_texture_2d(6 + j, rctx->empty_texture_2d); continue; + } gl_state_active_bind_texture_2d(6 + j, shad->field_158[1 + i]->color_texture->tex); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f); diff --git a/src/CRE/sprite.cpp b/src/CRE/sprite.cpp index 7108c909..4b08f145 100644 --- a/src/CRE/sprite.cpp +++ b/src/CRE/sprite.cpp @@ -134,7 +134,7 @@ namespace spr { static void draw_sprite(render_context* rctx, SprArgs& args, bool font, const mat4& mat, int32_t x_min, int32_t y_min, int32_t x_max, int32_t y_max, std::vector& draw_param_buffer, std::vector& vertex_buffer); - static void draw_sprite_begin(); + static void draw_sprite_begin(render_context* rctx); static void draw_sprite_end(); static void draw_sprite_scale(spr::SprArgs* args); } @@ -597,7 +597,7 @@ namespace spr { void SpriteManager::Draw(render_context* rctx, int32_t index, bool font, texture* tex, const mat4& proj) { - draw_sprite_begin(); + draw_sprite_begin(rctx); ::resolution_mode mode = res_window_get()->resolution_mode; if (index == 2 && resolution_mode != RESOLUTION_MODE_MAX) @@ -769,6 +769,12 @@ namespace spr { gl_state_active_bind_texture_2d(1, j.texture[1]); gl_state_bind_sampler(1, j.sampler); } + else + gl_state_active_bind_texture_2d(1, rctx->empty_texture_2d); + } + else { + gl_state_active_bind_texture_2d(0, rctx->empty_texture_2d); + gl_state_active_bind_texture_2d(1, rctx->empty_texture_2d); } shaders_ft.set(j.shader); @@ -1613,11 +1619,11 @@ namespace spr { } } - static void draw_sprite_begin() { + static void draw_sprite_begin(render_context* rctx) { gl_state_disable_blend(); - gl_state_active_bind_texture_2d(0, 0); + gl_state_active_bind_texture_2d(0, rctx->empty_texture_2d); gl_state_bind_sampler(0, 0); - gl_state_active_bind_texture_2d(1, 0); + gl_state_active_bind_texture_2d(1, rctx->empty_texture_2d); gl_state_bind_sampler(1, 0); gl_state_set_blend_func_separate(GL_ONE, GL_ZERO, GL_ONE, GL_ZERO); } diff --git a/src/CRE/texture.cpp b/src/CRE/texture.cpp index 18358a3b..3051977f 100644 --- a/src/CRE/texture.cpp +++ b/src/CRE/texture.cpp @@ -23,7 +23,6 @@ static int32_t texture_load(GLenum target, GLenum internal_format, static texture* texture_load_tex(texture_id id, GLenum target, GLenum internal_format, int32_t width, int32_t height, int32_t max_mipmap_level, void** data_ptr, bool use_high_anisotropy); -static void texture_set_params(GLuint texture, GLenum target, int32_t max_mipmap_level, bool use_high_anisotropy); static GLenum texture_txp_get_gl_internal_format(txp* t); std::vector texture_storage; @@ -184,6 +183,27 @@ void texture_array_free(texture** arr) { free_def(arr); } +void texture_set_params(GLuint texture, GLenum target, + int32_t max_mipmap_level, bool use_high_anisotropy) { + glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + static const vec4 border_color = 0.0f; + glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, (GLfloat*)&border_color); + glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(target, GL_TEXTURE_MIN_FILTER, + max_mipmap_level > 0 ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR); + glTexParameteri(target, GL_TEXTURE_BASE_LEVEL, 0); + glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, max_mipmap_level); + + float_t max_anisotropy; + if (use_high_anisotropy) + max_anisotropy = 16.0f; + else + max_anisotropy = 1.0f; + glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_anisotropy); +} + bool texture_txp_set_load(txp_set* t, texture*** texs, uint32_t* ids) { if (!t || !texs || !ids) return false; @@ -631,26 +651,6 @@ fail: return 0; } -static void texture_set_params(GLuint texture, GLenum target, int32_t max_mipmap_level, bool use_high_anisotropy) { - glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); - static const vec4 border_color = 0.0f; - glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, (GLfloat*)&border_color); - glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(target, GL_TEXTURE_MIN_FILTER, - max_mipmap_level > 0 ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR); - glTexParameteri(target, GL_TEXTURE_BASE_LEVEL, 0); - glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, max_mipmap_level); - - float_t max_anisotropy; - if (use_high_anisotropy) - max_anisotropy = 16.0f; - else - max_anisotropy = 1.0f; - glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_anisotropy); -} - static GLenum texture_txp_get_gl_internal_format(txp* t) { if (!t || !t->mipmaps.size()) return GL_ZERO; diff --git a/src/CRE/texture.hpp b/src/CRE/texture.hpp index 9859f418..29b2e818 100644 --- a/src/CRE/texture.hpp +++ b/src/CRE/texture.hpp @@ -85,6 +85,9 @@ extern void texture_free(texture* tex); extern void texture_array_free(texture** arr); +extern void texture_set_params(GLuint texture, GLenum target, + int32_t max_mipmap_level, bool use_high_anisotropy); + extern bool texture_txp_set_load(txp_set* t, texture*** texs, uint32_t* ids); extern bool texture_txp_set_load(txp_set* t, texture*** texs, texture_id* ids);