Reflect: Better Stencil test implementation

This commit is contained in:
korenkonder
2024-09-29 18:05:39 +03:00
parent a956f335cc
commit ca904f1c1a
9 changed files with 145 additions and 37 deletions
+46 -5
View File
@@ -74,6 +74,7 @@ namespace Vulkan {
vec4 clear_color;
float_t clear_depth;
int32_t clear_stencil;
int32_t pack_alignment;
int32_t unpack_alignment;
GLuint query_samples_passed;
@@ -122,6 +123,7 @@ namespace Vulkan {
static void gl_wrap_manager_clear_buffer(GLenum buffer, GLint drawbuffer, const GLfloat* value);
static void gl_wrap_manager_clear_color(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
static void gl_wrap_manager_clear_depth(GLfloat depth);
static void gl_wrap_manager_clear_stencil(GLint s);
static void gl_wrap_manager_clear_named_framebuffer(GLuint framebuffer,
GLenum buffer, GLint drawbuffer, const GLfloat* value);
static void gl_wrap_manager_compressed_tex_image_2d(GLenum target, GLint level,
@@ -963,7 +965,13 @@ namespace Vulkan {
gl_state.scissor_box.height = 0;
gl_state.scissor_test = GL_FALSE;
gl_state.stencil_test = GL_FALSE;
gl_state.stencil_mask = 0xFFFFFFFF;
gl_state.stencil_func = GL_ALWAYS;
gl_state.stencil_fail = GL_KEEP;
gl_state.stencil_dpfail = GL_KEEP;
gl_state.stencil_dppass = GL_KEEP;
gl_state.stencil_mask = 0x01;
gl_state.stencil_ref = 0x00;
gl_state.stencil_value_mask = 0x01;
gl_state.viewport.x = 0;
gl_state.viewport.y = 0;
gl_state.viewport.width = 0;
@@ -1017,6 +1025,7 @@ namespace Vulkan {
glClearBufferfv = gl_wrap_manager_clear_buffer;
glClearColor = gl_wrap_manager_clear_color;
glClearDepthf = gl_wrap_manager_clear_depth;
glClearStencil = gl_wrap_manager_clear_stencil;
glCompressedTexImage2D = gl_wrap_manager_compressed_tex_image_2d;
glCompressedTexSubImage2D = gl_wrap_manager_compressed_tex_sub_image_2d;
glCopyImageSubData = gl_wrap_manager_copy_image_sub_data;
@@ -1305,6 +1314,29 @@ namespace Vulkan {
}
}
VkStencilOp get_stencil_op(GLenum op) {
switch (op) {
case GL_KEEP:
return VK_STENCIL_OP_KEEP;
case GL_ZERO:
return VK_STENCIL_OP_ZERO;
case GL_REPLACE:
return VK_STENCIL_OP_REPLACE;
case GL_INCR:
return VK_STENCIL_OP_INCREMENT_AND_CLAMP;
case GL_DECR:
return VK_STENCIL_OP_DECREMENT_AND_CLAMP;
case GL_INVERT:
return VK_STENCIL_OP_INVERT;
case GL_INCR_WRAP:
return VK_STENCIL_OP_INCREMENT_AND_WRAP;
case GL_DECR_WRAP:
return VK_STENCIL_OP_DECREMENT_AND_WRAP;
default:
return VK_STENCIL_OP_MAX_ENUM;
}
}
gl_texture_data::tex_data::tex_data() {
}
@@ -1598,6 +1630,7 @@ namespace Vulkan {
texture_counter(), vertex_array_counter(), query_samples_passed() {
clear_color = 0.0f;
clear_depth = 1.0f;
clear_stencil = 0x00;
pack_alignment = 4;
unpack_alignment = 4;
}
@@ -2295,7 +2328,7 @@ namespace Vulkan {
}
static void gl_wrap_manager_clear(GLbitfield mask) {
if (mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) {
if (mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) {
gl_wrap_manager_ptr->push_error(GL_INVALID_VALUE);
return;
}
@@ -2359,7 +2392,7 @@ namespace Vulkan {
VkClearDepthStencilValue clear_depth_stencil_value;
clear_depth_stencil_value.depth = gl_wrap_manager_ptr->clear_depth;
clear_depth_stencil_value.stencil = 0;
clear_depth_stencil_value.stencil = gl_wrap_manager_ptr->clear_stencil;
VkImageSubresourceRange range;
range.aspectMask = aspect_mask;
@@ -2396,6 +2429,10 @@ namespace Vulkan {
gl_wrap_manager_ptr->clear_depth = depth;
}
static void gl_wrap_manager_clear_stencil(GLint s) {
gl_wrap_manager_ptr->clear_stencil = s;
}
static void gl_wrap_manager_clear_named_framebuffer(GLuint framebuffer,
GLenum buffer, GLint drawbuffer, const GLfloat* value) {
VkImageAspectFlags aspect_mask;
@@ -3103,7 +3140,7 @@ namespace Vulkan {
static void gl_wrap_manager_framebuffer_texture(GLenum target,
GLenum attachment, GLuint texture, GLint level) {
if (target != GL_FRAMEBUFFER || attachment < GL_COLOR_ATTACHMENT0
if (target != GL_FRAMEBUFFER || attachment < GL_COLOR_ATTACHMENT0 && attachment != GL_DEPTH_STENCIL_ATTACHMENT
|| (attachment > GL_COLOR_ATTACHMENT0 + Vulkan::MAX_COLOR_ATTACHMENTS
&& attachment != GL_DEPTH_ATTACHMENT)) {
gl_wrap_manager_ptr->push_error(GL_INVALID_ENUM);
@@ -3128,7 +3165,7 @@ namespace Vulkan {
return;
}
if (attachment == GL_DEPTH_ATTACHMENT) {
if (attachment == GL_DEPTH_ATTACHMENT || attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
vk_fbo->depth_attachment = texture;
vk_fbo->depth_attachment_level = texture ? level : 0;
vk_fbo->update_depth_attachment = true;
@@ -3485,6 +3522,7 @@ namespace Vulkan {
case GL_RGB:
case GL_RGBA:
case GL_DEPTH_COMPONENT:
case GL_DEPTH_STENCIL:
break;
default:
gl_wrap_manager_ptr->push_error(GL_INVALID_ENUM);
@@ -3920,6 +3958,7 @@ namespace Vulkan {
case GL_RGB:
case GL_RGBA:
case GL_DEPTH_COMPONENT:
case GL_DEPTH_STENCIL:
break;
default:
gl_wrap_manager_ptr->push_error(GL_INVALID_ENUM);
@@ -3934,6 +3973,7 @@ namespace Vulkan {
case GL_UNSIGNED_SHORT_5_6_5_REV:
case GL_UNSIGNED_SHORT_4_4_4_4_REV:
case GL_UNSIGNED_SHORT_1_5_5_5_REV:
case GL_UNSIGNED_INT_24_8:
case GL_UNSIGNED_INT_10F_11F_11F_REV:
break;
default:
@@ -3962,6 +4002,7 @@ namespace Vulkan {
case GL_DEPTH_COMPONENT32F:
break;
default:
printf("e");
gl_wrap_manager_ptr->push_error(GL_INVALID_ENUM);
return;
}
+1
View File
@@ -242,4 +242,5 @@ namespace Vulkan {
extern VkFormat get_format(GLenum internal_format);
extern VkImageViewType get_image_view_type(GLenum target);
extern VkPolygonMode get_polygon_mode(GLenum mode);
extern VkStencilOp get_stencil_op(GLenum op);
}
+11 -13
View File
@@ -106,19 +106,16 @@ struct render_pass_data {
uint64_t color_formats_hash;
GLenum depth_format;
bool depth_read_only;
bool stencil;
uint8_t pad[2];
uint8_t pad[3];
inline render_pass_data() : color_formats_hash(), depth_format(), depth_read_only(), stencil(), pad() {
inline render_pass_data() : color_formats_hash(), depth_format(), depth_read_only(), pad() {
}
inline render_pass_data(uint64_t color_formats_hash, GLenum depth_format,
bool depth_read_only, bool stencil) : pad() {
inline render_pass_data(uint64_t color_formats_hash, GLenum depth_format, bool depth_read_only) : pad() {
this->color_formats_hash = color_formats_hash;
this->depth_format = depth_format;
this->depth_read_only = depth_read_only;
this->stencil = stencil;
}
};
@@ -132,7 +129,7 @@ public:
constexpr bool operator==(const render_pass_data& left, const render_pass_data& right) {
return left.color_formats_hash == right.color_formats_hash
&& left.depth_format == right.depth_format && left.stencil == right.stencil;
&& left.depth_format == right.depth_format;
}
namespace Vulkan {
@@ -221,7 +218,7 @@ namespace Vulkan {
const VkPipelineColorBlendAttachmentState* color_blend_attachments,
VkPipelineLayout layout, VkRenderPass render_pass);
prj::shared_ptr<Vulkan::RenderPass> get_render_pass(GLenum* color_formats,
uint32_t color_format_count, GLenum depth_format, bool depth_read_only, bool stencil);
uint32_t color_format_count, GLenum depth_format, bool depth_read_only);
prj::shared_ptr<Vulkan::Sampler> get_sampler(const gl_sampler& sampler_data);
Vulkan::Buffer get_dynamic_buffer(VkDeviceSize size, VkDeviceSize alignment);
Vulkan::Buffer get_staging_buffer(VkDeviceSize size, VkDeviceSize alignment);
@@ -302,9 +299,9 @@ namespace Vulkan {
prj::shared_ptr<Vulkan::RenderPass> manager_get_render_pass(
GLenum* color_formats, uint32_t color_format_count,
GLenum depth_format, bool depth_read_only, bool stencil) {
GLenum depth_format, bool depth_read_only) {
return manager_ptr->get_render_pass(color_formats,
color_format_count, depth_format, depth_read_only, stencil);
color_format_count, depth_format, depth_read_only);
}
prj::shared_ptr<Vulkan::Sampler> manager_get_sampler(const gl_sampler& sampler_data) {
@@ -517,11 +514,11 @@ namespace Vulkan {
}
prj::shared_ptr<Vulkan::RenderPass> manager::get_render_pass(GLenum* color_formats,
uint32_t color_format_count, GLenum depth_format, bool depth_read_only, bool stencil) {
uint32_t color_format_count, GLenum depth_format, bool depth_read_only) {
uint64_t color_formats_hash = hash_xxh3_64bits(color_formats,
sizeof(GLenum) * color_format_count);
auto elem = render_passes.find({ color_formats_hash, depth_format, depth_read_only, stencil });
auto elem = render_passes.find({ color_formats_hash, depth_format, depth_read_only });
if (elem != render_passes.end())
return elem->second;
@@ -593,6 +590,7 @@ namespace Vulkan {
}
if (depth_format) {
const bool stencil = depth_format == GL_DEPTH24_STENCIL8;
VkAttachmentDescription& depth_attachment = attachments[attachment_count];
depth_attachment.flags = 0;
depth_attachment.format = Vulkan::get_format(depth_format);
@@ -615,7 +613,7 @@ namespace Vulkan {
prj::shared_ptr<Vulkan::RenderPass> render_pass(new Vulkan::RenderPass(Vulkan::current_device, 0,
attachment_count, attachments, 1, &subpass_description, 1, &subpass_dependency));
render_passes.insert({ { color_formats_hash, depth_format, depth_read_only, stencil }, render_pass });
render_passes.insert({ { color_formats_hash, depth_format, depth_read_only }, render_pass });
free_def(attachments);
free_def(color_attachment_reference);
+1 -1
View File
@@ -45,7 +45,7 @@ namespace Vulkan {
VkPipelineLayout layout, VkRenderPass render_pass);
extern prj::shared_ptr<Vulkan::RenderPass> manager_get_render_pass(
GLenum* color_formats, uint32_t color_format_count,
GLenum depth_format, bool depth_read_only, bool stencil = false);
GLenum depth_format, bool depth_read_only);
extern prj::shared_ptr<Vulkan::Sampler> manager_get_sampler(const gl_sampler& sampler_data);
Vulkan::Buffer manager_get_dynamic_buffer(VkDeviceSize size, VkDeviceSize alignment);
Vulkan::Buffer manager_get_staging_buffer(VkDeviceSize size, VkDeviceSize alignment = 0x40);
+3 -1
View File
@@ -49,7 +49,9 @@ void gl_state_active_texture(size_t index, bool force) {
}
void gl_state_bind_framebuffer(GLuint framebuffer, bool force) {
if (force || gl_state.framebuffer_binding != framebuffer) {
if (force || gl_state.framebuffer_binding != framebuffer
|| gl_state.read_framebuffer_binding != framebuffer
|| gl_state.draw_framebuffer_binding != framebuffer) {
#ifdef USE_OPENGL
if (!Vulkan::use)
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
+35 -15
View File
@@ -24,7 +24,7 @@
#include "static_var.hpp"
#include "texture.hpp"
#define REFLECT_STENCIL (0)
#define REFLECT_STENCIL (1)
static void draw_pass_shadow_begin_make_shadowmap(Shadow* shad, int32_t index, int32_t a3);
static void draw_pass_shadow_end_make_shadowmap(Shadow* shad, int32_t index, int32_t a3);
@@ -499,7 +499,12 @@ namespace rndr {
//}
glClearColor(sss->param.x, sss->param.y, sss->param.z, 0.0f);
#if REFLECT_STENCIL
glClearStencil(0x00);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
#else
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
#endif
draw_pass_set_camera();
for (int32_t i = LIGHT_SET_MAIN; i < LIGHT_SET_MAX; i++)
@@ -688,33 +693,52 @@ namespace rndr {
rctx->fog[i].data_set((fog_id)i);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
#if REFLECT_STENCIL
glClearStencil(0x00);
#endif
if (sv_better_reflect && rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_SSS))
glClear(GL_COLOR_BUFFER_BIT);
else
#if REFLECT_STENCIL
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
#else
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
#endif
#if REFLECT_STENCIL
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);
fbo_blit(refl_tex.fbos[0], refl_buf_tex.fbos[0],
0, 0, refl_tex.GetWidth(), refl_tex.GetHeight(),
0, 0, refl_buf_tex.GetWidth(), refl_buf_tex.GetHeight(),
GL_COLOR_BUFFER_BIT, GL_LINEAR);
refl_tex.Bind();
glClear(GL_COLOR_BUFFER_BIT);
gl_state_enable_stencil_test();
gl_state_set_stencil_op(GL_KEEP, GL_KEEP, GL_REPLACE);
gl_state_set_stencil_func(GL_ALWAYS, 0x01, 0x01);
gl_state_bind_texture_2d(refl_buf_tex.GetColorTex());
gl_state_bind_sampler(0, rctx->render_samplers[0]);
gl_state_set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
shaders_ft.set(SHADER_FT_REFLECT_STENCIL);
rctx->render.draw_quad(refl_buf_tex.GetWidth(), refl_buf_tex.GetHeight(), 1.0f, 1.0f,
0.0f, 0.0f, 6.0f, 1.0f, 1.0f, 1.0f, 1.0f);
gl_state_set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
gl_state_set_stencil_op(GL_KEEP, GL_KEEP, GL_KEEP);
@@ -2066,9 +2090,7 @@ static void draw_pass_reflect_stencil(render_context* rctx, mdl::ObjType type) {
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);
draw_sub_mesh(rctx, &i->args.sub_mesh, &i->mat, mdl::draw_sub_mesh_default);
break;
}
} break;
@@ -2078,9 +2100,7 @@ static void draw_pass_reflect_stencil(render_context* rctx, mdl::ObjType type) {
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);
draw_sub_mesh(rctx, i->args.translucent.sub_mesh[j], &i->mat, mdl::draw_sub_mesh_default);
break;
}
} break;
+18 -2
View File
@@ -1803,7 +1803,21 @@ static bool shader_update_data(shader_set_data* set, GLenum mode, GLenum type, c
depth_stencil_state.depthCompareOp = Vulkan::get_compare_op(
gl_state.depth_test ? gl_state.depth_func : GL_ALWAYS);
depth_stencil_state.depthBoundsTestEnable = VK_FALSE;
depth_stencil_state.stencilTestEnable = VK_FALSE;
depth_stencil_state.stencilTestEnable = gl_state.stencil_test ? VK_TRUE : VK_FALSE;
depth_stencil_state.front.failOp = Vulkan::get_stencil_op(gl_state.stencil_fail);
depth_stencil_state.front.passOp = Vulkan::get_stencil_op(gl_state.stencil_dppass);
depth_stencil_state.front.depthFailOp = Vulkan::get_stencil_op(gl_state.stencil_dpfail);
depth_stencil_state.front.compareOp = Vulkan::get_compare_op(gl_state.stencil_func);
depth_stencil_state.front.compareMask = gl_state.stencil_value_mask;
depth_stencil_state.front.writeMask = gl_state.stencil_mask;
depth_stencil_state.front.reference = gl_state.stencil_ref;
depth_stencil_state.back.failOp = Vulkan::get_stencil_op(gl_state.stencil_fail);
depth_stencil_state.back.passOp = Vulkan::get_stencil_op(gl_state.stencil_dppass);
depth_stencil_state.back.depthFailOp = Vulkan::get_stencil_op(gl_state.stencil_dpfail);
depth_stencil_state.back.compareOp = Vulkan::get_compare_op(gl_state.stencil_func);
depth_stencil_state.back.compareMask = gl_state.stencil_value_mask;
depth_stencil_state.back.writeMask = gl_state.stencil_mask;
depth_stencil_state.back.reference = gl_state.stencil_ref;
depth_stencil_state.minDepthBounds = 0.0f;
depth_stencil_state.maxDepthBounds = 1.0f;
@@ -1833,7 +1847,8 @@ static bool shader_update_data(shader_set_data* set, GLenum mode, GLenum type, c
VkPipelineLayout pipeline_layout = vk_descriptor_pipeline->GetPipelineLayout();
extern VkRenderPassBeginInfo vulkan_swapchain_render_pass_info;
const uint32_t framebuffer_index = depth_stencil_state.depthWriteEnable ? 0 : 1;
const uint32_t framebuffer_index = depth_stencil_state.depthWriteEnable
|| depth_stencil_state.stencilTestEnable ? 0 : 1;
VkRenderPass render_pass;
if (gl_state.draw_framebuffer_binding) {
Vulkan::gl_framebuffer* vk_fbo = Vulkan::gl_framebuffer::get(gl_state.draw_framebuffer_binding);
@@ -2317,6 +2332,7 @@ static bool shader_update_data(shader_set_data* set, GLenum mode, GLenum type, c
if (vk_fbo->depth_attachment) {
Vulkan::gl_texture* vk_tex = Vulkan::gl_texture::get(vk_fbo->depth_attachment);
const VkImageLayout layout = depth_stencil_state.depthWriteEnable
|| depth_stencil_state.stencilTestEnable
? VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
: VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Vulkan::Image::PipelineBarrier(Vulkan::current_command_buffer,
+29
View File
@@ -92,6 +92,7 @@ enum shader_ft_sub_enum {
SHADER_FT_SUB_DOF_MAIN_FILTER,
SHADER_FT_SUB_DOF_UPSAMPLE,
SHADER_FT_SUB_TRANSPARENCY,
SHADER_FT_SUB_REFLECT_STENCIL,
SHADER_FT_SUB_SHADER_END,
};
@@ -703,6 +704,14 @@ static const int32_t transparency_fpt_unival_max[] = {
-1,
};
static const int32_t reflect_stencil_vpt_unival_max[] = {
-1,
};
static const int32_t reflect_stencil_fpt_unival_max[] = {
-1,
};
#pragma region Shader Description
#define SHADER_DESCRIPTION_EFFECT_TEXTURE_SAMPLER \
{ SHADER_DESCRIPTION_SAMPLER, 14, 0, U_INVALID, }
@@ -2006,6 +2015,17 @@ static const shader_description transparency_fpt_desc[] = {
{ SHADER_DESCRIPTION_FRAGMENT_OUTPUT, 0, 4, U_INVALID, },
{ SHADER_DESCRIPTION_END, -1, -1, U_INVALID, },
};
static const shader_description reflect_stencil_vpt_desc[] = {
SHADER_DESCRIPTION_COMMON_QUAD,
{ SHADER_DESCRIPTION_END, -1, -1, U_INVALID, },
};
static const shader_description reflect_stencil_fpt_desc[] = {
{ SHADER_DESCRIPTION_SAMPLER, 0, 0, U_INVALID, },
{ SHADER_DESCRIPTION_FRAGMENT_OUTPUT, 0, 4, U_INVALID, },
{ SHADER_DESCRIPTION_END, -1, -1, U_INVALID, },
};
#undef SHADER_DESCRIPTION_COMMON_QUAD
#undef SHADER_DESCRIPTION_COMMON_SKINNING
#undef SHADER_DESCRIPTION_COMMON_SCENE
@@ -2254,6 +2274,10 @@ static const shader_sub_table TRANSPARENCY_table[] = {
shader_sub_table_struct(TRANSPARENCY, transparency, transparency),
};
static const shader_sub_table REFLECT_STENCIL_table[] = {
shader_sub_table_struct(REFLECT_STENCIL, reflect_stencil, reflect_stencil),
};
#undef shader_sub_table_struct
static const uniform_name BLINN_uniform[] = {
@@ -2474,6 +2498,10 @@ static const uniform_name TRANSPARENCY_uniform[] = {
U_INVALID,
};
static const uniform_name REFLECT_STENCIL_uniform[] = {
U_INVALID,
};
struct glass_eye_struct {
const vec4 tex_model_param;
const vec4 eb_tex_model_param;
@@ -2564,6 +2592,7 @@ const shader_table shader_ft_table[] = {
shader_table_struct(SPRITE),
shader_table_struct(DOF),
shader_table_struct(TRANSPARENCY),
shader_table_struct(REFLECT_STENCIL),
};
#undef shader_table_struct
+1
View File
@@ -58,6 +58,7 @@ enum shader_ft_enum {
SHADER_FT_SPRITE,
SHADER_FT_DOF,
SHADER_FT_TRANSPARENCY,
SHADER_FT_REFLECT_STENCIL,
SHADER_FT_END,
SHADER_FT_MAX,
};