mirror of
https://github.com/korenkonder/ReDIVA.git
synced 2026-10-13 09:38:14 +03:00
Reflect: Added stencil test
This commit is contained in:
+106
-1
@@ -8,6 +8,7 @@
|
||||
#include "Glitter/glitter.hpp"
|
||||
#include "light_param/fog.hpp"
|
||||
#include "light_param/light.hpp"
|
||||
#include "mdl/draw_object.hpp"
|
||||
#include "rob/rob.hpp"
|
||||
#include "Vulkan/gl_wrap.hpp"
|
||||
#include "config.hpp"
|
||||
@@ -41,6 +42,7 @@ static int32_t draw_pass_3d_translucent_count_layers(render_context* rctx,
|
||||
int32_t* alpha_array, mdl::ObjType opaque,
|
||||
mdl::ObjType transparent, mdl::ObjType translucent);
|
||||
static void draw_pass_3d_translucent_has_objects(render_context* rctx, bool* arr, mdl::ObjType type);
|
||||
static void draw_pass_reflect_stencil(render_context* rctx, mdl::ObjType type);
|
||||
|
||||
static void blur_filter_apply(render_context* rctx, RenderTexture* dst, RenderTexture* src,
|
||||
blur_filter_mode filter, const vec2 res_scale, const vec4 scale, const vec4 offset);
|
||||
@@ -67,7 +69,7 @@ namespace rndr {
|
||||
|
||||
static const RenderTextureData render_manager_render_texture_data_array[] = {
|
||||
{ GL_TEXTURE_2D, 0x200, 0x100, 0, GL_RGBA8 , GL_DEPTH_COMPONENT24 },
|
||||
{ GL_TEXTURE_2D, 0x200, 0x100, 0, GL_RGBA16F, GL_DEPTH_COMPONENT24 },
|
||||
{ GL_TEXTURE_2D, 0x200, 0x100, 0, GL_RGBA16F, GL_DEPTH24_STENCIL8 },
|
||||
{ GL_TEXTURE_2D, 0x400, 0x400, 0, GL_RGBA8 , GL_ZERO },
|
||||
{ GL_TEXTURE_2D, 0x400, 0x400, 0, GL_RGBA8 , GL_ZERO },
|
||||
{ GL_TEXTURE_2D, 0x400, 0x400, 0, GL_RGBA8 , GL_ZERO },
|
||||
@@ -682,6 +684,35 @@ namespace rndr {
|
||||
else
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
if (sv_better_reflect) {
|
||||
gl_state_set_stencil_mask(0xFF);
|
||||
|
||||
glClearStencil(0x00);
|
||||
glClear(GL_STENCIL_BUFFER_BIT);
|
||||
|
||||
rctx->draw_state->shader_index = SHADER_FT_SIL;
|
||||
|
||||
gl_state_disable_depth_test();
|
||||
gl_state_set_depth_func(GL_LEQUAL);
|
||||
gl_state_set_depth_mask(GL_TRUE);
|
||||
|
||||
gl_state_enable_stencil_test();
|
||||
gl_state_set_stencil_op(GL_KEEP, GL_KEEP, GL_REPLACE);
|
||||
gl_state_set_stencil_func(GL_ALWAYS, 0x01, 0xFF);
|
||||
|
||||
gl_state_set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
|
||||
draw_pass_reflect_stencil(rctx, mdl::OBJ_TYPE_OPAQUE);
|
||||
draw_pass_reflect_stencil(rctx, mdl::OBJ_TYPE_TRANSLUCENT);
|
||||
draw_pass_reflect_stencil(rctx, mdl::OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS);
|
||||
draw_pass_reflect_stencil(rctx, mdl::OBJ_TYPE_TRANSPARENT);
|
||||
gl_state_set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||
|
||||
gl_state_set_stencil_op(GL_KEEP, GL_KEEP, GL_KEEP);
|
||||
gl_state_set_stencil_func(GL_EQUAL, 0x01, 0x01);
|
||||
|
||||
gl_state_set_stencil_mask(0x00);
|
||||
}
|
||||
|
||||
rctx->draw_state->shader_index = SHADER_FT_S_REFL;
|
||||
|
||||
light_set* set = &rctx->light_set[LIGHT_SET_MAIN];
|
||||
@@ -778,6 +809,9 @@ namespace rndr {
|
||||
uniform_value[U_REFLECT] = 0;
|
||||
rctx->draw_state->shader_index = -1;
|
||||
|
||||
if (sv_better_reflect)
|
||||
gl_state_disable_stencil_test();
|
||||
|
||||
for (int32_t i = reflect_blur_num, j = 0; i > 0; i--, j++) {
|
||||
blur_filter_apply(rctx, &refl_buf_tex, &refl_tex,
|
||||
reflect_blur_filter, 1.0f, 1.0f, 0.0f);
|
||||
@@ -1976,6 +2010,77 @@ static void draw_pass_3d_translucent_has_objects(render_context* rctx, bool* arr
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_pass_reflect_stencil(render_context* rctx, mdl::ObjType type) {
|
||||
if (type < 0 || type >= mdl::OBJ_TYPE_MAX || rctx->disp_manager->get_obj_count(type) < 1)
|
||||
return;
|
||||
|
||||
int32_t alpha_test = 0;
|
||||
float_t min_alpha = 1.0f;
|
||||
float_t alpha_threshold = 0.0f;
|
||||
|
||||
for (int32_t i = 0; i < 5; i++)
|
||||
gl_state_active_bind_texture_2d(i, rctx->empty_texture_2d->glid);
|
||||
gl_state_active_bind_texture_cube_map(5, rctx->empty_texture_cube_map->glid);
|
||||
gl_state_active_texture(0);
|
||||
gl_state_set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
uniform_value_reset();
|
||||
gl_state_get();
|
||||
|
||||
switch (type) {
|
||||
case mdl::OBJ_TYPE_TRANSLUCENT:
|
||||
case mdl::OBJ_TYPE_TRANSLUCENT_SORT_BY_RADIUS:
|
||||
alpha_test = 1;
|
||||
min_alpha = 0.0f;
|
||||
alpha_threshold = 0.0f;
|
||||
break;
|
||||
case mdl::OBJ_TYPE_TRANSPARENT:
|
||||
alpha_test = 1;
|
||||
min_alpha = 0.1f;
|
||||
alpha_threshold = 0.5f;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
rctx->set_batch_alpha_threshold(alpha_threshold);
|
||||
rctx->set_batch_min_alpha(min_alpha);
|
||||
uniform_value[U_ALPHA_TEST] = alpha_test;
|
||||
|
||||
for (mdl::ObjData*& i : rctx->disp_manager->obj[type]) {
|
||||
switch (i->kind) {
|
||||
case mdl::OBJ_KIND_NORMAL: {
|
||||
switch (i->args.sub_mesh.material->material.shader.index) {
|
||||
case SHADER_FT_WATER01:
|
||||
case SHADER_FT_FLOOR:
|
||||
case SHADER_FT_PUDDLE:
|
||||
mat4 mat;
|
||||
mat4_scale_rot(&i->mat, 1.1f, &mat);
|
||||
draw_sub_mesh(rctx, &i->args.sub_mesh, &mat, mdl::draw_sub_mesh_default);
|
||||
break;
|
||||
}
|
||||
} break;
|
||||
case mdl::OBJ_KIND_TRANSLUCENT: {
|
||||
for (int32_t j = 0; j < i->args.translucent.count; j++)
|
||||
switch (i->args.translucent.sub_mesh[j]->material->material.shader.index) {
|
||||
case SHADER_FT_WATER01:
|
||||
case SHADER_FT_FLOOR:
|
||||
case SHADER_FT_PUDDLE:
|
||||
mat4 mat;
|
||||
mat4_scale_rot(&i->mat, 1.1f, &mat);
|
||||
draw_sub_mesh(rctx, i->args.translucent.sub_mesh[j], &mat, mdl::draw_sub_mesh_default);
|
||||
break;
|
||||
}
|
||||
} break;
|
||||
}
|
||||
}
|
||||
|
||||
uniform_value_reset();
|
||||
gl_state_bind_vertex_array(0);
|
||||
shader::unbind();
|
||||
gl_state_set_blend_func(GL_ONE, GL_ZERO);
|
||||
for (int32_t i = 0; i < 5; i++)
|
||||
gl_state_bind_sampler(i, 0);
|
||||
}
|
||||
|
||||
static void blur_filter_apply(render_context* rctx, RenderTexture* dst, RenderTexture* src,
|
||||
blur_filter_mode filter, const vec2 res_scale, const vec4 scale, const vec4 offset) {
|
||||
if (!dst || !src)
|
||||
|
||||
Reference in New Issue
Block a user