WIP: Refactor: Seperate Grease Pencil render engines #118050

Closed
Falk David wants to merge 4 commits from filedescriptor/blender:refactor-gp-engines into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
36 changed files with 1024 additions and 156 deletions

View File

@ -181,12 +181,12 @@ set(SRC
engines/gpencil/gpencil_antialiasing.cc
engines/gpencil/gpencil_cache_utils.cc
engines/gpencil/gpencil_draw_data.cc
engines/gpencil/gpencil_engine.cc
engines/gpencil/gpencil_engine_c.cc
engines/gpencil/gpencil_render.cc
engines/gpencil/gpencil_shader.cc
engines/gpencil/gpencil_shader_c.cc
engines/gpencil/gpencil_shader_fx.cc
engines/grease_pencil_v3/grease_pencil_engine.cc
engines/grease_pencil_v3/grease_pencil_shader.cc
engines/select/select_draw_utils.cc
engines/select/select_engine.cc
engines/select/select_instance.cc
@ -305,14 +305,15 @@ set(SRC
engines/eevee_next/eevee_volume.hh
engines/eevee_next/eevee_world.hh
engines/external/external_engine.h
engines/gpencil/gpencil_antialiasing.hh
engines/gpencil/gpencil_engine.h
engines/gpencil/gpencil_layer.hh
engines/gpencil/gpencil_light.hh
engines/gpencil/gpencil_material.hh
engines/gpencil/gpencil_object.hh
engines/gpencil/gpencil_shader.hh
engines/gpencil/gpencil_vfx.hh
engines/grease_pencil_v3/grease_pencil_antialiasing.hh
engines/grease_pencil_v3/grease_pencil_engine.h
engines/grease_pencil_v3/grease_pencil_layer.hh
engines/grease_pencil_v3/grease_pencil_light.hh
engines/grease_pencil_v3/grease_pencil_material.hh
engines/grease_pencil_v3/grease_pencil_object.hh
engines/grease_pencil_v3/grease_pencil_shader.hh
engines/grease_pencil_v3/grease_pencil_vfx.hh
engines/image/image_batches.hh
engines/image/image_buffer_cache.hh
engines/image/image_drawing_mode.hh
@ -714,22 +715,33 @@ set(GLSL_SRC
intern/draw_shader_shared.h
engines/gpencil/shaders/gpencil_frag.glsl
engines/gpencil/shaders/grease_pencil_frag.glsl
engines/gpencil/shaders/gpencil_vert.glsl
engines/gpencil/shaders/grease_pencil_vert.glsl
engines/gpencil/shaders/gpencil_antialiasing_frag.glsl
engines/gpencil/shaders/gpencil_antialiasing_vert.glsl
engines/gpencil/shaders/gpencil_common_lib.glsl
engines/gpencil/shaders/gpencil_blend_mode.glsl
engines/gpencil/shaders/gpencil_layer_blend_frag.glsl
engines/gpencil/shaders/gpencil_mask_invert_frag.glsl
engines/gpencil/shaders/gpencil_depth_merge_frag.glsl
engines/gpencil/shaders/gpencil_depth_merge_vert.glsl
engines/gpencil/shaders/grease_pencil_depth_merge_vert.glsl
engines/gpencil/shaders/gpencil_vfx_frag.glsl
engines/gpencil/gpencil_defines.h
engines/gpencil/gpencil_shader_shared.h
engines/grease_pencil_v3/shaders/grease_pencil_antialiasing_frag.glsl
engines/grease_pencil_v3/shaders/grease_pencil_antialiasing_vert.glsl
engines/grease_pencil_v3/shaders/grease_pencil_blend_mode.glsl
engines/grease_pencil_v3/shaders/grease_pencil_depth_merge_frag.glsl
engines/grease_pencil_v3/shaders/grease_pencil_depth_merge_vert.glsl
engines/grease_pencil_v3/shaders/grease_pencil_frag.glsl
engines/grease_pencil_v3/shaders/grease_pencil_layer_blend_frag.glsl
engines/grease_pencil_v3/shaders/grease_pencil_mask_invert_frag.glsl
engines/grease_pencil_v3/shaders/grease_pencil_vert.glsl
engines/grease_pencil_v3/shaders/grease_pencil_vfx_frag.glsl
engines/grease_pencil_v3/grease_pencil_defines.hh
engines/grease_pencil_v3/grease_pencil_shader_shared.h
engines/select/shaders/select_id_vert.glsl
engines/select/shaders/select_id_frag.glsl
engines/select/shaders/select_lib.glsl

View File

@ -26,7 +26,6 @@ extern "C" {
#include "gpencil_shader_shared.h"
extern DrawEngineType draw_engine_gpencil_type;
extern DrawEngineType draw_engine_gpencil_next_type;
struct GPENCIL_Data;
struct GPENCIL_StorageList;

View File

@ -9,7 +9,7 @@
#include "gpencil_engine.h"
extern "C" char datatoc_gpencil_common_lib_glsl[];
extern "C" char datatoc_gpencil_blend_mode_glsl[];
extern "C" char datatoc_gpencil_frag_glsl[];
extern "C" char datatoc_gpencil_vert_glsl[];
extern "C" char datatoc_gpencil_antialiasing_frag_glsl[];

View File

@ -3,16 +3,11 @@
* SPDX-License-Identifier: GPL-2.0-or-later */
#ifndef GPU_SHADER
# pragma once
# include "GPU_shader_shared_utils.h"
# ifndef __cplusplus
typedef struct gpScene gpScene;
typedef struct gpMaterial gpMaterial;
typedef struct gpLight gpLight;
typedef struct gpObject gpObject;
typedef struct gpLayer gpLayer;
typedef enum gpMaterialFlag gpMaterialFlag;
# ifdef GP_LIGHT
typedef enum gpLightType gpLightType;
@ -38,8 +33,6 @@ enum gpMaterialFlag {
GP_FILL_TEXTURE_CLIP = (1u << 12u),
GP_FILL_GRADIENT_USE = (1u << 13u),
GP_FILL_GRADIENT_RADIAL = (1u << 14u),
GP_SHOW_STROKE = (1u << 15u),
GP_SHOW_FILL = (1u << 16u),
GP_FILL_FLAGS = (GP_FILL_TEXTURE_USE | GP_FILL_TEXTURE_PREMUL | GP_FILL_TEXTURE_CLIP |
GP_FILL_GRADIENT_USE | GP_FILL_GRADIENT_RADIAL | GP_FILL_HOLDOUT),
};
@ -60,12 +53,6 @@ enum gpLightType {
# define gpLightType uint
#endif
struct gpScene {
float2 render_size;
float2 _pad0;
};
BLI_STATIC_ASSERT_ALIGN(gpScene, 16)
struct gpMaterial {
float4 stroke_color;
float4 fill_color;
@ -132,37 +119,6 @@ struct gpLight {
BLI_STATIC_ASSERT_ALIGN(gpLight, 16)
#endif
struct gpObject {
/** Weather or not to apply lighting to the GPencil object. */
bool1 is_shadeless;
/** Switch between 2d and 3D stroke order. */
bool1 stroke_order3d;
/** Offset inside the layer buffer to the first layer data of this object. */
uint layer_offset;
/** Offset inside the material buffer to the first material data of this object. */
uint material_offset;
/** Color to multiply to the final mixed color. */
float4 tint;
/** Color to multiply to the final mixed color. */
float3 normal;
float _pad0;
};
BLI_STATIC_ASSERT_ALIGN(gpObject, 16)
struct gpLayer {
/** Amount of vertex color to blend with actual material color. */
float vertex_color_opacity;
/** Thickness change of all the strokes. */
float thickness_offset;
/** Thickness change of all the strokes. */
float opacity;
/** Offset to apply to stroke index to be able to insert a currently drawn stroke in between. */
float stroke_index_offset;
/** Color to multiply to the final mixed color. */
float4 tint;
};
BLI_STATIC_ASSERT_ALIGN(gpLayer, 16)
#ifndef GPU_SHADER
# undef gpMaterialFlag

View File

@ -2,7 +2,7 @@
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma BLENDER_REQUIRE(gpencil_common_lib.glsl)
#pragma BLENDER_REQUIRE(gpencil_blend_mode.glsl)
void main()
{

View File

@ -2,7 +2,7 @@
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma BLENDER_REQUIRE(gpencil_common_lib.glsl)
#pragma BLENDER_REQUIRE(gpencil_blend_mode.glsl)
float gaussian_weight(float x)
{

View File

@ -54,41 +54,6 @@ GPU_SHADER_CREATE_INFO(gpencil_geometry)
.depth_write(DepthWrite::ANY)
.additional_info("draw_gpencil");
GPU_SHADER_CREATE_INFO(gpencil_geometry_next)
.do_static_compilation(true)
.define("GP_LIGHT")
.typedef_source("gpencil_defines.h")
.sampler(GPENCIL_SCENE_DEPTH_TEX_SLOT, ImageType::DEPTH_2D, "gpSceneDepthTexture")
.sampler(GPENCIL_MASK_TEX_SLOT, ImageType::FLOAT_2D, "gpMaskTexture")
.sampler(GPENCIL_FILL_TEX_SLOT, ImageType::FLOAT_2D, "gpFillTexture")
.sampler(GPENCIL_STROKE_TEX_SLOT, ImageType::FLOAT_2D, "gpStrokeTexture")
.storage_buf(GPENCIL_OBJECT_SLOT, Qualifier::READ, "gpObject", "gp_object[]")
.storage_buf(GPENCIL_LAYER_SLOT, Qualifier::READ, "gpLayer", "gp_layer[]")
.storage_buf(GPENCIL_MATERIAL_SLOT, Qualifier::READ, "gpMaterial", "gp_materials[]")
.storage_buf(GPENCIL_LIGHT_SLOT, Qualifier::READ, "gpLight", "gp_lights[]")
.uniform_buf(GPENCIL_SCENE_SLOT, "gpScene", "gp_scene")
/* Per Scene */
.define("viewportSize", "gp_scene.render_size")
/* Per Object */
.define("gpNormal", "gp_object[resource_id].normal")
.define("gpStrokeOrder3d", "gp_object[resource_id].stroke_order3d")
.define("gpMaterialOffset", "gp_object[resource_id].material_offset")
/* Per Layer */
.define("layer_id", "gp_object[resource_id].layer_offset") /* TODO */
.define("gpVertexColorOpacity", "gp_layer[layer_id].vertex_color_opacity")
.define("gpLayerTint", "gp_layer[layer_id].tint")
.define("gpLayerOpacity", "gp_layer[layer_id].opacity")
.define("gpStrokeIndexOffset", "gp_layer[layer_id].stroke_index_offset")
.fragment_out(0, Type::VEC4, "fragColor")
.fragment_out(1, Type::VEC4, "revealColor")
.vertex_out(gpencil_geometry_iface)
.vertex_out(gpencil_geometry_flat_iface)
.vertex_out(gpencil_geometry_noperspective_iface)
.vertex_source("grease_pencil_vert.glsl")
.fragment_source("grease_pencil_frag.glsl")
.additional_info("draw_gpencil_new")
.depth_write(DepthWrite::ANY);
/** \} */
/* -------------------------------------------------------------------- */
@ -126,16 +91,6 @@ GPU_SHADER_CREATE_INFO(gpencil_depth_merge)
.depth_write(DepthWrite::ANY)
.additional_info("draw_view");
GPU_SHADER_CREATE_INFO(grease_pencil_depth_merge)
.do_static_compilation(true)
.define("strokeOrder3d", "false")
.sampler(0, ImageType::DEPTH_2D, "depthBuf")
.vertex_in(0, Type::VEC3, "pos")
.vertex_source("grease_pencil_depth_merge_vert.glsl")
.fragment_source("gpencil_depth_merge_frag.glsl")
.depth_write(DepthWrite::ANY)
.additional_info("draw_modelmat_new", "draw_view");
/** \} */
/* -------------------------------------------------------------------- */

View File

@ -8,7 +8,6 @@
#pragma once
#include "BKE_gpencil_legacy.h"
#include "BKE_image.h"
#include "DRW_gpu_wrapper.hh"
#include "DRW_render.hh"
@ -16,7 +15,7 @@
#include "draw_manager.hh"
#include "draw_pass.hh"
#include "gpencil_shader.hh"
#include "grease_pencil_shader.hh"
#include "BLI_smaa_textures.h"

View File

@ -0,0 +1,23 @@
/* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#define GPENCIL_MATERIAL_BUFFER_LEN 256
#define GPENCIL_LIGHT_BUFFER_LEN 128
/* High bits are used to pass material ID to fragment shader. */
#define GPENCIl_MATID_SHIFT 16u
/* Textures */
#define GPENCIL_SCENE_DEPTH_TEX_SLOT 2
#define GPENCIL_MASK_TEX_SLOT 3
#define GPENCIL_FILL_TEX_SLOT 4
#define GPENCIL_STROKE_TEX_SLOT 5
/* SSBOs */
#define GPENCIL_OBJECT_SLOT 0
#define GPENCIL_LAYER_SLOT 1
#define GPENCIL_MATERIAL_SLOT 2
#define GPENCIL_LIGHT_SLOT 3
/* UBOs */
#define GPENCIL_SCENE_SLOT 2

View File

@ -6,10 +6,6 @@
* \ingroup draw
*/
#include "BKE_gpencil_modifier_legacy.h"
#include "BLI_listbase_wrapper.hh"
#include "DEG_depsgraph_query.hh"
#include "DNA_shader_fx_types.h"
@ -30,16 +26,15 @@
#include "draw_pass.hh"
#define GP_LIGHT
#include "gpencil_antialiasing.hh"
#include "gpencil_defines.h"
#include "gpencil_engine.h"
#include "gpencil_layer.hh"
#include "gpencil_light.hh"
#include "gpencil_material.hh"
#include "gpencil_object.hh"
#include "gpencil_shader.hh"
#include "gpencil_shader_shared.h"
#include "gpencil_vfx.hh"
#include "grease_pencil_antialiasing.hh"
#include "grease_pencil_engine.h"
#include "grease_pencil_layer.hh"
#include "grease_pencil_light.hh"
#include "grease_pencil_material.hh"
#include "grease_pencil_object.hh"
#include "grease_pencil_shader.hh"
#include "grease_pencil_shader_shared.h"
#include "grease_pencil_vfx.hh"
namespace blender::draw::greasepencil {

View File

@ -0,0 +1,25 @@
/* SPDX-FileCopyrightText: 2024 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup draw
*/
#pragma once
#include "DRW_render.hh"
#include "RE_engine.h"
#ifdef __cplusplus
extern "C" {
#endif
#include "grease_pencil_defines.hh"
#include "grease_pencil_shader_shared.h"
extern DrawEngineType draw_engine_gpencil_next_type;
#ifdef __cplusplus
}
#endif

View File

@ -15,6 +15,8 @@
#include "draw_manager.hh"
#include "draw_pass.hh"
#include "grease_pencil_shader_shared.h"
namespace blender::draw::greasepencil {
using namespace draw;

View File

@ -8,7 +8,6 @@
#pragma once
#include "BKE_gpencil_legacy.h"
#include "BKE_image.h"
#include "DRW_gpu_wrapper.hh"
#include "DRW_render.hh"

View File

@ -8,7 +8,6 @@
#pragma once
#include "BKE_gpencil_legacy.h"
#include "BKE_image.h"
#include "DRW_gpu_wrapper.hh"
#include "DRW_render.hh"

View File

@ -18,9 +18,9 @@
#include "draw_manager.hh"
#include "draw_pass.hh"
#include "gpencil_layer.hh"
#include "gpencil_material.hh"
#include "gpencil_shader.hh"
#include "grease_pencil_layer.hh"
#include "grease_pencil_material.hh"
#include "grease_pencil_shader.hh"
namespace blender::draw::greasepencil {
@ -84,13 +84,13 @@ class ObjectModule {
const bool hide_overlay = ((v3d->flag2 & V3D_HIDE_OVERLAYS) != 0);
const bool show_onion = ((v3d->gp_flag & V3D_GP_SHOW_ONION_SKIN) != 0);
use_onion_ = show_onion && !hide_overlay && !playing;
use_stroke_fill_ = GPENCIL_SIMPLIFY_FILL(scene, playing);
use_vfx_ = GPENCIL_SIMPLIFY_FX(scene, playing);
use_stroke_fill_ = true;/* GPENCIL_SIMPLIFY_FILL(scene, playing); */
use_vfx_ = playing;/* GPENCIL_SIMPLIFY_FX(scene, playing); */
is_render_ = false;
}
else {
use_stroke_fill_ = GPENCIL_SIMPLIFY_FILL(scene, false);
use_vfx_ = GPENCIL_SIMPLIFY_FX(scene, false);
use_stroke_fill_ = true;/* GPENCIL_SIMPLIFY_FILL(scene, false); */
use_vfx_ = true;/* GPENCIL_SIMPLIFY_FX(scene, false); */
}
}

View File

@ -6,7 +6,7 @@
* \ingroup draw
*/
#include "gpencil_shader.hh"
#include "grease_pencil_shader.hh"
#include <iostream>
@ -64,35 +64,35 @@ const char *ShaderModule::static_shader_create_info_name_get(eShaderType shader_
{
switch (shader_type) {
case ANTIALIASING_EDGE_DETECT:
return "gpencil_antialiasing_stage_0";
return "grease_pencil_antialiasing_stage_0";
case ANTIALIASING_BLEND_WEIGHT:
return "gpencil_antialiasing_stage_1";
return "grease_pencil_antialiasing_stage_1";
case ANTIALIASING_RESOLVE:
return "gpencil_antialiasing_stage_2";
return "grease_pencil_antialiasing_stage_2";
case GREASE_PENCIL:
return "gpencil_geometry_next";
return "grease_pencil_geometry";
case LAYER_BLEND:
return "gpencil_layer_blend";
return "grease_pencil_layer_blend";
case DEPTH_MERGE:
return "grease_pencil_depth_merge";
case MASK_INVERT:
return "gpencil_mask_invert";
return "grease_pencil_mask_invert";
case FX_COMPOSITE:
return "gpencil_fx_composite";
return "grease_pencil_fx_composite";
case FX_COLORIZE:
return "gpencil_fx_colorize";
return "grease_pencil_fx_colorize";
case FX_BLUR:
return "gpencil_fx_blur";
return "grease_pencil_fx_blur";
case FX_GLOW:
return "gpencil_fx_glow";
return "grease_pencil_fx_glow";
case FX_PIXEL:
return "gpencil_fx_pixelize";
return "grease_pencil_fx_pixelize";
case FX_RIM:
return "gpencil_fx_rim";
return "grease_pencil_fx_rim";
case FX_SHADOW:
return "gpencil_fx_shadow";
return "grease_pencil_fx_shadow";
case FX_TRANSFORM:
return "gpencil_fx_transform";
return "grease_pencil_fx_transform";
/* To avoid compiler warning about missing case. */
case MAX_SHADER_TYPE:
return "";

View File

@ -0,0 +1,174 @@
/* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#ifndef GPU_SHADER
# pragma once
# include "GPU_shader_shared_utils.h"
# ifndef __cplusplus
typedef struct gpScene gpScene;
typedef struct gpMaterial gpMaterial;
typedef struct gpLight gpLight;
typedef struct gpObject gpObject;
typedef struct gpLayer gpLayer;
typedef enum gpMaterialFlag gpMaterialFlag;
# ifdef GP_LIGHT
typedef enum gpLightType gpLightType;
# endif
# endif
namespace blender::draw::greasepencil {
#endif
enum gpMaterialFlag {
GP_FLAG_NONE = 0u,
GP_STROKE_ALIGNMENT_STROKE = 1u,
GP_STROKE_ALIGNMENT_OBJECT = 2u,
GP_STROKE_ALIGNMENT_FIXED = 3u,
GP_STROKE_ALIGNMENT = 0x3u,
GP_STROKE_OVERLAP = (1u << 2u),
GP_STROKE_TEXTURE_USE = (1u << 3u),
GP_STROKE_TEXTURE_STENCIL = (1u << 4u),
GP_STROKE_TEXTURE_PREMUL = (1u << 5u),
GP_STROKE_DOTS = (1u << 6u),
GP_STROKE_HOLDOUT = (1u << 7u),
GP_FILL_HOLDOUT = (1u << 8u),
GP_FILL_TEXTURE_USE = (1u << 10u),
GP_FILL_TEXTURE_PREMUL = (1u << 11u),
GP_FILL_TEXTURE_CLIP = (1u << 12u),
GP_FILL_GRADIENT_USE = (1u << 13u),
GP_FILL_GRADIENT_RADIAL = (1u << 14u),
GP_SHOW_STROKE = (1u << 15u),
GP_SHOW_FILL = (1u << 16u),
GP_FILL_FLAGS = (GP_FILL_TEXTURE_USE | GP_FILL_TEXTURE_PREMUL | GP_FILL_TEXTURE_CLIP |
GP_FILL_GRADIENT_USE | GP_FILL_GRADIENT_RADIAL | GP_FILL_HOLDOUT),
};
enum gpLightType {
GP_LIGHT_TYPE_POINT = 0u,
GP_LIGHT_TYPE_SPOT = 1u,
GP_LIGHT_TYPE_SUN = 2u,
GP_LIGHT_TYPE_AMBIENT = 3u,
};
#define GP_IS_STROKE_VERTEX_BIT (1 << 30)
#define GP_VERTEX_ID_SHIFT 2
/* Avoid compiler funkiness with enum types not being strongly typed in C. */
#ifndef GPU_SHADER
# define gpMaterialFlag uint
# define gpLightType uint
#endif
struct gpScene {
float2 render_size;
float2 _pad0;
};
BLI_STATIC_ASSERT_ALIGN(gpScene, 16)
struct gpMaterial {
float4 stroke_color;
float4 fill_color;
float4 fill_mix_color;
float4 fill_uv_rot_scale;
#ifndef GPU_SHADER
float2 fill_uv_offset;
float2 alignment_rot;
float stroke_texture_mix;
float stroke_u_scale;
float fill_texture_mix;
gpMaterialFlag flag;
#else
/* Some drivers are completely messing the alignment or the fetches here.
* We are forced to pack these into vec4 otherwise we only get 0.0 as value. */
/* NOTE(@fclem): This was the case on MacOS OpenGL implementation.
* This might be fixed in newer APIs. */
float4 packed1;
float4 packed2;
# define _fill_uv_offset packed1.xy
# define _alignment_rot packed1.zw
# define _stroke_texture_mix packed2.x
# define _stroke_u_scale packed2.y
# define _fill_texture_mix packed2.z
/** NOTE(@fclem): Needs floatBitsToUint(). */
# define _flag packed2.w
#endif
};
BLI_STATIC_ASSERT_ALIGN(gpMaterial, 16)
#ifdef GP_LIGHT
struct gpLight {
# ifndef GPU_SHADER
float3 color;
gpLightType type;
float3 right;
float spot_size;
float3 up;
float spot_blend;
float3 forward;
float _pad0;
float3 position;
float _pad1;
# else
/* Some drivers are completely messing the alignment or the fetches here.
* We are forced to pack these into vec4 otherwise we only get 0.0 as value. */
/* NOTE(@fclem): This was the case on MacOS OpenGL implementation.
* This might be fixed in newer APIs. */
float4 packed0;
float4 packed1;
float4 packed2;
float4 packed3;
float4 packed4;
# define _color packed0.xyz
# define _type packed0.w
# define _right packed1.xyz
# define _spot_size packed1.w
# define _up packed2.xyz
# define _spot_blend packed2.w
# define _forward packed3.xyz
# define _position packed4.xyz
# endif
};
BLI_STATIC_ASSERT_ALIGN(gpLight, 16)
#endif
struct gpObject {
/** Weather or not to apply lighting to the GPencil object. */
bool1 is_shadeless;
/** Switch between 2d and 3D stroke order. */
bool1 stroke_order3d;
/** Offset inside the layer buffer to the first layer data of this object. */
uint layer_offset;
/** Offset inside the material buffer to the first material data of this object. */
uint material_offset;
/** Color to multiply to the final mixed color. */
float4 tint;
/** Color to multiply to the final mixed color. */
float3 normal;
float _pad0;
};
BLI_STATIC_ASSERT_ALIGN(gpObject, 16)
struct gpLayer {
/** Amount of vertex color to blend with actual material color. */
float vertex_color_opacity;
/** Thickness change of all the strokes. */
float thickness_offset;
/** Thickness change of all the strokes. */
float opacity;
/** Offset to apply to stroke index to be able to insert a currently drawn stroke in between. */
float stroke_index_offset;
/** Color to multiply to the final mixed color. */
float4 tint;
};
BLI_STATIC_ASSERT_ALIGN(gpLayer, 16)
#ifndef GPU_SHADER
} // namespace blender::draw::greasepencil
# undef gpMaterialFlag
# undef gpLightType
#endif

View File

@ -8,15 +8,14 @@
#include "BKE_camera.h"
#include "BLI_listbase_wrapper.hh"
#include "DNA_camera_types.h"
#include "DNA_gpencil_legacy_types.h"
#include "DNA_shader_fx_types.h"
#include "draw_manager.hh"
#include "draw_pass.hh"
#include "gpencil_engine.h"
#include "gpencil_shader.hh"
#include "gpencil_shader_shared.h"
#include "grease_pencil_engine.h"
#include "grease_pencil_shader.hh"
#include "grease_pencil_shader_shared.h"
namespace blender::draw::greasepencil {
@ -231,9 +230,8 @@ class VfxModule {
/* TODO(fclem): Replace by this->render_size. */
const float *vp_size = DRW_viewport_size_get();
float world_pixel_scale = 1.0f / GPENCIL_PIXEL_FACTOR;
float scale = mat4_to_scale(object->object_to_world);
float distance_factor = world_pixel_scale * scale * winmat[1][1] * vp_size[1] / w;
float distance_factor = scale * winmat[1][1] * vp_size[1] / w;
blur_size *= distance_factor;
}

View File

@ -0,0 +1,47 @@
/* SPDX-FileCopyrightText: 2020-2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma BLENDER_REQUIRE(gpu_shader_smaa_lib.glsl)
void main()
{
#if SMAA_STAGE == 0
/* Detect edges in color and revealage buffer. */
out_edges = SMAALumaEdgeDetectionPS(uvs, offset, colorTex);
out_edges = max(out_edges, SMAALumaEdgeDetectionPS(uvs, offset, revealTex));
/* Discard if there is no edge. */
if (dot(out_edges, float2(1.0, 1.0)) == 0.0) {
discard;
return;
}
#elif SMAA_STAGE == 1
out_weights = SMAABlendingWeightCalculationPS(
uvs, pixcoord, offset, edgesTex, areaTex, searchTex, vec4(0));
#elif SMAA_STAGE == 2
/* Resolve both buffers. */
if (doAntiAliasing) {
out_color = SMAANeighborhoodBlendingPS(uvs, offset[0], colorTex, blendTex);
out_reveal = SMAANeighborhoodBlendingPS(uvs, offset[0], revealTex, blendTex);
}
else {
out_color = texture(colorTex, uvs);
out_reveal = texture(revealTex, uvs);
}
/* Revealage, how much light passes through. */
/* Average for alpha channel. */
out_reveal.a = clamp(dot(out_reveal.rgb, vec3(0.333334)), 0.0, 1.0);
/* Color buffer is already pre-multiplied. Just add it to the color. */
/* Add the alpha. */
out_color.a = 1.0 - out_reveal.a;
if (onlyAlpha) {
/* Special case in wire-frame X-ray mode. */
out_color = vec4(0.0);
out_reveal.rgb = out_reveal.aaa;
}
#endif
}

View File

@ -0,0 +1,22 @@
/* SPDX-FileCopyrightText: 2020-2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma BLENDER_REQUIRE(gpu_shader_smaa_lib.glsl)
void main()
{
int v = gl_VertexID % 3;
float x = -1.0 + float((v & 1) << 2);
float y = -1.0 + float((v & 2) << 1);
gl_Position = vec4(x, y, 1.0, 1.0);
uvs = (gl_Position.xy + 1.0) * 0.5;
#if SMAA_STAGE == 0
SMAAEdgeDetectionVS(uvs, offset);
#elif SMAA_STAGE == 1
SMAABlendingWeightCalculationVS(uvs, pixcoord, offset);
#elif SMAA_STAGE == 2
SMAANeighborhoodBlendingVS(uvs, offset[0]);
#endif
}

View File

@ -0,0 +1,67 @@
/* SPDX-FileCopyrightText: 2020-2022 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/* Must match eGPLayerBlendModes */
#define MODE_REGULAR 0
#define MODE_HARDLIGHT 1
#define MODE_ADD 2
#define MODE_SUB 3
#define MODE_MULTIPLY 4
#define MODE_DIVIDE 5
#define MODE_HARDLIGHT_SECOND_PASS 999
void blend_mode_output(
int blend_mode, vec4 color, float opacity, out vec4 frag_color, out vec4 frag_revealage)
{
switch (blend_mode) {
case MODE_REGULAR:
/* Reminder: Blending func is pre-multiply alpha blend
* `(dst.rgba * (1 - src.a) + src.rgb)`. */
color *= opacity;
frag_color = color;
frag_revealage = vec4(0.0, 0.0, 0.0, color.a);
break;
case MODE_MULTIPLY:
/* Reminder: Blending func is multiply blend `(dst.rgba * src.rgba)`. */
color.a *= opacity;
frag_revealage = frag_color = (1.0 - color.a) + color.a * color;
break;
case MODE_DIVIDE:
/* Reminder: Blending func is multiply blend `(dst.rgba * src.rgba)`. */
color.a *= opacity;
frag_revealage = frag_color = clamp(1.0 / max(vec4(1e-6), 1.0 - color * color.a), 0.0, 1e18);
break;
case MODE_HARDLIGHT: {
/* Reminder: Blending func is multiply blend `(dst.rgba * src.rgba)`. */
/**
* We need to separate the overlay equation into 2 term (one multiply and one add).
* This is the standard overlay equation (per channel):
* `rtn = (src < 0.5) ? (2.0 * src * dst) : (1.0 - 2.0 * (1.0 - src) * (1.0 - dst));`
* We rewrite the second branch like this:
* `rtn = 1 - 2 * (1 - src) * (1 - dst);`
* `rtn = 1 - 2 (1 - dst + src * dst - src);`
* `rtn = 1 - 2 (1 - dst * (1 - src) - src);`
* `rtn = 1 - 2 + dst * (2 - 2 * src) + 2 * src;`
* `rtn = (- 1 + 2 * src) + dst * (2 - 2 * src);`
*/
color = mix(vec4(0.5), color, color.a * opacity);
vec4 s = step(-0.5, -color);
frag_revealage = frag_color = 2.0 * s + 2.0 * color * (1.0 - s * 2.0);
frag_revealage = max(vec4(0.0), frag_revealage);
break;
}
case MODE_HARDLIGHT_SECOND_PASS:
/* Reminder: Blending func is additive blend `(dst.rgba + src.rgba)`. */
color = mix(vec4(0.5), color, color.a * opacity);
frag_revealage = frag_color = (-1.0 + 2.0 * color) * step(-0.5, -color);
frag_revealage = max(vec4(0.0), frag_revealage);
break;
case MODE_SUB:
case MODE_ADD:
/* Reminder: Blending func is additive / subtractive blend `(dst.rgba +/- src.rgba)`. */
frag_color = color * color.a * opacity;
frag_revealage = vec4(0.0);
break;
}
}

View File

@ -0,0 +1,14 @@
/* SPDX-FileCopyrightText: 2020-2022 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
void main()
{
float depth = textureLod(depthBuf, gl_FragCoord.xy / vec2(textureSize(depthBuf, 0)), 0).r;
if (strokeOrder3d) {
gl_FragDepth = depth;
}
else {
gl_FragDepth = (depth != 0.0) ? gl_FragCoord.z : 1.0;
}
}

View File

@ -0,0 +1,23 @@
/* SPDX-FileCopyrightText: 2020-2022 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma BLENDER_REQUIRE(gpencil_blend_mode.glsl)
void main()
{
vec4 color;
/* Remember, this is associated alpha (aka. pre-multiply). */
color.rgb = textureLod(colorBuf, uvcoordsvar.xy, 0).rgb;
/* Stroke only render mono-chromatic revealage. We convert to alpha. */
color.a = 1.0 - textureLod(revealBuf, uvcoordsvar.xy, 0).r;
float mask = textureLod(maskBuf, uvcoordsvar.xy, 0).r;
mask *= blendOpacity;
fragColor = vec4(1.0, 0.0, 1.0, 1.0);
fragRevealage = vec4(1.0, 0.0, 1.0, 1.0);
blend_mode_output(blendMode, color, mask, fragColor, fragRevealage);
}

View File

@ -0,0 +1,9 @@
/* SPDX-FileCopyrightText: 2020-2022 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
void main()
{
/* Blend mode does the inversion. */
fragRevealage = fragColor = vec4(1.0);
}

View File

@ -0,0 +1,299 @@
/* SPDX-FileCopyrightText: 2020-2022 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma BLENDER_REQUIRE(gpencil_blend_mode.glsl)
float gaussian_weight(float x)
{
return exp(-x * x / (2.0 * 0.35 * 0.35));
}
#if defined(COMPOSITE)
void main()
{
if (isFirstPass) {
/* Blend mode is multiply. */
fragColor.rgb = fragRevealage.rgb = texture(revealBuf, uvcoordsvar.xy).rgb;
fragColor.a = fragRevealage.a = 1.0;
}
else {
/* Blend mode is additive. */
fragRevealage = vec4(0.0);
fragColor.rgb = texture(colorBuf, uvcoordsvar.xy).rgb;
fragColor.a = 0.0;
}
}
#elif defined(COLORIZE)
const mat3 sepia_mat = mat3(
vec3(0.393, 0.349, 0.272), vec3(0.769, 0.686, 0.534), vec3(0.189, 0.168, 0.131));
# define MODE_GRAYSCALE 0
# define MODE_SEPIA 1
# define MODE_DUOTONE 2
# define MODE_CUSTOM 3
# define MODE_TRANSPARENT 4
void main()
{
fragColor = texture(colorBuf, uvcoordsvar.xy);
fragRevealage = texture(revealBuf, uvcoordsvar.xy);
float luma = dot(fragColor.rgb, vec3(0.2126, 0.7152, 0.723));
/* No blending. */
switch (mode) {
case MODE_GRAYSCALE:
fragColor.rgb = mix(fragColor.rgb, vec3(luma), factor);
break;
case MODE_SEPIA:
fragColor.rgb = mix(fragColor.rgb, sepia_mat * fragColor.rgb, factor);
break;
case MODE_DUOTONE:
fragColor.rgb = luma * ((luma <= factor) ? lowColor : highColor);
break;
case MODE_CUSTOM:
fragColor.rgb = mix(fragColor.rgb, luma * lowColor, factor);
break;
case MODE_TRANSPARENT:
default:
fragColor.rgb *= factor;
fragRevealage.rgb = mix(vec3(1.0), fragRevealage.rgb, factor);
break;
}
}
#elif defined(BLUR)
void main()
{
vec2 pixel_size = 1.0 / vec2(textureSize(revealBuf, 0).xy);
vec2 ofs = offset * pixel_size;
fragColor = vec4(0.0);
fragRevealage = vec4(0.0);
/* No blending. */
float weight_accum = 0.0;
for (int i = -sampCount; i <= sampCount; i++) {
float x = float(i) / float(sampCount);
float weight = gaussian_weight(x);
weight_accum += weight;
vec2 uv = uvcoordsvar.xy + ofs * x;
fragColor.rgb += texture(colorBuf, uv).rgb * weight;
fragRevealage.rgb += texture(revealBuf, uv).rgb * weight;
}
fragColor /= weight_accum;
fragRevealage /= weight_accum;
}
#elif defined(TRANSFORM)
void main()
{
vec2 uv = (uvcoordsvar.xy - 0.5) * axisFlip + 0.5;
/* Wave deform. */
float wave_time = dot(uv, waveDir.xy);
uv += sin(wave_time + wavePhase) * waveOffset;
/* Swirl deform. */
if (swirlRadius > 0.0) {
vec2 tex_size = vec2(textureSize(colorBuf, 0).xy);
vec2 pix_coord = uv * tex_size - swirlCenter;
float dist = length(pix_coord);
float percent = clamp((swirlRadius - dist) / swirlRadius, 0.0, 1.0);
float theta = percent * percent * swirlAngle;
float s = sin(theta);
float c = cos(theta);
mat2 rot = mat2(vec2(c, -s), vec2(s, c));
uv = (rot * pix_coord + swirlCenter) / tex_size;
}
fragColor = texture(colorBuf, uv);
fragRevealage = texture(revealBuf, uv);
}
#elif defined(GLOW)
void main()
{
vec2 pixel_size = 1.0 / vec2(textureSize(revealBuf, 0).xy);
vec2 ofs = offset * pixel_size;
fragColor = vec4(0.0);
fragRevealage = vec4(0.0);
float weight_accum = 0.0;
for (int i = -sampCount; i <= sampCount; i++) {
float x = float(i) / float(sampCount);
float weight = gaussian_weight(x);
weight_accum += weight;
vec2 uv = uvcoordsvar.xy + ofs * x;
vec3 col = texture(colorBuf, uv).rgb;
vec3 rev = texture(revealBuf, uv).rgb;
if (threshold.x > -1.0) {
if (threshold.y > -1.0) {
if (any(greaterThan(abs(col - vec3(threshold)), vec3(threshold.w)))) {
weight = 0.0;
}
}
else {
if (dot(col, vec3(1.0 / 3.0)) < threshold.x) {
weight = 0.0;
}
}
}
fragColor.rgb += col * weight;
fragRevealage.rgb += (1.0 - rev) * weight;
}
if (weight_accum > 0.0) {
fragColor *= glowColor.rgbb / weight_accum;
fragRevealage = fragRevealage / weight_accum;
}
fragRevealage = 1.0 - fragRevealage;
if (glowUnder) {
if (firstPass) {
/* In first pass we copy the revealage buffer in the alpha channel.
* This let us do the alpha under in second pass. */
vec3 original_revealage = texture(revealBuf, uvcoordsvar.xy).rgb;
fragRevealage.a = clamp(dot(original_revealage.rgb, vec3(0.333334)), 0.0, 1.0);
}
else {
/* Recover original revealage. */
fragRevealage.a = texture(revealBuf, uvcoordsvar.xy).a;
}
}
if (!firstPass) {
fragColor.a = clamp(1.0 - dot(fragRevealage.rgb, vec3(0.333334)), 0.0, 1.0);
fragRevealage.a *= glowColor.a;
blend_mode_output(blendMode, fragColor, fragRevealage.a, fragColor, fragRevealage);
}
}
#elif defined(RIM)
void main()
{
/* Blur revealage buffer. */
fragRevealage = vec4(0.0);
float weight_accum = 0.0;
for (int i = -sampCount; i <= sampCount; i++) {
float x = float(i) / float(sampCount);
float weight = gaussian_weight(x);
weight_accum += weight;
vec2 uv = uvcoordsvar.xy + blurDir * x + uvOffset;
vec3 col = texture(revealBuf, uv).rgb;
if (any(not(equal(vec2(0.0), floor(uv))))) {
col = vec3(0.0);
}
fragRevealage.rgb += col * weight;
}
fragRevealage /= weight_accum;
if (isFirstPass) {
/* In first pass we copy the reveal buffer. This let us do alpha masking in second pass. */
fragColor = texture(revealBuf, uvcoordsvar.xy);
/* Also add the masked color to the reveal buffer. */
vec3 col = texture(colorBuf, uvcoordsvar.xy).rgb;
if (all(lessThan(abs(col - maskColor), vec3(0.05)))) {
fragColor = vec4(1.0);
}
}
else {
/* Pre-multiply by foreground alpha (alpha mask). */
float mask = 1.0 - clamp(dot(vec3(0.333334), texture(colorBuf, uvcoordsvar.xy).rgb), 0.0, 1.0);
/* fragRevealage is blurred shadow. */
float rim = clamp(dot(vec3(0.333334), fragRevealage.rgb), 0.0, 1.0);
vec4 color = vec4(rimColor, 1.0);
blend_mode_output(blendMode, color, rim * mask, fragColor, fragRevealage);
}
}
#elif defined(SHADOW)
vec2 compute_uvs(float x)
{
vec2 uv = uvcoordsvar.xy;
/* Transform UV (loc, rot, scale) */
uv = uv.x * uvRotX + uv.y * uvRotY + uvOffset;
uv += blurDir * x;
/* Wave deform. */
float wave_time = dot(uv, waveDir.xy);
uv += sin(wave_time + wavePhase) * waveOffset;
return uv;
}
void main()
{
/* Blur revealage buffer. */
fragRevealage = vec4(0.0);
float weight_accum = 0.0;
for (int i = -sampCount; i <= sampCount; i++) {
float x = float(i) / float(sampCount);
float weight = gaussian_weight(x);
weight_accum += weight;
vec2 uv = compute_uvs(x);
vec3 col = texture(revealBuf, uv).rgb;
if (any(not(equal(vec2(0.0), floor(uv))))) {
col = vec3(1.0);
}
fragRevealage.rgb += col * weight;
}
fragRevealage /= weight_accum;
/* No blending in first pass, alpha over pre-multiply in second pass. */
if (isFirstPass) {
/* In first pass we copy the reveal buffer. This let us do alpha under in second pass. */
fragColor = texture(revealBuf, uvcoordsvar.xy);
}
else {
/* fragRevealage is blurred shadow. */
float shadow_fac = 1.0 - clamp(dot(vec3(0.333334), fragRevealage.rgb), 0.0, 1.0);
/* Pre-multiply by foreground revealage (alpha under). */
vec3 original_revealage = texture(colorBuf, uvcoordsvar.xy).rgb;
shadow_fac *= clamp(dot(vec3(0.333334), original_revealage), 0.0, 1.0);
/* Modulate by opacity */
shadow_fac *= shadowColor.a;
/* Apply shadow color. */
fragColor.rgb = mix(vec3(0.0), shadowColor.rgb, shadow_fac);
/* Alpha over (mask behind the shadow). */
fragColor.a = shadow_fac;
fragRevealage.rgb = original_revealage * (1.0 - shadow_fac);
/* Replace the whole revealage buffer. */
fragRevealage.a = 1.0;
}
}
#elif defined(PIXELIZE)
void main()
{
vec2 pixel = floor((uvcoordsvar.xy - targetPixelOffset) / targetPixelSize);
vec2 uv = (pixel + 0.5) * targetPixelSize + targetPixelOffset;
fragColor = vec4(0.0);
fragRevealage = vec4(0.0);
for (int i = -sampCount; i <= sampCount; i++) {
float x = float(i) / float(sampCount + 1);
vec2 uv_ofs = uv + accumOffset * 0.5 * x;
fragColor += texture(colorBuf, uv_ofs);
fragRevealage += texture(revealBuf, uv_ofs);
}
fragColor /= float(sampCount) * 2.0 + 1.0;
fragRevealage /= float(sampCount) * 2.0 + 1.0;
}
#endif

View File

@ -0,0 +1,152 @@
/* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#include "gpu_shader_create_info.hh"
/* -------------------------------------------------------------------- */
/** \name Grease Pencil Object rendering
* \{ */
GPU_SHADER_INTERFACE_INFO(grease_pencil_geometry_iface, "gp_interp")
.smooth(Type::VEC4, "color_mul")
.smooth(Type::VEC4, "color_add")
.smooth(Type::VEC3, "pos")
.smooth(Type::VEC2, "uv");
GPU_SHADER_INTERFACE_INFO(grease_pencil_geometry_flat_iface, "gp_interp_flat")
.flat(Type::VEC2, "aspect")
.flat(Type::VEC4, "sspos")
.flat(Type::UINT, "mat_flag")
.flat(Type::FLOAT, "depth");
GPU_SHADER_INTERFACE_INFO(grease_pencil_geometry_noperspective_iface, "gp_interp_noperspective")
.no_perspective(Type::VEC2, "thickness")
.no_perspective(Type::FLOAT, "hardness");
GPU_SHADER_CREATE_INFO(grease_pencil_geometry)
.do_static_compilation(true)
.define("GP_LIGHT")
.typedef_source("grease_pencil_defines.hh")
.sampler(GPENCIL_SCENE_DEPTH_TEX_SLOT, ImageType::DEPTH_2D, "gpSceneDepthTexture")
.sampler(GPENCIL_MASK_TEX_SLOT, ImageType::FLOAT_2D, "gpMaskTexture")
.sampler(GPENCIL_FILL_TEX_SLOT, ImageType::FLOAT_2D, "gpFillTexture")
.sampler(GPENCIL_STROKE_TEX_SLOT, ImageType::FLOAT_2D, "gpStrokeTexture")
.storage_buf(GPENCIL_OBJECT_SLOT, Qualifier::READ, "gpObject", "gp_object[]")
.storage_buf(GPENCIL_LAYER_SLOT, Qualifier::READ, "gpLayer", "gp_layer[]")
.storage_buf(GPENCIL_MATERIAL_SLOT, Qualifier::READ, "gpMaterial", "gp_materials[]")
.storage_buf(GPENCIL_LIGHT_SLOT, Qualifier::READ, "gpLight", "gp_lights[]")
.uniform_buf(GPENCIL_SCENE_SLOT, "gpScene", "gp_scene")
/* Per Scene */
.define("viewportSize", "gp_scene.render_size")
/* Per Object */
.define("gpNormal", "gp_object[resource_id].normal")
.define("gpStrokeOrder3d", "gp_object[resource_id].stroke_order3d")
.define("gpMaterialOffset", "gp_object[resource_id].material_offset")
/* Per Layer */
.define("layer_id", "gp_object[resource_id].layer_offset") /* TODO */
.define("gpVertexColorOpacity", "gp_layer[layer_id].vertex_color_opacity")
.define("gpLayerTint", "gp_layer[layer_id].tint")
.define("gpLayerOpacity", "gp_layer[layer_id].opacity")
.define("gpStrokeIndexOffset", "gp_layer[layer_id].stroke_index_offset")
.fragment_out(0, Type::VEC4, "fragColor")
.fragment_out(1, Type::VEC4, "revealColor")
.vertex_out(grease_pencil_geometry_iface)
.vertex_out(grease_pencil_geometry_flat_iface)
.vertex_out(grease_pencil_geometry_noperspective_iface)
.vertex_source("grease_pencil_vert.glsl")
.fragment_source("grease_pencil_frag.glsl")
.additional_info("draw_grease_pencil")
.depth_write(DepthWrite::ANY);
/** \} */
/* -------------------------------------------------------------------- */
/** \name Full-Screen Shaders
* \{ */
GPU_SHADER_CREATE_INFO(grease_pencil_layer_blend)
.do_static_compilation(true)
.sampler(0, ImageType::FLOAT_2D, "colorBuf")
.sampler(1, ImageType::FLOAT_2D, "revealBuf")
.sampler(2, ImageType::FLOAT_2D, "maskBuf")
.push_constant(Type::INT, "blendMode")
.push_constant(Type::FLOAT, "blendOpacity")
/* Reminder: This is considered SRC color in blend equations.
* Same operation on all buffers. */
.fragment_out(0, Type::VEC4, "fragColor")
.fragment_out(1, Type::VEC4, "fragRevealage")
.fragment_source("grease_pencil_layer_blend_frag.glsl")
.additional_info("draw_fullscreen");
GPU_SHADER_CREATE_INFO(grease_pencil_mask_invert)
.do_static_compilation(true)
.fragment_out(0, Type::VEC4, "fragColor")
.fragment_out(1, Type::VEC4, "fragRevealage")
.fragment_source("grease_pencil_mask_invert_frag.glsl")
.additional_info("draw_fullscreen");
GPU_SHADER_CREATE_INFO(grease_pencil_depth_merge)
.do_static_compilation(true)
.define("strokeOrder3d", "false")
.sampler(0, ImageType::DEPTH_2D, "depthBuf")
.vertex_in(0, Type::VEC3, "pos")
.vertex_source("grease_pencil_depth_merge_vert.glsl")
.fragment_source("grease_pencil_depth_merge_frag.glsl")
.depth_write(DepthWrite::ANY)
.additional_info("draw_modelmat_new", "draw_view");
/** \} */
/* -------------------------------------------------------------------- */
/** \name Anti-Aliasing
* \{ */
GPU_SHADER_INTERFACE_INFO(grease_pencil_antialiasing_iface, "")
.smooth(Type::VEC2, "uvs")
.smooth(Type::VEC2, "pixcoord")
.smooth(Type::VEC4, "offset[3]");
GPU_SHADER_CREATE_INFO(grease_pencil_antialiasing)
.define("SMAA_GLSL_3")
.define("SMAA_RT_METRICS", "viewportMetrics")
.define("SMAA_PRESET_HIGH")
.define("SMAA_LUMA_WEIGHT", "float4(lumaWeight, lumaWeight, lumaWeight, 0.0)")
.define("SMAA_NO_DISCARD")
.vertex_out(grease_pencil_antialiasing_iface)
.push_constant(Type::VEC4, "viewportMetrics")
.push_constant(Type::FLOAT, "lumaWeight")
.vertex_source("grease_pencil_antialiasing_vert.glsl")
.fragment_source("grease_pencil_antialiasing_frag.glsl");
GPU_SHADER_CREATE_INFO(grease_pencil_antialiasing_stage_0)
.define("SMAA_STAGE", "0")
.sampler(0, ImageType::FLOAT_2D, "colorTex")
.sampler(1, ImageType::FLOAT_2D, "revealTex")
.fragment_out(0, Type::VEC2, "out_edges")
.additional_info("grease_pencil_antialiasing")
.do_static_compilation(true);
GPU_SHADER_CREATE_INFO(grease_pencil_antialiasing_stage_1)
.define("SMAA_STAGE", "1")
.sampler(0, ImageType::FLOAT_2D, "edgesTex")
.sampler(1, ImageType::FLOAT_2D, "areaTex")
.sampler(2, ImageType::FLOAT_2D, "searchTex")
.fragment_out(0, Type::VEC4, "out_weights")
.additional_info("grease_pencil_antialiasing")
.do_static_compilation(true);
GPU_SHADER_CREATE_INFO(grease_pencil_antialiasing_stage_2)
.define("SMAA_STAGE", "2")
.sampler(0, ImageType::FLOAT_2D, "colorTex")
.sampler(1, ImageType::FLOAT_2D, "revealTex")
.sampler(2, ImageType::FLOAT_2D, "blendTex")
.push_constant(Type::FLOAT, "mixFactor")
.push_constant(Type::FLOAT, "taaAccumulatedWeight")
.push_constant(Type::BOOL, "doAntiAliasing")
.push_constant(Type::BOOL, "onlyAlpha")
/* Reminder: Blending func is `fragRevealage * DST + fragColor`. */
.fragment_out(0, Type::VEC4, "out_color", DualBlend::SRC_0)
.fragment_out(0, Type::VEC4, "out_reveal", DualBlend::SRC_1)
.additional_info("grease_pencil_antialiasing")
.do_static_compilation(true);
/** \} */

View File

@ -0,0 +1,96 @@
/* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#include "gpu_shader_create_info.hh"
GPU_SHADER_CREATE_INFO(grease_pencil_fx_common)
.sampler(0, ImageType::FLOAT_2D, "colorBuf")
.sampler(1, ImageType::FLOAT_2D, "revealBuf")
/* Reminder: This is considered SRC color in blend equations.
* Same operation on all buffers. */
.fragment_out(0, Type::VEC4, "fragColor")
.fragment_out(1, Type::VEC4, "fragRevealage")
.fragment_source("grease_pencil_vfx_frag.glsl");
GPU_SHADER_CREATE_INFO(grease_pencil_fx_composite)
.do_static_compilation(true)
.define("COMPOSITE")
.push_constant(Type::BOOL, "isFirstPass")
.additional_info("grease_pencil_fx_common", "draw_fullscreen");
GPU_SHADER_CREATE_INFO(grease_pencil_fx_colorize)
.do_static_compilation(true)
.define("COLORIZE")
.push_constant(Type::VEC3, "lowColor")
.push_constant(Type::VEC3, "highColor")
.push_constant(Type::FLOAT, "factor")
.push_constant(Type::INT, "mode")
.additional_info("grease_pencil_fx_common", "draw_fullscreen");
GPU_SHADER_CREATE_INFO(grease_pencil_fx_blur)
.do_static_compilation(true)
.define("BLUR")
.push_constant(Type::VEC2, "offset")
.push_constant(Type::INT, "sampCount")
.additional_info("grease_pencil_fx_common", "draw_fullscreen");
GPU_SHADER_CREATE_INFO(grease_pencil_fx_transform)
.do_static_compilation(true)
.define("TRANSFORM")
.push_constant(Type::VEC2, "axisFlip")
.push_constant(Type::VEC2, "waveDir")
.push_constant(Type::VEC2, "waveOffset")
.push_constant(Type::FLOAT, "wavePhase")
.push_constant(Type::VEC2, "swirlCenter")
.push_constant(Type::FLOAT, "swirlAngle")
.push_constant(Type::FLOAT, "swirlRadius")
.additional_info("grease_pencil_fx_common", "draw_fullscreen");
GPU_SHADER_CREATE_INFO(grease_pencil_fx_glow)
.do_static_compilation(true)
.define("GLOW")
.push_constant(Type::VEC4, "glowColor")
.push_constant(Type::VEC2, "offset")
.push_constant(Type::INT, "sampCount")
.push_constant(Type::VEC4, "threshold")
.push_constant(Type::BOOL, "firstPass")
.push_constant(Type::BOOL, "glowUnder")
.push_constant(Type::INT, "blendMode")
.additional_info("grease_pencil_fx_common", "draw_fullscreen");
GPU_SHADER_CREATE_INFO(grease_pencil_fx_rim)
.do_static_compilation(true)
.define("RIM")
.push_constant(Type::VEC2, "blurDir")
.push_constant(Type::VEC2, "uvOffset")
.push_constant(Type::VEC3, "rimColor")
.push_constant(Type::VEC3, "maskColor")
.push_constant(Type::INT, "sampCount")
.push_constant(Type::INT, "blendMode")
.push_constant(Type::BOOL, "isFirstPass")
.additional_info("grease_pencil_fx_common", "draw_fullscreen");
GPU_SHADER_CREATE_INFO(grease_pencil_fx_shadow)
.do_static_compilation(true)
.define("SHADOW")
.push_constant(Type::VEC4, "shadowColor")
.push_constant(Type::VEC2, "uvRotX")
.push_constant(Type::VEC2, "uvRotY")
.push_constant(Type::VEC2, "uvOffset")
.push_constant(Type::VEC2, "blurDir")
.push_constant(Type::VEC2, "waveDir")
.push_constant(Type::VEC2, "waveOffset")
.push_constant(Type::FLOAT, "wavePhase")
.push_constant(Type::INT, "sampCount")
.push_constant(Type::BOOL, "isFirstPass")
.additional_info("grease_pencil_fx_common", "draw_fullscreen");
GPU_SHADER_CREATE_INFO(grease_pencil_fx_pixelize)
.do_static_compilation(true)
.define("PIXELIZE")
.push_constant(Type::VEC2, "targetPixelSize")
.push_constant(Type::VEC2, "targetPixelOffset")
.push_constant(Type::VEC2, "accumOffset")
.push_constant(Type::INT, "sampCount")
.additional_info("grease_pencil_fx_common", "draw_fullscreen");

View File

@ -27,8 +27,8 @@
#include "draw_cache_impl.hh"
#include "../engines/gpencil/gpencil_defines.h"
#include "../engines/gpencil/gpencil_shader_shared.h"
#include "../engines/grease_pencil_v3/grease_pencil_defines.hh"
#include "../engines/grease_pencil_v3/grease_pencil_shader_shared.h"
namespace blender::draw {

View File

@ -92,6 +92,7 @@
#include "engines/eevee_next/eevee_engine.h"
#include "engines/external/external_engine.h"
#include "engines/gpencil/gpencil_engine.h"
#include "engines/grease_pencil_v3/grease_pencil_engine.h"
#include "engines/image/image_engine.h"
#include "engines/overlay/overlay_engine.h"
#include "engines/select/select_engine.hh"

View File

@ -165,8 +165,8 @@ GPU_SHADER_CREATE_INFO(draw_gpencil)
.push_constant(Type::FLOAT, "gpThicknessOffset")
.additional_info("draw_modelmat", "draw_object_infos");
GPU_SHADER_CREATE_INFO(draw_gpencil_new)
.typedef_source("gpencil_shader_shared.h")
GPU_SHADER_CREATE_INFO(draw_grease_pencil)
.typedef_source("grease_pencil_shader_shared.h")
.define("DRW_GPENCIL_INFO")
.sampler(0, ImageType::FLOAT_BUFFER, "gp_pos_tx")
.sampler(1, ImageType::FLOAT_BUFFER, "gp_col_tx")

View File

@ -691,6 +691,8 @@ set(SRC_SHADER_CREATE_INFOS
../draw/engines/eevee_next/shaders/infos/eevee_volume_info.hh
../draw/engines/gpencil/shaders/infos/gpencil_info.hh
../draw/engines/gpencil/shaders/infos/gpencil_vfx_info.hh
../draw/engines/grease_pencil_v3/shaders/infos/grease_pencil_info.hh
../draw/engines/grease_pencil_v3/shaders/infos/grease_pencil_vfx_info.hh
../draw/engines/overlay/shaders/infos/overlay_antialiasing_info.hh
../draw/engines/overlay/shaders/infos/overlay_armature_info.hh
../draw/engines/overlay/shaders/infos/overlay_background_info.hh