Separated SSS Param for 3D and Reflect

This commit is contained in:
korenkonder
2025-06-08 13:11:08 +03:00
parent e75e4b2204
commit 5f85df88b0
+40 -35
View File
@@ -28,7 +28,9 @@ extern render_context* rctx_ptr;
bool reflect_draw = false;
mat4 reflect_mat = mat4_identity;
vec4 sss_param = 0.0f;
vec4 sss_param_reflect = 0.0f;
static void draw_pass_shadow_begin_make_shadowmap(Shadow* shad,
render_data_context& rend_data_ctx, cam_data& cam, int32_t index, int32_t a3);
@@ -530,6 +532,7 @@ namespace rndr {
::sss_data* sss = rctx->sss_data;
if (!sss->init_data || !sss->enable) {
sss_param = 0.0f;
sss_param_reflect = 0.0f;
return;
}
@@ -1677,39 +1680,37 @@ static void draw_pass_sss_contour(render_data_context& rend_data_ctx,
0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
}
static void draw_pass_sss_filter_calc_coef(double_t step, int32_t size, double_t a3, int32_t iterations,
const double_t* a5, const double_t* a6, const double_t* a7, const double_t* a8, vec4 a9[64]) {
static void draw_pass_sss_filter_calc_coef(const double_t step, const int32_t size,
const double_t inverse_scale, const int32_t iterations, const double_t* weights,
const double_t* r_radius, const double_t* g_radius, const double_t* b_radius, vec4 coef[64]) {
if (size > 8)
return;
for (int32_t i = 0; i < iterations; i++) {
const double_t v18 = a5[i];
double_t v56[3];
v56[0] = a6[i];
v56[1] = a7[i];
v56[2] = a8[i];
for (int32_t it = 0; it < iterations; it++) {
const double_t it_weight = weights[it];
const double_t ch_radius[] = { r_radius[it], g_radius[it], b_radius[it] };
for (int32_t j = 0; j < 3; j++) {
double_t v22 = 0.0;
double_t v23 = 0.0;
double_t v54[8];
double_t v24 = 1.0 / (a3 * v56[j]);
for (int32_t ch = 0; ch < 3; ch++) {
double_t kernel[8];
double_t pos = 0.0;
double_t kernel_sum = 0.0;
double_t scale = 1.0 / (inverse_scale * ch_radius[ch]);
for (int32_t k = 0; k < size; k++) {
double_t v25 = exp(-0.5 * (v24 * v23) * (v24 * v23));
v54[k] = v25;
v23 += step;
v22 += v25;
double_t weight = exp(-0.5 * (scale * pos) * (scale * pos));
kernel[k] = weight;
pos += step;
kernel_sum += weight;
}
double_t v27 = 1.0 / v22;
double_t inv_sum = 1.0 / kernel_sum;
for (int32_t k = 0; k < size; k++)
v54[k] *= v27;
kernel[k] *= inv_sum;
float_t* v35 = (float_t*)a9 + j;
float_t* ptr = (float_t*)coef + ch;
for (int32_t k = 0; k < size; k++)
for (size_t l = 0; l < size; l++) {
*v35 = (float_t)(v54[k] * v18 * v54[l] + *v35);
v35 += 4;
*ptr = (float_t)(kernel[k] * it_weight * kernel[l] + *ptr);
ptr += 4;
}
}
}
@@ -1746,13 +1747,16 @@ static void draw_pass_sss_filter(render_data_context& rend_data_ctx, render_cont
if (length > 1.25f)
interest = closest_chara_position;
float_t v29 = max_def(vec3::distance(view_point, interest), 0.25f);
float_t v31 = max_def(tanf(rctx->camera->fov * 0.5f * DEG_TO_RAD_FLOAT) * 5.0f, 0.25f);
float_t v33 = 0.6f;
float_t v34 = (float_t)(1.0 / clamp_def(v31 * v29, 0.25f, 100.0f));
if (v34 < 0.145f)
v33 = max_def(v34 - 0.02f, 0.0f) * 8.0f * 0.6f;
sss_param = { v33, 0.0f, 0.0f, 0.0f };
float_t distance_to_interest = max_def(vec3::distance(view_point, interest), 0.25f);
float_t fov_scale = max_def(tanf(rctx->camera->fov * 0.5f * DEG_TO_RAD_FLOAT) * 5.0f, 0.25f);
float_t sss_strength = 0.6f;
float_t inverse_scale = (float_t)(1.0 / clamp_def(fov_scale * distance_to_interest, 0.25f, 100.0f));
if (inverse_scale < 0.145f)
sss_strength = max_def(inverse_scale - 0.02f, 0.0f) * 8.0f * 0.6f;
if (reflect_draw)
sss_param_reflect = { sss_strength, 0.0f, 0.0f, 0.0f };
else
sss_param = { sss_strength, 0.0f, 0.0f, 0.0f };
rend_data_ctx.state.active_texture(0);
if (sss->npr_contour) {
@@ -1781,11 +1785,12 @@ static void draw_pass_sss_filter(render_data_context& rend_data_ctx, render_cont
sss_filter_gaussian_coef_shader_data shader_data = {};
shader_data.g_param = { (float_t)(sss_count - 1), 0.0f, 1.0f, 1.0f };
const double_t a5[] = { 0.4, 0.3, 0.3 };
const double_t a6[] = { 1.0, 2.0, 5.0 };
const double_t a7[] = { 0.2, 0.4, 1.2 };
const double_t a8[] = { 0.3, 0.7, 2.0 };
draw_pass_sss_filter_calc_coef(1.0, sss_count, v34, 3, a5, a6, a7, a8, shader_data.g_coef);
const double_t weights[] = { 0.4, 0.3, 0.3 };
const double_t r_radius[] = { 1.0, 2.0, 5.0 };
const double_t g_radius[] = { 0.2, 0.4, 1.2 };
const double_t b_radius[] = { 0.3, 0.7, 2.0 };
draw_pass_sss_filter_calc_coef(1.0, sss_count, inverse_scale,
3, weights, r_radius, g_radius, b_radius, shader_data.g_coef);
rctx->sss_filter_gaussian_coef_ubo.WriteMemory(rend_data_ctx.state, shader_data);
sss->textures[reflect_draw ? 3 : 1].Bind(rend_data_ctx.state);
@@ -2125,7 +2130,7 @@ static void draw_pass_reflect_full(render_data_context& rend_data_ctx, rndr::Ren
rctx->sss_data->set_texture(rend_data_ctx.state, 3);
rend_data_ctx.set_npr(render_manager);
rend_data_ctx.set_batch_sss_param(sss_param);
rend_data_ctx.set_batch_sss_param(sss_param_reflect);
rend_data_ctx.state.bind_sampler(14, rctx->render_samplers[0]);
rend_data_ctx.state.bind_sampler(15, rctx->render_samplers[0]);