Use Filament specular models and parametrization
This commit is contained in:
parent
002ab10608
commit
fe49244611
|
@ -132,8 +132,8 @@
|
|||
If [code]true[/code], clearcoat rendering is enabled. Adds a secondary transparent pass to the lighting calculation resulting in an added specular blob. This makes materials appear as if they have a clear layer on them that can be either glossy or rough.
|
||||
[b]Note:[/b] Clearcoat rendering is not visible if the material's [member shading_mode] is [constant SHADING_MODE_UNSHADED].
|
||||
</member>
|
||||
<member name="clearcoat_gloss" type="float" setter="set_clearcoat_gloss" getter="get_clearcoat_gloss" default="0.5">
|
||||
Sets the roughness of the clearcoat pass. A higher value results in a smoother clearcoat while a lower value results in a rougher clearcoat.
|
||||
<member name="clearcoat_roughness" type="float" setter="set_clearcoat_roughness" getter="get_clearcoat_roughness" default="0.5">
|
||||
Sets the roughness of the clearcoat pass. A higher value results in a rougher clearcoat while a lower value results in a smoother clearcoat.
|
||||
</member>
|
||||
<member name="clearcoat_texture" type="Texture2D" setter="set_texture" getter="get_texture">
|
||||
Texture that defines the strength of the clearcoat effect and the glossiness of the clearcoat. Strength is specified in the red channel while glossiness is specified in the green channel.
|
||||
|
@ -319,6 +319,7 @@
|
|||
</member>
|
||||
<member name="specular_mode" type="int" setter="set_specular_mode" getter="get_specular_mode" enum="BaseMaterial3D.SpecularMode" default="0">
|
||||
The method for rendering the specular blob. See [enum SpecularMode].
|
||||
[b]Note:[/b] Only applies to the specular blob. Does not affect specular reflections from the Sky, SSR, or ReflectionProbes.
|
||||
</member>
|
||||
<member name="subsurf_scatter_enabled" type="bool" setter="set_feature" getter="get_feature" default="false">
|
||||
If [code]true[/code], subsurface scattering is enabled. Emulates light that penetrates an object's surface, is scattered, and then emerges.
|
||||
|
@ -664,16 +665,10 @@
|
|||
<constant name="SPECULAR_SCHLICK_GGX" value="0" enum="SpecularMode">
|
||||
Default specular blob.
|
||||
</constant>
|
||||
<constant name="SPECULAR_BLINN" value="1" enum="SpecularMode">
|
||||
Older specular algorithm, included for compatibility.
|
||||
</constant>
|
||||
<constant name="SPECULAR_PHONG" value="2" enum="SpecularMode">
|
||||
Older specular algorithm, included for compatibility.
|
||||
</constant>
|
||||
<constant name="SPECULAR_TOON" value="3" enum="SpecularMode">
|
||||
<constant name="SPECULAR_TOON" value="1" enum="SpecularMode">
|
||||
Toon blob which changes size based on roughness.
|
||||
</constant>
|
||||
<constant name="SPECULAR_DISABLED" value="4" enum="SpecularMode">
|
||||
<constant name="SPECULAR_DISABLED" value="2" enum="SpecularMode">
|
||||
No specular blob.
|
||||
</constant>
|
||||
<constant name="BILLBOARD_DISABLED" value="0" enum="BillboardMode">
|
||||
|
|
|
@ -1813,12 +1813,6 @@
|
|||
</member>
|
||||
<member name="rendering/shader_compiler/shader_cache/use_zstd_compression" type="bool" setter="" getter="" default="true">
|
||||
</member>
|
||||
<member name="rendering/shading/overrides/force_blinn_over_ggx" type="bool" setter="" getter="" default="false">
|
||||
If [code]true[/code], uses faster but lower-quality Blinn model to generate blurred reflections instead of the GGX model.
|
||||
</member>
|
||||
<member name="rendering/shading/overrides/force_blinn_over_ggx.mobile" type="bool" setter="" getter="" default="true">
|
||||
Lower-end override for [member rendering/shading/overrides/force_blinn_over_ggx] on mobile devices, due to performance concerns or driver support.
|
||||
</member>
|
||||
<member name="rendering/shading/overrides/force_lambert_over_burley" type="bool" setter="" getter="" default="false">
|
||||
If [code]true[/code], uses faster but lower-quality Lambert material lighting model instead of Burley.
|
||||
</member>
|
||||
|
|
|
@ -1107,7 +1107,7 @@ void light_compute(
|
|||
float rim,
|
||||
float rim_tint,
|
||||
float clearcoat,
|
||||
float clearcoat_gloss,
|
||||
float clearcoat_roughness,
|
||||
float anisotropy,
|
||||
inout vec3 diffuse_light,
|
||||
inout vec3 specular_light,
|
||||
|
@ -1298,7 +1298,7 @@ LIGHT_SHADER_CODE
|
|||
#if !defined(SPECULAR_SCHLICK_GGX)
|
||||
float cLdotH5 = SchlickFresnel(cLdotH);
|
||||
#endif
|
||||
float Dr = GTR1(cNdotH, mix(.1, .001, clearcoat_gloss));
|
||||
float Dr = GTR1(cNdotH, mix(.1, .001, clearcoat_roughness));
|
||||
float Fr = mix(.04, 1.0, cLdotH5);
|
||||
//float Gr = G_GGX_2cos(cNdotL, .25) * G_GGX_2cos(cNdotV, .25);
|
||||
float Gr = V_GGX(cNdotL, cNdotV, 0.25);
|
||||
|
@ -1427,7 +1427,7 @@ void main() {
|
|||
float rim = 0.0;
|
||||
float rim_tint = 0.0;
|
||||
float clearcoat = 0.0;
|
||||
float clearcoat_gloss = 0.0;
|
||||
float clearcoat_roughness = 0.0;
|
||||
float anisotropy = 0.0;
|
||||
vec2 anisotropy_flow = vec2(1.0, 0.0);
|
||||
float sss_strength = 0.0; //unused
|
||||
|
@ -2028,7 +2028,7 @@ FRAGMENT_SHADER_CODE
|
|||
rim,
|
||||
rim_tint,
|
||||
clearcoat,
|
||||
clearcoat_gloss,
|
||||
clearcoat_roughness,
|
||||
anisotropy,
|
||||
diffuse_light,
|
||||
specular_light,
|
||||
|
|
|
@ -426,7 +426,7 @@ Ref<StandardMaterial3D> FBXMaterial::import_material(ImportState &state) {
|
|||
// meaning is that approx equal to zero is disabled not actually zero. ;)
|
||||
if (real_value && Math::is_zero_approx(real_value->Value())) {
|
||||
print_verbose("clearcoat real value: " + rtos(real_value->Value()));
|
||||
spatial_material->set_clearcoat_gloss(1.0 - real_value->Value());
|
||||
spatial_material->set_clearcoat_roughness(real_value->Value());
|
||||
} else {
|
||||
print_error("unsupported value type for clearcoat gloss");
|
||||
}
|
||||
|
|
|
@ -330,7 +330,7 @@ void BaseMaterial3D::init_shaders() {
|
|||
shader_names->rim = "rim";
|
||||
shader_names->rim_tint = "rim_tint";
|
||||
shader_names->clearcoat = "clearcoat";
|
||||
shader_names->clearcoat_gloss = "clearcoat_gloss";
|
||||
shader_names->clearcoat_roughness = "clearcoat_roughness";
|
||||
shader_names->anisotropy = "anisotropy_ratio";
|
||||
shader_names->heightmap_scale = "heightmap_scale";
|
||||
shader_names->subsurface_scattering_strength = "subsurface_scattering_strength";
|
||||
|
@ -541,12 +541,6 @@ void BaseMaterial3D::_update_shader() {
|
|||
case SPECULAR_SCHLICK_GGX:
|
||||
code += ",specular_schlick_ggx";
|
||||
break;
|
||||
case SPECULAR_BLINN:
|
||||
code += ",specular_blinn";
|
||||
break;
|
||||
case SPECULAR_PHONG:
|
||||
code += ",specular_phong";
|
||||
break;
|
||||
case SPECULAR_TOON:
|
||||
code += ",specular_toon";
|
||||
break;
|
||||
|
@ -690,7 +684,7 @@ void BaseMaterial3D::_update_shader() {
|
|||
}
|
||||
if (features[FEATURE_CLEARCOAT]) {
|
||||
code += "uniform float clearcoat : hint_range(0,1);\n";
|
||||
code += "uniform float clearcoat_gloss : hint_range(0,1);\n";
|
||||
code += "uniform float clearcoat_roughness : hint_range(0,1);\n";
|
||||
code += "uniform sampler2D texture_clearcoat : hint_white," + texfilter_str + ";\n";
|
||||
}
|
||||
if (features[FEATURE_ANISOTROPY]) {
|
||||
|
@ -1166,7 +1160,7 @@ void BaseMaterial3D::_update_shader() {
|
|||
code += " vec2 clearcoat_tex = texture(texture_clearcoat,base_uv).xy;\n";
|
||||
}
|
||||
code += " CLEARCOAT = clearcoat*clearcoat_tex.x;";
|
||||
code += " CLEARCOAT_GLOSS = clearcoat_gloss*clearcoat_tex.y;\n";
|
||||
code += " CLEARCOAT_ROUGHNESS = clearcoat_roughness*clearcoat_tex.y;\n";
|
||||
}
|
||||
|
||||
if (features[FEATURE_ANISOTROPY]) {
|
||||
|
@ -1408,13 +1402,13 @@ float BaseMaterial3D::get_clearcoat() const {
|
|||
return clearcoat;
|
||||
}
|
||||
|
||||
void BaseMaterial3D::set_clearcoat_gloss(float p_clearcoat_gloss) {
|
||||
clearcoat_gloss = p_clearcoat_gloss;
|
||||
RS::get_singleton()->material_set_param(_get_material(), shader_names->clearcoat_gloss, p_clearcoat_gloss);
|
||||
void BaseMaterial3D::set_clearcoat_roughness(float p_clearcoat_roughness) {
|
||||
clearcoat_roughness = p_clearcoat_roughness;
|
||||
RS::get_singleton()->material_set_param(_get_material(), shader_names->clearcoat_roughness, p_clearcoat_roughness);
|
||||
}
|
||||
|
||||
float BaseMaterial3D::get_clearcoat_gloss() const {
|
||||
return clearcoat_gloss;
|
||||
float BaseMaterial3D::get_clearcoat_roughness() const {
|
||||
return clearcoat_roughness;
|
||||
}
|
||||
|
||||
void BaseMaterial3D::set_anisotropy(float p_anisotropy) {
|
||||
|
@ -2271,8 +2265,8 @@ void BaseMaterial3D::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("set_clearcoat", "clearcoat"), &BaseMaterial3D::set_clearcoat);
|
||||
ClassDB::bind_method(D_METHOD("get_clearcoat"), &BaseMaterial3D::get_clearcoat);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_clearcoat_gloss", "clearcoat_gloss"), &BaseMaterial3D::set_clearcoat_gloss);
|
||||
ClassDB::bind_method(D_METHOD("get_clearcoat_gloss"), &BaseMaterial3D::get_clearcoat_gloss);
|
||||
ClassDB::bind_method(D_METHOD("set_clearcoat_roughness", "clearcoat_roughness"), &BaseMaterial3D::set_clearcoat_roughness);
|
||||
ClassDB::bind_method(D_METHOD("get_clearcoat_roughness"), &BaseMaterial3D::get_clearcoat_roughness);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_anisotropy", "anisotropy"), &BaseMaterial3D::set_anisotropy);
|
||||
ClassDB::bind_method(D_METHOD("get_anisotropy"), &BaseMaterial3D::get_anisotropy);
|
||||
|
@ -2438,7 +2432,7 @@ void BaseMaterial3D::_bind_methods() {
|
|||
ADD_GROUP("Shading", "");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "shading_mode", PROPERTY_HINT_ENUM, "Unshaded,Per-Pixel,Per-Vertex"), "set_shading_mode", "get_shading_mode");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "diffuse_mode", PROPERTY_HINT_ENUM, "Burley,Lambert,Lambert Wrap,Toon"), "set_diffuse_mode", "get_diffuse_mode");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "specular_mode", PROPERTY_HINT_ENUM, "SchlickGGX,Blinn,Phong,Toon,Disabled"), "set_specular_mode", "get_specular_mode");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "specular_mode", PROPERTY_HINT_ENUM, "SchlickGGX,Toon,Disabled"), "set_specular_mode", "get_specular_mode");
|
||||
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "disable_ambient_light"), "set_flag", "get_flag", FLAG_DISABLE_AMBIENT_LIGHT);
|
||||
|
||||
ADD_GROUP("Vertex Color", "vertex_color");
|
||||
|
@ -2486,7 +2480,7 @@ void BaseMaterial3D::_bind_methods() {
|
|||
ADD_GROUP("Clearcoat", "clearcoat_");
|
||||
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "clearcoat_enabled"), "set_feature", "get_feature", FEATURE_CLEARCOAT);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "clearcoat", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_clearcoat", "get_clearcoat");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "clearcoat_gloss", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_clearcoat_gloss", "get_clearcoat_gloss");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "clearcoat_roughness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_clearcoat_roughness", "get_clearcoat_roughness");
|
||||
ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "clearcoat_texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_texture", "get_texture", TEXTURE_CLEARCOAT);
|
||||
|
||||
ADD_GROUP("Anisotropy", "anisotropy_");
|
||||
|
@ -2693,8 +2687,6 @@ void BaseMaterial3D::_bind_methods() {
|
|||
BIND_ENUM_CONSTANT(DIFFUSE_TOON);
|
||||
|
||||
BIND_ENUM_CONSTANT(SPECULAR_SCHLICK_GGX);
|
||||
BIND_ENUM_CONSTANT(SPECULAR_BLINN);
|
||||
BIND_ENUM_CONSTANT(SPECULAR_PHONG);
|
||||
BIND_ENUM_CONSTANT(SPECULAR_TOON);
|
||||
BIND_ENUM_CONSTANT(SPECULAR_DISABLED);
|
||||
|
||||
|
@ -2732,7 +2724,7 @@ BaseMaterial3D::BaseMaterial3D(bool p_orm) :
|
|||
set_rim(1.0);
|
||||
set_rim_tint(0.5);
|
||||
set_clearcoat(1);
|
||||
set_clearcoat_gloss(0.5);
|
||||
set_clearcoat_roughness(0.5);
|
||||
set_anisotropy(0);
|
||||
set_heightmap_scale(0.05);
|
||||
set_subsurface_scattering_strength(0);
|
||||
|
|
|
@ -252,8 +252,6 @@ public:
|
|||
|
||||
enum SpecularMode {
|
||||
SPECULAR_SCHLICK_GGX,
|
||||
SPECULAR_BLINN,
|
||||
SPECULAR_PHONG,
|
||||
SPECULAR_TOON,
|
||||
SPECULAR_DISABLED,
|
||||
SPECULAR_MAX
|
||||
|
@ -387,7 +385,7 @@ private:
|
|||
StringName rim;
|
||||
StringName rim_tint;
|
||||
StringName clearcoat;
|
||||
StringName clearcoat_gloss;
|
||||
StringName clearcoat_roughness;
|
||||
StringName anisotropy;
|
||||
StringName heightmap_scale;
|
||||
StringName subsurface_scattering_strength;
|
||||
|
@ -454,7 +452,7 @@ private:
|
|||
float rim;
|
||||
float rim_tint;
|
||||
float clearcoat;
|
||||
float clearcoat_gloss;
|
||||
float clearcoat_roughness;
|
||||
float anisotropy;
|
||||
float heightmap_scale;
|
||||
float subsurface_scattering_strength;
|
||||
|
@ -572,8 +570,8 @@ public:
|
|||
void set_clearcoat(float p_clearcoat);
|
||||
float get_clearcoat() const;
|
||||
|
||||
void set_clearcoat_gloss(float p_clearcoat_gloss);
|
||||
float get_clearcoat_gloss() const;
|
||||
void set_clearcoat_roughness(float p_clearcoat_roughness);
|
||||
float get_clearcoat_roughness() const;
|
||||
|
||||
void set_anisotropy(float p_anisotropy);
|
||||
float get_anisotropy() const;
|
||||
|
|
|
@ -3163,7 +3163,7 @@ const VisualShaderNodeOutput::Port VisualShaderNodeOutput::ports[] = {
|
|||
{ Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "rim", "RIM" },
|
||||
{ Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "rim_tint", "RIM_TINT" },
|
||||
{ Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "clearcoat", "CLEARCOAT" },
|
||||
{ Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "clearcoat_gloss", "CLEARCOAT_GLOSS" },
|
||||
{ Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "clearcoat_roughness", "CLEARCOAT_ROUGHNESS" },
|
||||
{ Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "anisotropy", "ANISOTROPY" },
|
||||
{ Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_VECTOR_2D, "anisotropy_flow", "ANISOTROPY_FLOW" },
|
||||
{ Shader::MODE_SPATIAL, VisualShader::TYPE_FRAGMENT, VisualShaderNode::PORT_TYPE_SCALAR, "subsurf_scatter", "SSS_STRENGTH" },
|
||||
|
|
|
@ -557,7 +557,7 @@ void SceneShaderForwardClustered::init(RendererStorageRD *p_storage, const Strin
|
|||
actions.renames["RIM"] = "rim";
|
||||
actions.renames["RIM_TINT"] = "rim_tint";
|
||||
actions.renames["CLEARCOAT"] = "clearcoat";
|
||||
actions.renames["CLEARCOAT_GLOSS"] = "clearcoat_gloss";
|
||||
actions.renames["CLEARCOAT_ROUGHNESS"] = "clearcoat_roughness";
|
||||
actions.renames["ANISOTROPY"] = "anisotropy";
|
||||
actions.renames["ANISOTROPY_FLOW"] = "anisotropy_flow";
|
||||
actions.renames["SSS_STRENGTH"] = "sss_strength";
|
||||
|
@ -607,7 +607,7 @@ void SceneShaderForwardClustered::init(RendererStorageRD *p_storage, const Strin
|
|||
actions.usage_defines["RIM"] = "#define LIGHT_RIM_USED\n";
|
||||
actions.usage_defines["RIM_TINT"] = "@RIM";
|
||||
actions.usage_defines["CLEARCOAT"] = "#define LIGHT_CLEARCOAT_USED\n";
|
||||
actions.usage_defines["CLEARCOAT_GLOSS"] = "@CLEARCOAT";
|
||||
actions.usage_defines["CLEARCOAT_ROUGHNESS"] = "@CLEARCOAT";
|
||||
actions.usage_defines["ANISOTROPY"] = "#define LIGHT_ANISOTROPY_USED\n";
|
||||
actions.usage_defines["ANISOTROPY_FLOW"] = "@ANISOTROPY";
|
||||
actions.usage_defines["AO"] = "#define AO_USED\n";
|
||||
|
@ -663,20 +663,12 @@ void SceneShaderForwardClustered::init(RendererStorageRD *p_storage, const Strin
|
|||
|
||||
actions.render_mode_defines["sss_mode_skin"] = "#define SSS_MODE_SKIN\n";
|
||||
|
||||
bool force_blinn = GLOBAL_GET("rendering/shading/overrides/force_blinn_over_ggx");
|
||||
|
||||
if (!force_blinn) {
|
||||
actions.render_mode_defines["specular_schlick_ggx"] = "#define SPECULAR_SCHLICK_GGX\n";
|
||||
} else {
|
||||
actions.render_mode_defines["specular_schlick_ggx"] = "#define SPECULAR_BLINN\n";
|
||||
}
|
||||
actions.render_mode_defines["specular_schlick_ggx"] = "#define SPECULAR_SCHLICK_GGX\n";
|
||||
|
||||
actions.custom_samplers["SCREEN_TEXTURE"] = "material_samplers[3]"; // linear filter with mipmaps
|
||||
actions.custom_samplers["DEPTH_TEXTURE"] = "material_samplers[3]";
|
||||
actions.custom_samplers["NORMAL_ROUGHNESS_TEXTURE"] = "material_samplers[1]"; // linear filter
|
||||
|
||||
actions.render_mode_defines["specular_blinn"] = "#define SPECULAR_BLINN\n";
|
||||
actions.render_mode_defines["specular_phong"] = "#define SPECULAR_PHONG\n";
|
||||
actions.render_mode_defines["specular_toon"] = "#define SPECULAR_TOON\n";
|
||||
actions.render_mode_defines["specular_disabled"] = "#define SPECULAR_DISABLED\n";
|
||||
actions.render_mode_defines["shadows_disabled"] = "#define SHADOWS_DISABLED\n";
|
||||
|
|
|
@ -545,7 +545,7 @@ void SceneShaderForwardMobile::init(RendererStorageRD *p_storage, const String p
|
|||
actions.renames["RIM"] = "rim";
|
||||
actions.renames["RIM_TINT"] = "rim_tint";
|
||||
actions.renames["CLEARCOAT"] = "clearcoat";
|
||||
actions.renames["CLEARCOAT_GLOSS"] = "clearcoat_gloss";
|
||||
actions.renames["CLEARCOAT_ROUGHNESS"] = "clearcoat_roughness";
|
||||
actions.renames["ANISOTROPY"] = "anisotropy";
|
||||
actions.renames["ANISOTROPY_FLOW"] = "anisotropy_flow";
|
||||
actions.renames["SSS_STRENGTH"] = "sss_strength";
|
||||
|
@ -594,7 +594,7 @@ void SceneShaderForwardMobile::init(RendererStorageRD *p_storage, const String p
|
|||
actions.usage_defines["RIM"] = "#define LIGHT_RIM_USED\n";
|
||||
actions.usage_defines["RIM_TINT"] = "@RIM";
|
||||
actions.usage_defines["CLEARCOAT"] = "#define LIGHT_CLEARCOAT_USED\n";
|
||||
actions.usage_defines["CLEARCOAT_GLOSS"] = "@CLEARCOAT";
|
||||
actions.usage_defines["CLEARCOAT_ROUGHNESS"] = "@CLEARCOAT";
|
||||
actions.usage_defines["ANISOTROPY"] = "#define LIGHT_ANISOTROPY_USED\n";
|
||||
actions.usage_defines["ANISOTROPY_FLOW"] = "@ANISOTROPY";
|
||||
actions.usage_defines["AO"] = "#define AO_USED\n";
|
||||
|
@ -649,15 +649,8 @@ void SceneShaderForwardMobile::init(RendererStorageRD *p_storage, const String p
|
|||
|
||||
actions.render_mode_defines["sss_mode_skin"] = "#define SSS_MODE_SKIN\n";
|
||||
|
||||
bool force_blinn = GLOBAL_GET("rendering/shading/overrides/force_blinn_over_ggx");
|
||||
if (!force_blinn) {
|
||||
actions.render_mode_defines["specular_schlick_ggx"] = "#define SPECULAR_SCHLICK_GGX\n";
|
||||
} else {
|
||||
actions.render_mode_defines["specular_schlick_ggx"] = "#define SPECULAR_BLINN\n";
|
||||
}
|
||||
actions.render_mode_defines["specular_schlick_ggx"] = "#define SPECULAR_SCHLICK_GGX\n";
|
||||
|
||||
actions.render_mode_defines["specular_blinn"] = "#define SPECULAR_BLINN\n";
|
||||
actions.render_mode_defines["specular_phong"] = "#define SPECULAR_PHONG\n";
|
||||
actions.render_mode_defines["specular_toon"] = "#define SPECULAR_TOON\n";
|
||||
actions.render_mode_defines["specular_disabled"] = "#define SPECULAR_DISABLED\n";
|
||||
actions.render_mode_defines["shadows_disabled"] = "#define SHADOWS_DISABLED\n";
|
||||
|
|
|
@ -478,8 +478,8 @@ layout(location = 0) out vec4 frag_color;
|
|||
|
||||
#if !defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED)
|
||||
|
||||
/* Make a default specular mode SPECULAR_SCHLICK_GGX. */
|
||||
#if !defined(SPECULAR_DISABLED) && !defined(SPECULAR_SCHLICK_GGX) && !defined(SPECULAR_BLINN) && !defined(SPECULAR_PHONG) && !defined(SPECULAR_TOON)
|
||||
// Default to SPECULAR_SCHLICK_GGX.
|
||||
#if !defined(SPECULAR_DISABLED) && !defined(SPECULAR_SCHLICK_GGX) && !defined(SPECULAR_TOON)
|
||||
#define SPECULAR_SCHLICK_GGX
|
||||
#endif
|
||||
|
||||
|
@ -589,7 +589,7 @@ void main() {
|
|||
float rim = 0.0;
|
||||
float rim_tint = 0.0;
|
||||
float clearcoat = 0.0;
|
||||
float clearcoat_gloss = 0.0;
|
||||
float clearcoat_roughness = 0.0;
|
||||
float anisotropy = 0.0;
|
||||
vec2 anisotropy_flow = vec2(1.0, 0.0);
|
||||
vec4 fog = vec4(0.0);
|
||||
|
@ -912,7 +912,17 @@ void main() {
|
|||
#if !defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED)
|
||||
|
||||
if (scene_data.use_reflection_cubemap) {
|
||||
#ifdef LIGHT_ANISOTROPY_USED
|
||||
// https://google.github.io/filament/Filament.html#lighting/imagebasedlights/anisotropy
|
||||
vec3 anisotropic_direction = anisotropy >= 0.0 ? binormal : tangent;
|
||||
vec3 anisotropic_tangent = cross(anisotropic_direction, view);
|
||||
vec3 anisotropic_normal = cross(anisotropic_tangent, anisotropic_direction);
|
||||
vec3 bent_normal = normalize(mix(normal, anisotropic_normal, abs(anisotropy) * clamp(5.0 * roughness, 0.0, 1.0)));
|
||||
vec3 ref_vec = reflect(-view, bent_normal);
|
||||
#else
|
||||
vec3 ref_vec = reflect(-view, normal);
|
||||
#endif
|
||||
|
||||
float horizon = min(1.0 + dot(ref_vec, normal), 1.0);
|
||||
ref_vec = scene_data.radiance_inverse_xform * ref_vec;
|
||||
#ifdef USE_RADIANCE_CUBEMAP_ARRAY
|
||||
|
@ -954,6 +964,36 @@ void main() {
|
|||
#if defined(CUSTOM_IRRADIANCE_USED)
|
||||
ambient_light = mix(ambient_light, custom_irradiance.rgb, custom_irradiance.a);
|
||||
#endif
|
||||
|
||||
#ifdef LIGHT_CLEARCOAT_USED
|
||||
|
||||
if (scene_data.use_reflection_cubemap) {
|
||||
vec3 n = normalize(normal_interp); // We want to use geometric normal, not normal_map
|
||||
float NoV = max(dot(n, view), 0.0001);
|
||||
vec3 ref_vec = reflect(-view, n);
|
||||
// The clear coat layer assumes an IOR of 1.5 (4% reflectance)
|
||||
float Fc = clearcoat * (0.04 + 0.96 * SchlickFresnel(NoV));
|
||||
float attenuation = 1.0 - Fc;
|
||||
ambient_light *= attenuation;
|
||||
specular_light *= attenuation;
|
||||
|
||||
float horizon = min(1.0 + dot(ref_vec, normal), 1.0);
|
||||
ref_vec = scene_data.radiance_inverse_xform * ref_vec;
|
||||
float roughness_lod = mix(0.001, 0.1, clearcoat_roughness) * MAX_ROUGHNESS_LOD;
|
||||
#ifdef USE_RADIANCE_CUBEMAP_ARRAY
|
||||
|
||||
float lod, blend;
|
||||
blend = modf(roughness_lod, lod);
|
||||
vec3 clearcoat_light = texture(samplerCubeArray(radiance_cubemap, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), vec4(ref_vec, lod)).rgb;
|
||||
clearcoat_light = mix(clearcoat_light, texture(samplerCubeArray(radiance_cubemap, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), vec4(ref_vec, lod + 1)).rgb, blend);
|
||||
|
||||
#else
|
||||
vec3 clearcoat_light = textureLod(samplerCube(radiance_cubemap, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), ref_vec, roughness_lod).rgb;
|
||||
|
||||
#endif //USE_RADIANCE_CUBEMAP_ARRAY
|
||||
specular_light += clearcoat_light * horizon * horizon * Fc * scene_data.ambient_light_color_energy.a;
|
||||
}
|
||||
#endif
|
||||
#endif //!defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED)
|
||||
|
||||
//radiance
|
||||
|
@ -1202,8 +1242,16 @@ void main() {
|
|||
if (!bool(reflections.data[reflection_index].mask & instances.data[instance_index].layer_mask)) {
|
||||
continue; //not masked
|
||||
}
|
||||
|
||||
reflection_process(reflection_index, vertex, normal, roughness, ambient_light, specular_light, ambient_accum, reflection_accum);
|
||||
#ifdef LIGHT_ANISOTROPY_USED
|
||||
// https://google.github.io/filament/Filament.html#lighting/imagebasedlights/anisotropy
|
||||
vec3 anisotropic_direction = anisotropy >= 0.0 ? binormal : tangent;
|
||||
vec3 anisotropic_tangent = cross(anisotropic_direction, view);
|
||||
vec3 anisotropic_normal = cross(anisotropic_tangent, anisotropic_direction);
|
||||
vec3 bent_normal = normalize(mix(normal, anisotropic_normal, abs(anisotropy) * clamp(5.0 * roughness, 0.0, 1.0)));
|
||||
#else
|
||||
vec3 bent_normal = normal;
|
||||
#endif
|
||||
reflection_process(reflection_index, vertex, bent_normal, roughness, ambient_light, specular_light, ambient_accum, reflection_accum);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1555,10 +1603,11 @@ void main() {
|
|||
rim, rim_tint,
|
||||
#endif
|
||||
#ifdef LIGHT_CLEARCOAT_USED
|
||||
clearcoat, clearcoat_gloss,
|
||||
clearcoat, clearcoat_roughness, normalize(normal_interp),
|
||||
#endif
|
||||
#ifdef LIGHT_ANISOTROPY_USED
|
||||
binormal, tangent, anisotropy,
|
||||
binormal,
|
||||
tangent, anisotropy,
|
||||
#endif
|
||||
diffuse_light,
|
||||
specular_light);
|
||||
|
@ -1626,7 +1675,7 @@ void main() {
|
|||
rim_tint,
|
||||
#endif
|
||||
#ifdef LIGHT_CLEARCOAT_USED
|
||||
clearcoat, clearcoat_gloss,
|
||||
clearcoat, clearcoat_roughness, normalize(normal_interp),
|
||||
#endif
|
||||
#ifdef LIGHT_ANISOTROPY_USED
|
||||
tangent, binormal, anisotropy,
|
||||
|
@ -1698,10 +1747,11 @@ void main() {
|
|||
rim_tint,
|
||||
#endif
|
||||
#ifdef LIGHT_CLEARCOAT_USED
|
||||
clearcoat, clearcoat_gloss,
|
||||
clearcoat, clearcoat_roughness, normalize(normal_interp),
|
||||
#endif
|
||||
#ifdef LIGHT_ANISOTROPY_USED
|
||||
tangent, binormal, anisotropy,
|
||||
tangent,
|
||||
binormal, anisotropy,
|
||||
#endif
|
||||
diffuse_light, specular_light);
|
||||
}
|
||||
|
@ -1904,7 +1954,7 @@ void main() {
|
|||
frag_color = vec4(albedo, alpha);
|
||||
#else
|
||||
frag_color = vec4(emission + ambient_light + diffuse_light + specular_light, alpha);
|
||||
//frag_color = vec4(1.0);
|
||||
//frag_color = vec4(1.0);
|
||||
#endif //USE_NO_SHADING
|
||||
|
||||
// Draw "fixed" fog before volumetric fog to ensure volumetric fog can appear in front of the sky.
|
||||
|
|
|
@ -1,55 +1,29 @@
|
|||
// Functions related to lighting
|
||||
|
||||
// This returns the G_GGX function divided by 2 cos_theta_m, where in practice cos_theta_m is either N.L or N.V.
|
||||
// We're dividing this factor off because the overall term we'll end up looks like
|
||||
// (see, for example, the first unnumbered equation in B. Burley, "Physically Based Shading at Disney", SIGGRAPH 2012):
|
||||
//
|
||||
// F(L.V) D(N.H) G(N.L) G(N.V) / (4 N.L N.V)
|
||||
//
|
||||
// We're basically regouping this as
|
||||
//
|
||||
// F(L.V) D(N.H) [G(N.L)/(2 N.L)] [G(N.V) / (2 N.V)]
|
||||
//
|
||||
// and thus, this function implements the [G(N.m)/(2 N.m)] part with m = L or V.
|
||||
//
|
||||
// The contents of the D and G (G1) functions (GGX) are taken from
|
||||
// E. Heitz, "Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs", J. Comp. Graph. Tech. 3 (2) (2014).
|
||||
// Eqns 71-72 and 85-86 (see also Eqns 43 and 80).
|
||||
|
||||
float G_GGX_2cos(float cos_theta_m, float alpha) {
|
||||
// Schlick's approximation
|
||||
// C. Schlick, "An Inexpensive BRDF Model for Physically-based Rendering", Computer Graphics Forum. 13 (3): 233 (1994)
|
||||
// Eq. (19), although see Heitz (2014) the about the problems with his derivation.
|
||||
// It nevertheless approximates GGX well with k = alpha/2.
|
||||
float k = 0.5 * alpha;
|
||||
return 0.5 / (cos_theta_m * (1.0 - k) + k);
|
||||
|
||||
// float cos2 = cos_theta_m * cos_theta_m;
|
||||
// float sin2 = (1.0 - cos2);
|
||||
// return 1.0 / (cos_theta_m + sqrt(cos2 + alpha * alpha * sin2));
|
||||
}
|
||||
|
||||
float D_GGX(float cos_theta_m, float alpha) {
|
||||
float alpha2 = alpha * alpha;
|
||||
float d = 1.0 + (alpha2 - 1.0) * cos_theta_m * cos_theta_m;
|
||||
return alpha2 / (M_PI * d * d);
|
||||
}
|
||||
|
||||
float G_GGX_anisotropic_2cos(float cos_theta_m, float alpha_x, float alpha_y, float cos_phi, float sin_phi) {
|
||||
float cos2 = cos_theta_m * cos_theta_m;
|
||||
float sin2 = (1.0 - cos2);
|
||||
float s_x = alpha_x * cos_phi;
|
||||
float s_y = alpha_y * sin_phi;
|
||||
return 1.0 / max(cos_theta_m + sqrt(cos2 + (s_x * s_x + s_y * s_y) * sin2), 0.001);
|
||||
// From Earl Hammon, Jr. "PBR Diffuse Lighting for GGX+Smith Microsurfaces" https://www.gdcvault.com/play/1024478/PBR-Diffuse-Lighting-for-GGX
|
||||
float V_GGX(float NdotL, float NdotV, float alpha) {
|
||||
return 0.5 / mix(2.0 * NdotL * NdotV, NdotL + NdotV, alpha);
|
||||
}
|
||||
|
||||
float D_GGX_anisotropic(float cos_theta_m, float alpha_x, float alpha_y, float cos_phi, float sin_phi) {
|
||||
float cos2 = cos_theta_m * cos_theta_m;
|
||||
float sin2 = (1.0 - cos2);
|
||||
float r_x = cos_phi / alpha_x;
|
||||
float r_y = sin_phi / alpha_y;
|
||||
float d = cos2 + sin2 * (r_x * r_x + r_y * r_y);
|
||||
return 1.0 / max(M_PI * alpha_x * alpha_y * d * d, 0.001);
|
||||
float alpha2 = alpha_x * alpha_y;
|
||||
highp vec3 v = vec3(alpha_y * cos_phi, alpha_x * sin_phi, alpha2 * cos_theta_m);
|
||||
highp float v2 = dot(v, v);
|
||||
float w2 = alpha2 / v2;
|
||||
float D = alpha2 * w2 * w2 * (1.0 / M_PI);
|
||||
return D;
|
||||
}
|
||||
|
||||
float V_GGX_anisotropic(float alpha_x, float alpha_y, float TdotV, float TdotL, float BdotV, float BdotL, float NdotV, float NdotL) {
|
||||
float Lambda_V = NdotL * length(vec3(alpha_x * TdotV, alpha_y * BdotV, NdotV));
|
||||
float Lambda_L = NdotV * length(vec3(alpha_x * TdotL, alpha_y * BdotL, NdotL));
|
||||
return 0.5 / (Lambda_V + Lambda_L);
|
||||
}
|
||||
|
||||
float SchlickFresnel(float u) {
|
||||
|
@ -58,14 +32,6 @@ float SchlickFresnel(float u) {
|
|||
return m2 * m2 * m; // pow(m,5)
|
||||
}
|
||||
|
||||
float GTR1(float NdotH, float a) {
|
||||
if (a >= 1.0)
|
||||
return 1.0 / M_PI;
|
||||
float a2 = a * a;
|
||||
float t = 1.0 + (a2 - 1.0) * NdotH * NdotH;
|
||||
return (a2 - 1.0) / (M_PI * log(a2) * t);
|
||||
}
|
||||
|
||||
vec3 F0(float metallic, float specular, vec3 albedo) {
|
||||
float dielectric = 0.16 * specular * specular;
|
||||
// use albedo * metallic as colored specular reflectance at 0 angle for metallic materials;
|
||||
|
@ -87,7 +53,7 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float atte
|
|||
float rim, float rim_tint,
|
||||
#endif
|
||||
#ifdef LIGHT_CLEARCOAT_USED
|
||||
float clearcoat, float clearcoat_gloss,
|
||||
float clearcoat, float clearcoat_roughness, vec3 vertex_normal,
|
||||
#endif
|
||||
#ifdef LIGHT_ANISOTROPY_USED
|
||||
vec3 B, vec3 T, float anisotropy,
|
||||
|
@ -115,11 +81,11 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float atte
|
|||
float NdotV = dot(N, V);
|
||||
float cNdotV = max(NdotV, 0.0);
|
||||
|
||||
#if defined(DIFFUSE_BURLEY) || defined(SPECULAR_BLINN) || defined(SPECULAR_SCHLICK_GGX) || defined(LIGHT_CLEARCOAT_USED)
|
||||
#if defined(DIFFUSE_BURLEY) || defined(SPECULAR_SCHLICK_GGX) || defined(LIGHT_CLEARCOAT_USED)
|
||||
vec3 H = normalize(V + L);
|
||||
#endif
|
||||
|
||||
#if defined(SPECULAR_BLINN) || defined(SPECULAR_SCHLICK_GGX) || defined(LIGHT_CLEARCOAT_USED)
|
||||
#if defined(SPECULAR_SCHLICK_GGX)
|
||||
float cNdotH = clamp(A + dot(N, H), 0.0, 1.0);
|
||||
#endif
|
||||
|
||||
|
@ -203,26 +169,7 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float atte
|
|||
|
||||
// D
|
||||
|
||||
#if defined(SPECULAR_BLINN)
|
||||
|
||||
//normalized blinn
|
||||
float shininess = exp2(15.0 * (1.0 - roughness) + 1.0) * 0.25;
|
||||
float blinn = pow(cNdotH, shininess);
|
||||
blinn *= (shininess + 2.0) * (1.0 / (8.0 * M_PI));
|
||||
|
||||
specular_light += light_color * attenuation * specular_amount * blinn * f0 * orms_unpacked.w;
|
||||
|
||||
#elif defined(SPECULAR_PHONG)
|
||||
|
||||
vec3 R = normalize(-reflect(L, N));
|
||||
float cRdotV = clamp(A + dot(R, V), 0.0, 1.0);
|
||||
float shininess = exp2(15.0 * (1.0 - roughness) + 1.0) * 0.25;
|
||||
float phong = pow(cRdotV, shininess);
|
||||
phong *= (shininess + 1.0) * (1.0 / (8.0 * M_PI));
|
||||
|
||||
specular_light += light_color * attenuation * specular_amount * phong * f0 * orms_unpacked.w;
|
||||
|
||||
#elif defined(SPECULAR_TOON)
|
||||
#if defined(SPECULAR_TOON)
|
||||
|
||||
vec3 R = normalize(-reflect(L, N));
|
||||
float RdotV = dot(R, V);
|
||||
|
@ -236,24 +183,21 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float atte
|
|||
|
||||
#elif defined(SPECULAR_SCHLICK_GGX)
|
||||
// shlick+ggx as default
|
||||
|
||||
float alpha_ggx = roughness * roughness;
|
||||
#if defined(LIGHT_ANISOTROPY_USED)
|
||||
|
||||
float alpha_ggx = roughness * roughness;
|
||||
float aspect = sqrt(1.0 - anisotropy * 0.9);
|
||||
float ax = alpha_ggx / aspect;
|
||||
float ay = alpha_ggx * aspect;
|
||||
float XdotH = dot(T, H);
|
||||
float YdotH = dot(B, H);
|
||||
float D = D_GGX_anisotropic(cNdotH, ax, ay, XdotH, YdotH);
|
||||
float G = G_GGX_anisotropic_2cos(cNdotL, ax, ay, XdotH, YdotH) * G_GGX_anisotropic_2cos(cNdotV, ax, ay, XdotH, YdotH);
|
||||
|
||||
#else
|
||||
float alpha_ggx = roughness * roughness;
|
||||
float G = V_GGX_anisotropic(ax, ay, dot(T, V), dot(T, L), dot(B, V), dot(B, L), cNdotV, cNdotL);
|
||||
#else // LIGHT_ANISOTROPY_USED
|
||||
float D = D_GGX(cNdotH, alpha_ggx);
|
||||
float G = G_GGX_2cos(cNdotL, alpha_ggx) * G_GGX_2cos(cNdotV, alpha_ggx);
|
||||
#endif
|
||||
// F
|
||||
float G = V_GGX(cNdotL, cNdotV, alpha_ggx);
|
||||
#endif // LIGHT_ANISOTROPY_USED
|
||||
// F
|
||||
float cLdotH5 = SchlickFresnel(cLdotH);
|
||||
vec3 F = mix(vec3(cLdotH5), vec3(1.0), f0);
|
||||
|
||||
|
@ -263,18 +207,23 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float atte
|
|||
#endif
|
||||
|
||||
#if defined(LIGHT_CLEARCOAT_USED)
|
||||
// Clearcoat ignores normal_map, use vertex normal instead
|
||||
float ccNdotL = max(min(A + dot(vertex_normal, L), 1.0), 0.0);
|
||||
float ccNdotH = clamp(A + dot(vertex_normal, H), 0.0, 1.0);
|
||||
float ccNdotV = max(dot(vertex_normal, V), 0.0);
|
||||
|
||||
#if !defined(SPECULAR_SCHLICK_GGX)
|
||||
float cLdotH5 = SchlickFresnel(cLdotH);
|
||||
#endif
|
||||
float Dr = GTR1(cNdotH, mix(.1, .001, clearcoat_gloss));
|
||||
float Dr = D_GGX(ccNdotH, mix(0.001, 0.1, clearcoat_roughness));
|
||||
float Gr = 0.25 / (cLdotH * cLdotH);
|
||||
float Fr = mix(.04, 1.0, cLdotH5);
|
||||
float Gr = G_GGX_2cos(cNdotL, .25) * G_GGX_2cos(cNdotV, .25);
|
||||
|
||||
float clearcoat_specular_brdf_NL = 0.25 * clearcoat * Gr * Fr * Dr * cNdotL;
|
||||
float clearcoat_specular_brdf_NL = clearcoat * Gr * Fr * Dr * cNdotL;
|
||||
|
||||
specular_light += clearcoat_specular_brdf_NL * light_color * attenuation * specular_amount;
|
||||
#endif
|
||||
// TODO: Clearcoat adds light to the scene right now (it is non-energy conserving), both diffuse and specular need to be scaled by (1.0 - FR)
|
||||
// but to do so we need to rearrange this entire function
|
||||
#endif // LIGHT_CLEARCOAT_USED
|
||||
}
|
||||
|
||||
#ifdef USE_SHADOW_TO_OPACITY
|
||||
|
@ -587,7 +536,7 @@ void light_process_omni(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 v
|
|||
float rim, float rim_tint,
|
||||
#endif
|
||||
#ifdef LIGHT_CLEARCOAT_USED
|
||||
float clearcoat, float clearcoat_gloss,
|
||||
float clearcoat, float clearcoat_roughness, vec3 vertex_normal,
|
||||
#endif
|
||||
#ifdef LIGHT_ANISOTROPY_USED
|
||||
vec3 binormal, vec3 tangent, float anisotropy,
|
||||
|
@ -711,7 +660,7 @@ void light_process_omni(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 v
|
|||
rim * omni_attenuation, rim_tint,
|
||||
#endif
|
||||
#ifdef LIGHT_CLEARCOAT_USED
|
||||
clearcoat, clearcoat_gloss,
|
||||
clearcoat, clearcoat_roughness, vertex_normal,
|
||||
#endif
|
||||
#ifdef LIGHT_ANISOTROPY_USED
|
||||
binormal, tangent, anisotropy,
|
||||
|
@ -827,7 +776,7 @@ void light_process_spot(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 v
|
|||
float rim, float rim_tint,
|
||||
#endif
|
||||
#ifdef LIGHT_CLEARCOAT_USED
|
||||
float clearcoat, float clearcoat_gloss,
|
||||
float clearcoat, float clearcoat_roughness, vec3 vertex_normal,
|
||||
#endif
|
||||
#ifdef LIGHT_ANISOTROPY_USED
|
||||
vec3 binormal, vec3 tangent, float anisotropy,
|
||||
|
@ -912,7 +861,7 @@ void light_process_spot(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 v
|
|||
rim * spot_attenuation, rim_tint,
|
||||
#endif
|
||||
#ifdef LIGHT_CLEARCOAT_USED
|
||||
clearcoat, clearcoat_gloss,
|
||||
clearcoat, clearcoat_roughness, vertex_normal,
|
||||
#endif
|
||||
#ifdef LIGHT_ANISOTROPY_USED
|
||||
binormal, tangent, anisotropy,
|
||||
|
|
|
@ -511,8 +511,8 @@ layout(location = 0) out mediump vec4 frag_color;
|
|||
|
||||
#if !defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED)
|
||||
|
||||
/* Make a default specular mode SPECULAR_SCHLICK_GGX. */
|
||||
#if !defined(SPECULAR_DISABLED) && !defined(SPECULAR_SCHLICK_GGX) && !defined(SPECULAR_BLINN) && !defined(SPECULAR_PHONG) && !defined(SPECULAR_TOON)
|
||||
// Default to SPECULAR_SCHLICK_GGX.
|
||||
#if !defined(SPECULAR_DISABLED) && !defined(SPECULAR_SCHLICK_GGX) && !defined(SPECULAR_TOON)
|
||||
#define SPECULAR_SCHLICK_GGX
|
||||
#endif
|
||||
|
||||
|
@ -596,7 +596,7 @@ void main() {
|
|||
float rim = 0.0;
|
||||
float rim_tint = 0.0;
|
||||
float clearcoat = 0.0;
|
||||
float clearcoat_gloss = 0.0;
|
||||
float clearcoat_roughness = 0.0;
|
||||
float anisotropy = 0.0;
|
||||
vec2 anisotropy_flow = vec2(1.0, 0.0);
|
||||
vec4 fog = vec4(0.0);
|
||||
|
@ -874,7 +874,16 @@ void main() {
|
|||
#if !defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED)
|
||||
|
||||
if (scene_data.use_reflection_cubemap) {
|
||||
#ifdef LIGHT_ANISOTROPY_USED
|
||||
// https://google.github.io/filament/Filament.html#lighting/imagebasedlights/anisotropy
|
||||
vec3 anisotropic_direction = anisotropy >= 0.0 ? binormal : tangent;
|
||||
vec3 anisotropic_tangent = cross(anisotropic_direction, view);
|
||||
vec3 anisotropic_normal = cross(anisotropic_tangent, anisotropic_direction);
|
||||
vec3 bent_normal = normalize(mix(normal, anisotropic_normal, abs(anisotropy) * clamp(5.0 * roughness, 0.0, 1.0)));
|
||||
vec3 ref_vec = reflect(-view, bent_normal);
|
||||
#else
|
||||
vec3 ref_vec = reflect(-view, normal);
|
||||
#endif
|
||||
float horizon = min(1.0 + dot(ref_vec, normal), 1.0);
|
||||
ref_vec = scene_data.radiance_inverse_xform * ref_vec;
|
||||
#ifdef USE_RADIANCE_CUBEMAP_ARRAY
|
||||
|
@ -917,7 +926,35 @@ void main() {
|
|||
#if defined(CUSTOM_IRRADIANCE_USED)
|
||||
ambient_light = mix(specular_light, custom_irradiance.rgb, custom_irradiance.a);
|
||||
#endif // CUSTOM_IRRADIANCE_USED
|
||||
#ifdef LIGHT_CLEARCOAT_USED
|
||||
|
||||
if (scene_data.use_reflection_cubemap) {
|
||||
vec3 n = normalize(normal_interp); // We want to use geometric normal, not normal_map
|
||||
float NoV = max(dot(n, view), 0.0001);
|
||||
vec3 ref_vec = reflect(-view, n);
|
||||
// The clear coat layer assumes an IOR of 1.5 (4% reflectance)
|
||||
float Fc = clearcoat * (0.04 + 0.96 * SchlickFresnel(NoV));
|
||||
float attenuation = 1.0 - Fc;
|
||||
ambient_light *= attenuation;
|
||||
specular_light *= attenuation;
|
||||
|
||||
float horizon = min(1.0 + dot(ref_vec, normal), 1.0);
|
||||
ref_vec = scene_data.radiance_inverse_xform * ref_vec;
|
||||
float roughness_lod = mix(0.001, 0.1, clearcoat_roughness) * MAX_ROUGHNESS_LOD;
|
||||
#ifdef USE_RADIANCE_CUBEMAP_ARRAY
|
||||
|
||||
float lod, blend;
|
||||
blend = modf(roughness_lod, lod);
|
||||
vec3 clearcoat_light = texture(samplerCubeArray(radiance_cubemap, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), vec4(ref_vec, lod)).rgb;
|
||||
clearcoat_light = mix(clearcoat_light, texture(samplerCubeArray(radiance_cubemap, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), vec4(ref_vec, lod + 1)).rgb, blend);
|
||||
|
||||
#else
|
||||
vec3 clearcoat_light = textureLod(samplerCube(radiance_cubemap, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), ref_vec, roughness_lod).rgb;
|
||||
|
||||
#endif //USE_RADIANCE_CUBEMAP_ARRAY
|
||||
specular_light += clearcoat_light * horizon * horizon * Fc * scene_data.ambient_light_color_energy.a;
|
||||
}
|
||||
#endif
|
||||
#endif //!defined(MODE_RENDER_DEPTH) && !defined(MODE_UNSHADED)
|
||||
|
||||
//radiance
|
||||
|
@ -1002,8 +1039,16 @@ void main() {
|
|||
if (reflection_index == 0xFF) {
|
||||
break;
|
||||
}
|
||||
|
||||
reflection_process(reflection_index, vertex, normal, roughness, ambient_light, specular_light, ambient_accum, reflection_accum);
|
||||
#ifdef LIGHT_ANISOTROPY_USED
|
||||
// https://google.github.io/filament/Filament.html#lighting/imagebasedlights/anisotropy
|
||||
vec3 anisotropic_direction = anisotropy >= 0.0 ? binormal : tangent;
|
||||
vec3 anisotropic_tangent = cross(anisotropic_direction, view);
|
||||
vec3 anisotropic_normal = cross(anisotropic_tangent, anisotropic_direction);
|
||||
vec3 bent_normal = normalize(mix(normal, anisotropic_normal, abs(anisotropy) * clamp(5.0 * roughness, 0.0, 1.0)));
|
||||
#else
|
||||
vec3 bent_normal = normal;
|
||||
#endif
|
||||
reflection_process(reflection_index, vertex, bent_normal, roughness, ambient_light, specular_light, ambient_accum, reflection_accum);
|
||||
}
|
||||
|
||||
if (reflection_accum.a > 0.0) {
|
||||
|
@ -1368,7 +1413,7 @@ void main() {
|
|||
rim, rim_tint,
|
||||
#endif
|
||||
#ifdef LIGHT_CLEARCOAT_USED
|
||||
clearcoat, clearcoat_gloss,
|
||||
clearcoat, clearcoat_roughness, normalize(normal_interp),
|
||||
#endif
|
||||
#ifdef LIGHT_ANISOTROPY_USED
|
||||
binormal, tangent, anisotropy,
|
||||
|
@ -1415,10 +1460,11 @@ void main() {
|
|||
rim_tint,
|
||||
#endif
|
||||
#ifdef LIGHT_CLEARCOAT_USED
|
||||
clearcoat, clearcoat_gloss,
|
||||
clearcoat, clearcoat_roughness, normalize(normal_interp),
|
||||
#endif
|
||||
#ifdef LIGHT_ANISOTROPY_USED
|
||||
tangent, binormal, anisotropy,
|
||||
tangent,
|
||||
binormal, anisotropy,
|
||||
#endif
|
||||
diffuse_light, specular_light);
|
||||
}
|
||||
|
@ -1459,10 +1505,11 @@ void main() {
|
|||
rim_tint,
|
||||
#endif
|
||||
#ifdef LIGHT_CLEARCOAT_USED
|
||||
clearcoat, clearcoat_gloss,
|
||||
clearcoat, clearcoat_roughness, normalize(normal_interp),
|
||||
#endif
|
||||
#ifdef LIGHT_ANISOTROPY_USED
|
||||
tangent, binormal, anisotropy,
|
||||
tangent,
|
||||
binormal, anisotropy,
|
||||
#endif
|
||||
diffuse_light, specular_light);
|
||||
}
|
||||
|
|
|
@ -1373,148 +1373,4 @@ void ShaderCompiler::initialize(DefaultIdentifierActions p_actions) {
|
|||
}
|
||||
|
||||
ShaderCompiler::ShaderCompiler() {
|
||||
#if 0
|
||||
|
||||
/** SPATIAL SHADER **/
|
||||
|
||||
actions[RS::SHADER_SPATIAL].renames["WORLD_MATRIX"] = "world_transform";
|
||||
actions[RS::SHADER_SPATIAL].renames["INV_CAMERA_MATRIX"] = "camera_inverse_matrix";
|
||||
actions[RS::SHADER_SPATIAL].renames["CAMERA_MATRIX"] = "camera_matrix";
|
||||
actions[RS::SHADER_SPATIAL].renames["PROJECTION_MATRIX"] = "projection_matrix";
|
||||
actions[RS::SHADER_SPATIAL].renames["INV_PROJECTION_MATRIX"] = "inv_projection_matrix";
|
||||
actions[RS::SHADER_SPATIAL].renames["MODELVIEW_MATRIX"] = "modelview";
|
||||
|
||||
actions[RS::SHADER_SPATIAL].renames["VERTEX"] = "vertex.xyz";
|
||||
actions[RS::SHADER_SPATIAL].renames["NORMAL"] = "normal";
|
||||
actions[RS::SHADER_SPATIAL].renames["TANGENT"] = "tangent";
|
||||
actions[RS::SHADER_SPATIAL].renames["BINORMAL"] = "binormal";
|
||||
actions[RS::SHADER_SPATIAL].renames["POSITION"] = "position";
|
||||
actions[RS::SHADER_SPATIAL].renames["UV"] = "uv_interp";
|
||||
actions[RS::SHADER_SPATIAL].renames["UV2"] = "uv2_interp";
|
||||
actions[RS::SHADER_SPATIAL].renames["COLOR"] = "color_interp";
|
||||
actions[RS::SHADER_SPATIAL].renames["POINT_SIZE"] = "gl_PointSize";
|
||||
actions[RS::SHADER_SPATIAL].renames["INSTANCE_ID"] = "gl_InstanceID";
|
||||
|
||||
//builtins
|
||||
|
||||
actions[RS::SHADER_SPATIAL].renames["TIME"] = "time";
|
||||
actions[RS::SHADER_SPATIAL].renames["VIEWPORT_SIZE"] = "viewport_size";
|
||||
|
||||
actions[RS::SHADER_SPATIAL].renames["FRAGCOORD"] = "gl_FragCoord";
|
||||
actions[RS::SHADER_SPATIAL].renames["FRONT_FACING"] = "gl_FrontFacing";
|
||||
actions[RS::SHADER_SPATIAL].renames["NORMAL_MAP"] = "normal_map";
|
||||
actions[RS::SHADER_SPATIAL].renames["NORMAL_MAP_DEPTH"] = "normal_map_depth";
|
||||
actions[RS::SHADER_SPATIAL].renames["ALBEDO"] = "albedo";
|
||||
actions[RS::SHADER_SPATIAL].renames["ALPHA"] = "alpha";
|
||||
actions[RS::SHADER_SPATIAL].renames["METALLIC"] = "metallic";
|
||||
actions[RS::SHADER_SPATIAL].renames["SPECULAR"] = "specular";
|
||||
actions[RS::SHADER_SPATIAL].renames["ROUGHNESS"] = "roughness";
|
||||
actions[RS::SHADER_SPATIAL].renames["RIM"] = "rim";
|
||||
actions[RS::SHADER_SPATIAL].renames["RIM_TINT"] = "rim_tint";
|
||||
actions[RS::SHADER_SPATIAL].renames["CLEARCOAT"] = "clearcoat";
|
||||
actions[RS::SHADER_SPATIAL].renames["CLEARCOAT_GLOSS"] = "clearcoat_gloss";
|
||||
actions[RS::SHADER_SPATIAL].renames["ANISOTROPY"] = "anisotropy";
|
||||
actions[RS::SHADER_SPATIAL].renames["ANISOTROPY_FLOW"] = "anisotropy_flow";
|
||||
actions[RS::SHADER_SPATIAL].renames["SSS_STRENGTH"] = "sss_strength";
|
||||
actions[RS::SHADER_SPATIAL].renames["TRANSMISSION"] = "transmission";
|
||||
actions[RS::SHADER_SPATIAL].renames["AO"] = "ao";
|
||||
actions[RS::SHADER_SPATIAL].renames["AO_LIGHT_AFFECT"] = "ao_light_affect";
|
||||
actions[RS::SHADER_SPATIAL].renames["EMISSION"] = "emission";
|
||||
actions[RS::SHADER_SPATIAL].renames["POINT_COORD"] = "gl_PointCoord";
|
||||
actions[RS::SHADER_SPATIAL].renames["INSTANCE_CUSTOM"] = "instance_custom";
|
||||
actions[RS::SHADER_SPATIAL].renames["SCREEN_UV"] = "screen_uv";
|
||||
actions[RS::SHADER_SPATIAL].renames["SCREEN_TEXTURE"] = "screen_texture";
|
||||
actions[RS::SHADER_SPATIAL].renames["DEPTH_TEXTURE"] = "depth_buffer";
|
||||
actions[RS::SHADER_SPATIAL].renames["DEPTH"] = "gl_FragDepth";
|
||||
actions[RS::SHADER_SPATIAL].renames["ALPHA_SCISSOR"] = "alpha_scissor";
|
||||
actions[RS::SHADER_SPATIAL].renames["OUTPUT_IS_SRGB"] = "SHADER_IS_SRGB";
|
||||
|
||||
//for light
|
||||
actions[RS::SHADER_SPATIAL].renames["VIEW"] = "view";
|
||||
actions[RS::SHADER_SPATIAL].renames["LIGHT_COLOR"] = "light_color";
|
||||
actions[RS::SHADER_SPATIAL].renames["LIGHT"] = "light";
|
||||
actions[RS::SHADER_SPATIAL].renames["ATTENUATION"] = "attenuation";
|
||||
actions[RS::SHADER_SPATIAL].renames["DIFFUSE_LIGHT"] = "diffuse_light";
|
||||
actions[RS::SHADER_SPATIAL].renames["SPECULAR_LIGHT"] = "specular_light";
|
||||
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["TANGENT"] = "#define ENABLE_TANGENT_INTERP\n";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["BINORMAL"] = "@TANGENT";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["RIM"] = "#define LIGHT_USE_RIM\n";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["RIM_TINT"] = "@RIM";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["CLEARCOAT"] = "#define LIGHT_USE_CLEARCOAT\n";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["CLEARCOAT_GLOSS"] = "@CLEARCOAT";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["ANISOTROPY"] = "#define LIGHT_USE_ANISOTROPY\n";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["ANISOTROPY_FLOW"] = "@ANISOTROPY";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["AO"] = "#define ENABLE_AO\n";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["AO_LIGHT_AFFECT"] = "#define ENABLE_AO\n";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["UV"] = "#define ENABLE_UV_INTERP\n";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["UV2"] = "#define ENABLE_UV2_INTERP\n";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["NORMAL_MAP"] = "#define ENABLE_NORMAL_MAP\n";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["NORMAL_MAP_DEPTH"] = "@NORMAL_MAP";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["COLOR"] = "#define ENABLE_COLOR_INTERP\n";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["INSTANCE_CUSTOM"] = "#define ENABLE_INSTANCE_CUSTOM\n";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["ALPHA_SCISSOR"] = "#define ALPHA_SCISSOR_USED\n";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["POSITION"] = "#define OVERRIDE_POSITION\n";
|
||||
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["SSS_STRENGTH"] = "#define ENABLE_SSS\n";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["TRANSMISSION"] = "#define TRANSMISSION_USED\n";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["SCREEN_TEXTURE"] = "#define SCREEN_TEXTURE_USED\n";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["SCREEN_UV"] = "#define SCREEN_UV_USED\n";
|
||||
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["DIFFUSE_LIGHT"] = "#define USE_LIGHT_SHADER_CODE\n";
|
||||
actions[RS::SHADER_SPATIAL].usage_defines["SPECULAR_LIGHT"] = "#define USE_LIGHT_SHADER_CODE\n";
|
||||
|
||||
actions[RS::SHADER_SPATIAL].render_mode_defines["skip_vertex_transform"] = "#define SKIP_TRANSFORM_USED\n";
|
||||
actions[RS::SHADER_SPATIAL].render_mode_defines["world_vertex_coords"] = "#define VERTEX_WORLD_COORDS_USED\n";
|
||||
actions[RS::SHADER_SPATIAL].render_mode_defines["ensure_correct_normals"] = "#define ENSURE_CORRECT_NORMALS\n";
|
||||
actions[RS::SHADER_SPATIAL].render_mode_defines["cull_front"] = "#define DO_SIDE_CHECK\n";
|
||||
actions[RS::SHADER_SPATIAL].render_mode_defines["cull_disabled"] = "#define DO_SIDE_CHECK\n";
|
||||
|
||||
bool force_lambert = GLOBAL_GET("rendering/shading/overrides/force_lambert_over_burley");
|
||||
|
||||
if (!force_lambert) {
|
||||
actions[RS::SHADER_SPATIAL].render_mode_defines["diffuse_burley"] = "#define DIFFUSE_BURLEY\n";
|
||||
}
|
||||
|
||||
actions[RS::SHADER_SPATIAL].render_mode_defines["diffuse_lambert_wrap"] = "#define DIFFUSE_LAMBERT_WRAP\n";
|
||||
actions[RS::SHADER_SPATIAL].render_mode_defines["diffuse_toon"] = "#define DIFFUSE_TOON\n";
|
||||
|
||||
bool force_blinn = GLOBAL_GET("rendering/shading/overrides/force_blinn_over_ggx");
|
||||
|
||||
if (!force_blinn) {
|
||||
actions[RS::SHADER_SPATIAL].render_mode_defines["specular_schlick_ggx"] = "#define SPECULAR_SCHLICK_GGX\n";
|
||||
} else {
|
||||
actions[RS::SHADER_SPATIAL].render_mode_defines["specular_schlick_ggx"] = "#define SPECULAR_BLINN\n";
|
||||
}
|
||||
|
||||
actions[RS::SHADER_SPATIAL].render_mode_defines["specular_blinn"] = "#define SPECULAR_BLINN\n";
|
||||
actions[RS::SHADER_SPATIAL].render_mode_defines["specular_phong"] = "#define SPECULAR_PHONG\n";
|
||||
actions[RS::SHADER_SPATIAL].render_mode_defines["specular_toon"] = "#define SPECULAR_TOON\n";
|
||||
actions[RS::SHADER_SPATIAL].render_mode_defines["specular_disabled"] = "#define SPECULAR_DISABLED\n";
|
||||
actions[RS::SHADER_SPATIAL].render_mode_defines["shadows_disabled"] = "#define SHADOWS_DISABLED\n";
|
||||
actions[RS::SHADER_SPATIAL].render_mode_defines["ambient_light_disabled"] = "#define AMBIENT_LIGHT_DISABLED\n";
|
||||
actions[RS::SHADER_SPATIAL].render_mode_defines["shadow_to_opacity"] = "#define USE_SHADOW_TO_OPACITY\n";
|
||||
|
||||
/* PARTICLES SHADER */
|
||||
|
||||
actions[RS::SHADER_PARTICLES].renames["COLOR"] = "out_color";
|
||||
actions[RS::SHADER_PARTICLES].renames["VELOCITY"] = "out_velocity_active.xyz";
|
||||
actions[RS::SHADER_PARTICLES].renames["MASS"] = "mass";
|
||||
actions[RS::SHADER_PARTICLES].renames["ACTIVE"] = "shader_active";
|
||||
actions[RS::SHADER_PARTICLES].renames["RESTART"] = "restart";
|
||||
actions[RS::SHADER_PARTICLES].renames["CUSTOM"] = "out_custom";
|
||||
actions[RS::SHADER_PARTICLES].renames["TRANSFORM"] = "xform";
|
||||
actions[RS::SHADER_PARTICLES].renames["TIME"] = "time";
|
||||
actions[RS::SHADER_PARTICLES].renames["LIFETIME"] = "lifetime";
|
||||
actions[RS::SHADER_PARTICLES].renames["DELTA"] = "local_delta";
|
||||
actions[RS::SHADER_PARTICLES].renames["NUMBER"] = "particle_number";
|
||||
actions[RS::SHADER_PARTICLES].renames["INDEX"] = "index";
|
||||
actions[RS::SHADER_PARTICLES].renames["GRAVITY"] = "current_gravity";
|
||||
actions[RS::SHADER_PARTICLES].renames["EMISSION_TRANSFORM"] = "emission_transform";
|
||||
actions[RS::SHADER_PARTICLES].renames["RANDOM_SEED"] = "random_seed";
|
||||
|
||||
actions[RS::SHADER_PARTICLES].render_mode_defines["disable_force"] = "#define DISABLE_FORCE\n";
|
||||
actions[RS::SHADER_PARTICLES].render_mode_defines["disable_velocity"] = "#define DISABLE_VELOCITY\n";
|
||||
actions[RS::SHADER_PARTICLES].render_mode_defines["keep_data"] = "#define ENABLE_KEEP_DATA\n";
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -121,7 +121,7 @@ ShaderTypes::ShaderTypes() {
|
|||
shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["RIM"] = ShaderLanguage::TYPE_FLOAT;
|
||||
shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["RIM_TINT"] = ShaderLanguage::TYPE_FLOAT;
|
||||
shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["CLEARCOAT"] = ShaderLanguage::TYPE_FLOAT;
|
||||
shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["CLEARCOAT_GLOSS"] = ShaderLanguage::TYPE_FLOAT;
|
||||
shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["CLEARCOAT_ROUGHNESS"] = ShaderLanguage::TYPE_FLOAT;
|
||||
shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["ANISOTROPY"] = ShaderLanguage::TYPE_FLOAT;
|
||||
shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["ANISOTROPY_FLOW"] = ShaderLanguage::TYPE_VEC2;
|
||||
shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["SSS_STRENGTH"] = ShaderLanguage::TYPE_FLOAT;
|
||||
|
@ -202,7 +202,7 @@ ShaderTypes::ShaderTypes() {
|
|||
shader_modes[RS::SHADER_SPATIAL].modes.push_back({ "unshaded" });
|
||||
shader_modes[RS::SHADER_SPATIAL].modes.push_back({ "wireframe" });
|
||||
shader_modes[RS::SHADER_SPATIAL].modes.push_back({ "diffuse", "lambert", "lambert_wrap", "burley", "toon" });
|
||||
shader_modes[RS::SHADER_SPATIAL].modes.push_back({ "specular", "schlick_ggx", "blinn", "phong", "toon", "disabled" });
|
||||
shader_modes[RS::SHADER_SPATIAL].modes.push_back({ "specular", "schlick_ggx", "toon", "disabled" });
|
||||
shader_modes[RS::SHADER_SPATIAL].modes.push_back({ "skip_vertex_transform" });
|
||||
shader_modes[RS::SHADER_SPATIAL].modes.push_back({ "world_vertex_coords" });
|
||||
shader_modes[RS::SHADER_SPATIAL].modes.push_back({ "ensure_correct_normals" });
|
||||
|
|
|
@ -2879,8 +2879,6 @@ RenderingServer::RenderingServer() {
|
|||
GLOBAL_DEF("rendering/shading/overrides/force_vertex_shading.mobile", true);
|
||||
GLOBAL_DEF("rendering/shading/overrides/force_lambert_over_burley", false);
|
||||
GLOBAL_DEF("rendering/shading/overrides/force_lambert_over_burley.mobile", true);
|
||||
GLOBAL_DEF("rendering/shading/overrides/force_blinn_over_ggx", false);
|
||||
GLOBAL_DEF("rendering/shading/overrides/force_blinn_over_ggx.mobile", true);
|
||||
|
||||
GLOBAL_DEF("rendering/driver/depth_prepass/enable", true);
|
||||
|
||||
|
|
Loading…
Reference in New Issue