Basic Engine: Port depth shader (object selection) to shaderCreateInfo
This should have no functional changes.
This commit is contained in:
parent
c87f6242b9
commit
eba06fee49
|
@ -424,6 +424,7 @@ set(GLSL_SRC
|
|||
|
||||
engines/basic/shaders/conservative_depth_geom.glsl
|
||||
engines/basic/shaders/depth_vert.glsl
|
||||
engines/basic/shaders/depth_pointcloud_vert.glsl
|
||||
engines/basic/shaders/depth_frag.glsl
|
||||
|
||||
engines/overlay/shaders/common_overlay_lib.glsl
|
||||
|
|
|
@ -32,80 +32,12 @@ static struct {
|
|||
BASIC_Shaders sh_data[GPU_SHADER_CFG_LEN];
|
||||
} e_data = {{{NULL}}}; /* Engine data */
|
||||
|
||||
static GPUShader *BASIC_shader_create_depth_sh(const GPUShaderConfigData *sh_cfg)
|
||||
{
|
||||
return GPU_shader_create_from_arrays({
|
||||
.vert = (const char *[]){sh_cfg->lib,
|
||||
datatoc_common_view_lib_glsl,
|
||||
datatoc_depth_vert_glsl,
|
||||
NULL},
|
||||
.frag = (const char *[]){datatoc_depth_frag_glsl, NULL},
|
||||
.defs = (const char *[]){sh_cfg->def, NULL},
|
||||
});
|
||||
}
|
||||
|
||||
static GPUShader *BASIC_shader_create_pointcloud_depth_sh(const GPUShaderConfigData *sh_cfg)
|
||||
{
|
||||
return GPU_shader_create_from_arrays({
|
||||
.vert = (const char *[]){sh_cfg->lib,
|
||||
datatoc_common_view_lib_glsl,
|
||||
datatoc_common_pointcloud_lib_glsl,
|
||||
datatoc_depth_vert_glsl,
|
||||
NULL},
|
||||
.frag = (const char *[]){datatoc_depth_frag_glsl, NULL},
|
||||
.defs = (const char *[]){sh_cfg->def,
|
||||
"#define POINTCLOUD\n",
|
||||
"#define INSTANCED_ATTR\n",
|
||||
"#define UNIFORM_RESOURCE_ID\n",
|
||||
NULL},
|
||||
});
|
||||
}
|
||||
|
||||
static GPUShader *BASIC_shader_create_depth_conservative_sh(const GPUShaderConfigData *sh_cfg)
|
||||
{
|
||||
return GPU_shader_create_from_arrays({
|
||||
.vert = (const char *[]){sh_cfg->lib,
|
||||
datatoc_common_view_lib_glsl,
|
||||
datatoc_depth_vert_glsl,
|
||||
NULL},
|
||||
.geom = (const char *[]){sh_cfg->lib,
|
||||
datatoc_common_view_lib_glsl,
|
||||
datatoc_conservative_depth_geom_glsl,
|
||||
NULL},
|
||||
.frag = (const char *[]){datatoc_depth_frag_glsl, NULL},
|
||||
.defs = (const char *[]){sh_cfg->def, "#define CONSERVATIVE_RASTER\n", NULL},
|
||||
});
|
||||
}
|
||||
|
||||
static GPUShader *BASIC_shader_create_pointcloud_depth_conservative_sh(
|
||||
const GPUShaderConfigData *sh_cfg)
|
||||
{
|
||||
return GPU_shader_create_from_arrays({
|
||||
.vert = (const char *[]){sh_cfg->lib,
|
||||
datatoc_common_view_lib_glsl,
|
||||
datatoc_common_pointcloud_lib_glsl,
|
||||
datatoc_depth_vert_glsl,
|
||||
NULL},
|
||||
.geom = (const char *[]){sh_cfg->lib,
|
||||
datatoc_common_view_lib_glsl,
|
||||
datatoc_conservative_depth_geom_glsl,
|
||||
NULL},
|
||||
.frag = (const char *[]){datatoc_depth_frag_glsl, NULL},
|
||||
.defs = (const char *[]){sh_cfg->def,
|
||||
"#define CONSERVATIVE_RASTER\n",
|
||||
"#define POINTCLOUD\n",
|
||||
"#define INSTANCED_ATTR\n",
|
||||
"#define UNIFORM_RESOURCE_ID\n",
|
||||
NULL},
|
||||
});
|
||||
}
|
||||
|
||||
GPUShader *BASIC_shaders_depth_sh_get(eGPUShaderConfig config)
|
||||
{
|
||||
BASIC_Shaders *sh_data = &e_data.sh_data[config];
|
||||
const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[config];
|
||||
if (sh_data->depth == NULL) {
|
||||
sh_data->depth = BASIC_shader_create_depth_sh(sh_cfg);
|
||||
sh_data->depth = GPU_shader_create_from_info_name(
|
||||
config == GPU_SHADER_CFG_CLIPPED ? "basic_depth_mesh_clipped" : "basic_depth_mesh");
|
||||
}
|
||||
return sh_data->depth;
|
||||
}
|
||||
|
@ -113,9 +45,10 @@ GPUShader *BASIC_shaders_depth_sh_get(eGPUShaderConfig config)
|
|||
GPUShader *BASIC_shaders_pointcloud_depth_sh_get(eGPUShaderConfig config)
|
||||
{
|
||||
BASIC_Shaders *sh_data = &e_data.sh_data[config];
|
||||
const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[config];
|
||||
if (sh_data->pointcloud_depth == NULL) {
|
||||
sh_data->pointcloud_depth = BASIC_shader_create_pointcloud_depth_sh(sh_cfg);
|
||||
sh_data->pointcloud_depth = GPU_shader_create_from_info_name(
|
||||
config == GPU_SHADER_CFG_CLIPPED ? "basic_depth_pointcloud_clipped" :
|
||||
"basic_depth_pointcloud");
|
||||
}
|
||||
return sh_data->pointcloud_depth;
|
||||
}
|
||||
|
@ -123,9 +56,10 @@ GPUShader *BASIC_shaders_pointcloud_depth_sh_get(eGPUShaderConfig config)
|
|||
GPUShader *BASIC_shaders_depth_conservative_sh_get(eGPUShaderConfig config)
|
||||
{
|
||||
BASIC_Shaders *sh_data = &e_data.sh_data[config];
|
||||
const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[config];
|
||||
if (sh_data->depth_conservative == NULL) {
|
||||
sh_data->depth_conservative = BASIC_shader_create_depth_conservative_sh(sh_cfg);
|
||||
sh_data->depth_conservative = GPU_shader_create_from_info_name(
|
||||
config == GPU_SHADER_CFG_CLIPPED ? "basic_depth_mesh_conservative_clipped" :
|
||||
"basic_depth_mesh_conservative");
|
||||
}
|
||||
return sh_data->depth_conservative;
|
||||
}
|
||||
|
@ -133,10 +67,10 @@ GPUShader *BASIC_shaders_depth_conservative_sh_get(eGPUShaderConfig config)
|
|||
GPUShader *BASIC_shaders_pointcloud_depth_conservative_sh_get(eGPUShaderConfig config)
|
||||
{
|
||||
BASIC_Shaders *sh_data = &e_data.sh_data[config];
|
||||
const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[config];
|
||||
if (sh_data->pointcloud_depth_conservative == NULL) {
|
||||
sh_data->pointcloud_depth_conservative = BASIC_shader_create_pointcloud_depth_conservative_sh(
|
||||
sh_cfg);
|
||||
sh_data->pointcloud_depth_conservative = GPU_shader_create_from_info_name(
|
||||
config == GPU_SHADER_CFG_CLIPPED ? "basic_depth_pointcloud_conservative_clipped" :
|
||||
"basic_depth_pointcloud_conservative");
|
||||
}
|
||||
return sh_data->pointcloud_depth_conservative;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
#pragma BLENDER_REQUIRE(common_view_clipping_lib.glsl)
|
||||
#pragma BLENDER_REQUIRE(common_view_lib.glsl)
|
||||
|
||||
/* Adaptation of Conservative Rasterization
|
||||
* from GPU Gems 2
|
||||
|
@ -7,14 +9,6 @@
|
|||
* avoids triangles producing no fragments.
|
||||
*/
|
||||
|
||||
layout(triangles) in;
|
||||
layout(triangle_strip, max_vertices = 3) out;
|
||||
|
||||
RESOURCE_ID_VARYING
|
||||
|
||||
uniform vec2 sizeViewport;
|
||||
uniform vec2 sizeViewportInv;
|
||||
|
||||
void main()
|
||||
{
|
||||
/* Compute plane normal in ndc space. */
|
||||
|
@ -25,7 +19,7 @@ void main()
|
|||
/* Compute NDC bound box. */
|
||||
vec4 bbox = vec4(min(min(pos0.xy, pos1.xy), pos2.xy), max(max(pos0.xy, pos1.xy), pos2.xy));
|
||||
/* Convert to pixel space. */
|
||||
bbox = (bbox * 0.5 + 0.5) * sizeViewport.xyxy;
|
||||
bbox = (bbox * 0.5 + 0.5) * drw_view.viewport_size.xyxy;
|
||||
/* Detect failure cases where triangles would produce no fragments. */
|
||||
bvec2 is_subpixel = lessThan(bbox.zw - bbox.xy, vec2(1.0));
|
||||
/* View aligned triangle. */
|
||||
|
@ -37,22 +31,20 @@ void main()
|
|||
if (all(is_subpixel)) {
|
||||
vec2 ofs = (i == 0) ? vec2(-1.0) : ((i == 1) ? vec2(2.0, -1.0) : vec2(-1.0, 2.0));
|
||||
/* HACK: Fix cases where the triangle is too small make it cover at least one pixel. */
|
||||
gl_Position.xy += sizeViewportInv.xy * gl_Position.w * ofs;
|
||||
gl_Position.xy += drw_view.viewport_size_inverse * gl_Position.w * ofs;
|
||||
}
|
||||
/* Test if the triangle is almost parralele with the view to avoid precision issues. */
|
||||
else if (any(is_subpixel) || is_coplanar) {
|
||||
/* HACK: Fix cases where the triangle is Parallel to the view by deforming it slightly. */
|
||||
vec2 ofs = (i == 0) ? vec2(-1.0) : ((i == 1) ? vec2(1.0, -1.0) : vec2(1.0));
|
||||
gl_Position.xy += sizeViewportInv.xy * gl_Position.w * ofs;
|
||||
gl_Position.xy += drw_view.viewport_size_inverse * gl_Position.w * ofs;
|
||||
}
|
||||
else {
|
||||
/* Triangle expansion should happen here, but we decide to not implement it for
|
||||
* depth precision & performance reasons. */
|
||||
}
|
||||
|
||||
#ifdef USE_WORLD_CLIP_PLANES
|
||||
world_clip_planes_set_clip_distance(gl_in[i].gl_ClipDistance);
|
||||
#endif
|
||||
view_clipping_distances_set(gl_in[i]);
|
||||
EmitVertex();
|
||||
}
|
||||
EndPrimitive();
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
|
||||
#pragma BLENDER_REQUIRE(common_view_clipping_lib.glsl)
|
||||
#pragma BLENDER_REQUIRE(common_view_lib.glsl)
|
||||
#pragma BLENDER_REQUIRE(common_pointcloud_lib.glsl)
|
||||
|
||||
void main()
|
||||
{
|
||||
GPU_INTEL_VERTEX_SHADER_WORKAROUND
|
||||
|
||||
vec3 world_pos = pointcloud_get_pos();
|
||||
|
||||
gl_Position = point_world_to_ndc(world_pos);
|
||||
|
||||
view_clipping_distances(world_pos);
|
||||
}
|
|
@ -1,28 +1,14 @@
|
|||
|
||||
#ifdef CONSERVATIVE_RASTER
|
||||
RESOURCE_ID_VARYING
|
||||
#endif
|
||||
|
||||
#ifndef POINTCLOUD
|
||||
in vec3 pos;
|
||||
#endif
|
||||
#pragma BLENDER_REQUIRE(common_view_clipping_lib.glsl)
|
||||
#pragma BLENDER_REQUIRE(common_view_lib.glsl)
|
||||
|
||||
void main()
|
||||
{
|
||||
GPU_INTEL_VERTEX_SHADER_WORKAROUND
|
||||
#ifdef CONSERVATIVE_RASTER
|
||||
PASS_RESOURCE_ID
|
||||
#endif
|
||||
|
||||
#ifdef POINTCLOUD
|
||||
vec3 world_pos = pointcloud_get_pos();
|
||||
#else
|
||||
vec3 world_pos = point_object_to_world(pos);
|
||||
#endif
|
||||
|
||||
gl_Position = point_world_to_ndc(world_pos);
|
||||
|
||||
#ifdef USE_WORLD_CLIP_PLANES
|
||||
world_clip_planes_calc_clip_distance(world_pos);
|
||||
#endif
|
||||
view_clipping_distances(world_pos);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,61 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
|
||||
#include "gpu_shader_create_info.hh"
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Conservative Rasterization
|
||||
*
|
||||
* Allow selection of sub-pixel objects.
|
||||
* \{ */
|
||||
|
||||
GPU_SHADER_CREATE_INFO(basic_conservative)
|
||||
.geometry_layout(PrimitiveIn::TRIANGLES, PrimitiveOut::TRIANGLE_STRIP, 3)
|
||||
.geometry_source("conservative_depth_geom.glsl");
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Object types
|
||||
* \{ */
|
||||
|
||||
GPU_SHADER_CREATE_INFO(basic_mesh)
|
||||
.vertex_in(0, Type::VEC3, "pos")
|
||||
.vertex_source("depth_vert.glsl")
|
||||
.additional_info("draw_mesh");
|
||||
|
||||
GPU_SHADER_CREATE_INFO(basic_pointcloud)
|
||||
.vertex_source("depth_pointcloud_vert.glsl")
|
||||
.additional_info("draw_pointcloud");
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Variations Declaration
|
||||
* \{ */
|
||||
|
||||
#define BASIC_FINAL_VARIATION(name, ...) \
|
||||
GPU_SHADER_CREATE_INFO(name).additional_info(__VA_ARGS__).do_static_compilation(true);
|
||||
|
||||
#define BASIC_CLIPPING_VARIATIONS(prefix, ...) \
|
||||
BASIC_FINAL_VARIATION(prefix##_clipped, "drw_clipped", __VA_ARGS__) \
|
||||
BASIC_FINAL_VARIATION(prefix, __VA_ARGS__)
|
||||
|
||||
#define BASIC_CONSERVATIVE_VARIATIONS(prefix, ...) \
|
||||
BASIC_CLIPPING_VARIATIONS(prefix##_conservative, "basic_conservative", __VA_ARGS__) \
|
||||
BASIC_CLIPPING_VARIATIONS(prefix, __VA_ARGS__)
|
||||
|
||||
#define BASIC_OBTYPE_VARIATIONS(prefix, ...) \
|
||||
BASIC_CONSERVATIVE_VARIATIONS(prefix##_mesh, "basic_mesh", __VA_ARGS__) \
|
||||
BASIC_CONSERVATIVE_VARIATIONS(prefix##_pointcloud, "basic_pointcloud", __VA_ARGS__)
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Depth shader types.
|
||||
* \{ */
|
||||
|
||||
GPU_SHADER_CREATE_INFO(basic_depth).fragment_source("depth_frag.glsl");
|
||||
|
||||
BASIC_OBTYPE_VARIATIONS(basic_depth, "basic_depth");
|
||||
|
||||
/** \} */
|
|
@ -441,6 +441,7 @@ list(APPEND SRC ${glsl_source_list_file})
|
|||
list(APPEND INC ${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
||||
set(SRC_SHADER_CREATE_INFOS
|
||||
../draw/engines/basic/shaders/infos/basic_depth_info.hh
|
||||
../draw/engines/gpencil/shaders/infos/gpencil_info.hh
|
||||
../draw/engines/gpencil/shaders/infos/gpencil_vfx_info.hh
|
||||
../draw/engines/overlay/shaders/infos/antialiasing_info.hh
|
||||
|
|
Loading…
Reference in New Issue