Skip to content

Commit

Permalink
Add PREMUL_ALPHA builtin
Browse files Browse the repository at this point in the history
  • Loading branch information
QbieShay committed Dec 2, 2023
1 parent 4c5a148 commit b305c5c
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,7 @@ void SceneShaderForwardClustered::ShaderData::set_code(const String &p_code) {
uses_fragment_time = gen_code.uses_fragment_time;
uses_normal |= uses_normal_map;
uses_tangent |= uses_normal_map;
uses_premul_alpha = gen_code.uses_premul_alpha;

#if 0
print_line("**compiling shader:");
Expand Down Expand Up @@ -186,6 +187,10 @@ void SceneShaderForwardClustered::ShaderData::set_code(const String &p_code) {

//blend modes

if (uses_premul_alpha) {
blend_mode = BLEND_MODE_PREMUL_ALPHA;
}

// if any form of Alpha Antialiasing is enabled, set the blend mode to alpha to coverage
if (alpha_antialiasing_mode != ALPHA_ANTIALIASING_OFF) {
blend_mode = BLEND_MODE_ALPHA_TO_COVERAGE;
Expand Down Expand Up @@ -244,6 +249,16 @@ void SceneShaderForwardClustered::ShaderData::set_code(const String &p_code) {
blend_attachment.dst_color_blend_factor = RD::BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
blend_attachment.src_alpha_blend_factor = RD::BLEND_FACTOR_ONE;
blend_attachment.dst_alpha_blend_factor = RD::BLEND_FACTOR_ZERO;
} break;
case BLEND_MODE_PREMUL_ALPHA: {
blend_attachment.enable_blend = true;
blend_attachment.alpha_blend_op = RD::BLEND_OP_ADD;
blend_attachment.color_blend_op = RD::BLEND_OP_ADD;
blend_attachment.src_color_blend_factor = RD::BLEND_FACTOR_ONE;
blend_attachment.dst_color_blend_factor = RD::BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
blend_attachment.src_alpha_blend_factor = RD::BLEND_FACTOR_ONE;
blend_attachment.dst_alpha_blend_factor = RD::BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
uses_blend_alpha = true;
}
}

Expand Down Expand Up @@ -592,6 +607,7 @@ void SceneShaderForwardClustered::init(const String p_defines) {
actions.renames["NORMAL_MAP_DEPTH"] = "normal_map_depth";
actions.renames["ALBEDO"] = "albedo";
actions.renames["ALPHA"] = "alpha";
actions.renames["PREMUL_ALPHA"] = "premul_alpha";
actions.renames["METALLIC"] = "metallic";
actions.renames["SPECULAR"] = "specular";
actions.renames["ROUGHNESS"] = "roughness";
Expand Down Expand Up @@ -669,6 +685,7 @@ void SceneShaderForwardClustered::init(const String p_defines) {
actions.usage_defines["COLOR"] = "#define COLOR_USED\n";
actions.usage_defines["INSTANCE_CUSTOM"] = "#define ENABLE_INSTANCE_CUSTOM\n";
actions.usage_defines["POSITION"] = "#define OVERRIDE_POSITION\n";
actions.usage_defines["PREMUL_ALPHA"] = "#define PREMUL_ALPHA_USED\n";

actions.usage_defines["ALPHA_SCISSOR_THRESHOLD"] = "#define ALPHA_SCISSOR_USED\n";
actions.usage_defines["ALPHA_HASH_SCALE"] = "#define ALPHA_HASH_USED\n";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,8 @@ class SceneShaderForwardClustered {
BLEND_MODE_ADD,
BLEND_MODE_SUB,
BLEND_MODE_MUL,
BLEND_MODE_ALPHA_TO_COVERAGE
BLEND_MODE_ALPHA_TO_COVERAGE,
BLEND_MODE_PREMUL_ALPHA,
};

enum DepthDraw {
Expand Down Expand Up @@ -182,6 +183,7 @@ class SceneShaderForwardClustered {
bool writes_modelview_or_projection = false;
bool uses_world_coordinates = false;
bool uses_screen_texture_mipmaps = false;
bool uses_premul_alpha = false;
Cull cull_mode = CULL_DISABLED;

uint64_t last_pass = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -871,6 +871,9 @@ uint cluster_get_range_clip_mask(uint i, uint z_min, uint z_max) {
void fragment_shader(in SceneData scene_data) {
uint instance_index = instance_index_interp;

#ifdef PREMUL_ALPHA_USED
float premul_alpha = 1.0;
#endif // PREMUL_ALPHA_USED
//lay out everything, whatever is unused is optimized away anyway
vec3 vertex = vertex_interp;
#ifdef USE_MULTIVIEW
Expand Down Expand Up @@ -2401,6 +2404,10 @@ void fragment_shader(in SceneData scene_data) {

motion_vector = prev_position_uv - position_uv;
#endif

#if defined(PREMUL_ALPHA_USED) && !defined(MODE_RENDER_DEPTH)
frag_color.rgb *= premul_alpha;
#endif //PREMUL_ALPHA_USED
}

void main() {
Expand Down
5 changes: 5 additions & 0 deletions servers/rendering/shader_compiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -965,6 +965,10 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene
}
}

if (vnode->name == premul_alpha_name) {
r_gen_code.uses_premul_alpha = true;
}

if (vnode->name == time_name) {
if (p_actions.entry_point_stages.has(current_func_name) && p_actions.entry_point_stages[current_func_name] == STAGE_VERTEX) {
r_gen_code.uses_vertex_time = true;
Expand Down Expand Up @@ -1564,6 +1568,7 @@ void ShaderCompiler::initialize(DefaultIdentifierActions p_actions) {
actions = p_actions;

time_name = "TIME";
premul_alpha_name = "PREMUL_ALPHA";

List<String> func_list;

Expand Down
2 changes: 2 additions & 0 deletions servers/rendering/shader_compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ class ShaderCompiler {
bool uses_screen_texture;
bool uses_depth_texture;
bool uses_normal_roughness_texture;
bool uses_premul_alpha;
};

struct DefaultIdentifierActions {
Expand Down Expand Up @@ -115,6 +116,7 @@ class ShaderCompiler {
const ShaderLanguage::FunctionNode *function = nullptr;
StringName current_func_name;
StringName time_name;
StringName premul_alpha_name;
HashSet<StringName> texture_functions;

HashSet<StringName> used_name_defines;
Expand Down
1 change: 1 addition & 0 deletions servers/rendering/shader_types.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ ShaderTypes::ShaderTypes() {
shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["UV2"] = constt(ShaderLanguage::TYPE_VEC2);
shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["COLOR"] = constt(ShaderLanguage::TYPE_VEC4);
shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["ALBEDO"] = ShaderLanguage::TYPE_VEC3;
shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["PREMUL_ALPHA"] = ShaderLanguage::TYPE_FLOAT;
shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["ALPHA"] = ShaderLanguage::TYPE_FLOAT;
shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["METALLIC"] = ShaderLanguage::TYPE_FLOAT;
shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["SPECULAR"] = ShaderLanguage::TYPE_FLOAT;
Expand Down

0 comments on commit b305c5c

Please sign in to comment.