mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	gl_rasterizer/lighting: implement geometric factor
This commit is contained in:
		@@ -168,6 +168,8 @@ struct LightingRegs {
 | 
				
			|||||||
        union {
 | 
					        union {
 | 
				
			||||||
            BitField<0, 1, u32> directional;
 | 
					            BitField<0, 1, u32> directional;
 | 
				
			||||||
            BitField<1, 1, u32> two_sided_diffuse; // When disabled, clamp dot-product to 0
 | 
					            BitField<1, 1, u32> two_sided_diffuse; // When disabled, clamp dot-product to 0
 | 
				
			||||||
 | 
					            BitField<2, 1, u32> geometric_factor_0;
 | 
				
			||||||
 | 
					            BitField<3, 1, u32> geometric_factor_1;
 | 
				
			||||||
        } config;
 | 
					        } config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        BitField<0, 20, u32> dist_atten_bias;
 | 
					        BitField<0, 20, u32> dist_atten_bias;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -73,6 +73,8 @@ PicaShaderConfig PicaShaderConfig::BuildFromRegs(const Pica::Regs& regs) {
 | 
				
			|||||||
        state.lighting.light[light_index].num = num;
 | 
					        state.lighting.light[light_index].num = num;
 | 
				
			||||||
        state.lighting.light[light_index].directional = light.config.directional != 0;
 | 
					        state.lighting.light[light_index].directional = light.config.directional != 0;
 | 
				
			||||||
        state.lighting.light[light_index].two_sided_diffuse = light.config.two_sided_diffuse != 0;
 | 
					        state.lighting.light[light_index].two_sided_diffuse = light.config.two_sided_diffuse != 0;
 | 
				
			||||||
 | 
					        state.lighting.light[light_index].geometric_factor_0 = light.config.geometric_factor_0 != 0;
 | 
				
			||||||
 | 
					        state.lighting.light[light_index].geometric_factor_1 = light.config.geometric_factor_1 != 0;
 | 
				
			||||||
        state.lighting.light[light_index].dist_atten_enable =
 | 
					        state.lighting.light[light_index].dist_atten_enable =
 | 
				
			||||||
            !regs.lighting.IsDistAttenDisabled(num);
 | 
					            !regs.lighting.IsDistAttenDisabled(num);
 | 
				
			||||||
        state.lighting.light[light_index].spot_atten_enable =
 | 
					        state.lighting.light[light_index].spot_atten_enable =
 | 
				
			||||||
@@ -518,7 +520,8 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
 | 
				
			|||||||
           "vec4 specular_sum = vec4(0.0, 0.0, 0.0, 1.0);\n"
 | 
					           "vec4 specular_sum = vec4(0.0, 0.0, 0.0, 1.0);\n"
 | 
				
			||||||
           "vec3 light_vector = vec3(0.0);\n"
 | 
					           "vec3 light_vector = vec3(0.0);\n"
 | 
				
			||||||
           "vec3 refl_value = vec3(0.0);\n"
 | 
					           "vec3 refl_value = vec3(0.0);\n"
 | 
				
			||||||
           "vec3 spot_dir = vec3(0.0);\n;";
 | 
					           "vec3 spot_dir = vec3(0.0);\n"
 | 
				
			||||||
 | 
					           "float geo_factor = 1.0;\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Compute fragment normals and tangents
 | 
					    // Compute fragment normals and tangents
 | 
				
			||||||
    const std::string pertubation =
 | 
					    const std::string pertubation =
 | 
				
			||||||
@@ -671,6 +674,12 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
 | 
				
			|||||||
        std::string clamp_highlights =
 | 
					        std::string clamp_highlights =
 | 
				
			||||||
            lighting.clamp_highlights ? "(dot(light_vector, normal) <= 0.0 ? 0.0 : 1.0)" : "1.0";
 | 
					            lighting.clamp_highlights ? "(dot(light_vector, normal) <= 0.0 ? 0.0 : 1.0)" : "1.0";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (light_config.geometric_factor_0 || light_config.geometric_factor_1) {
 | 
				
			||||||
 | 
					            out += "geo_factor = 1 + dot(light_vector, normalize(view));\n"
 | 
				
			||||||
 | 
					                   "geo_factor = geo_factor == 0.0 ? 0.0 : min(0.5 * " +
 | 
				
			||||||
 | 
					                   dot_product + " / geo_factor, 1.0);\n";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Specular 0 component
 | 
					        // Specular 0 component
 | 
				
			||||||
        std::string d0_lut_value = "1.0";
 | 
					        std::string d0_lut_value = "1.0";
 | 
				
			||||||
        if (lighting.lut_d0.enable &&
 | 
					        if (lighting.lut_d0.enable &&
 | 
				
			||||||
@@ -683,6 +692,9 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
 | 
				
			|||||||
                           GetLutValue(LightingRegs::LightingSampler::Distribution0, index) + ")";
 | 
					                           GetLutValue(LightingRegs::LightingSampler::Distribution0, index) + ")";
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        std::string specular_0 = "(" + d0_lut_value + " * " + light_src + ".specular_0)";
 | 
					        std::string specular_0 = "(" + d0_lut_value + " * " + light_src + ".specular_0)";
 | 
				
			||||||
 | 
					        if (light_config.geometric_factor_0) {
 | 
				
			||||||
 | 
					            specular_0 = "(" + specular_0 + " * geo_factor)";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // If enabled, lookup ReflectRed value, otherwise, 1.0 is used
 | 
					        // If enabled, lookup ReflectRed value, otherwise, 1.0 is used
 | 
				
			||||||
        if (lighting.lut_rr.enable &&
 | 
					        if (lighting.lut_rr.enable &&
 | 
				
			||||||
@@ -738,6 +750,9 @@ static void WriteLighting(std::string& out, const PicaShaderConfig& config) {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        std::string specular_1 =
 | 
					        std::string specular_1 =
 | 
				
			||||||
            "(" + d1_lut_value + " * refl_value * " + light_src + ".specular_1)";
 | 
					            "(" + d1_lut_value + " * refl_value * " + light_src + ".specular_1)";
 | 
				
			||||||
 | 
					        if (light_config.geometric_factor_1) {
 | 
				
			||||||
 | 
					            specular_1 = "(" + specular_1 + " * geo_factor)";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Fresnel
 | 
					        // Fresnel
 | 
				
			||||||
        if (lighting.lut_fr.enable &&
 | 
					        if (lighting.lut_fr.enable &&
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -94,6 +94,8 @@ union PicaShaderConfig {
 | 
				
			|||||||
                bool two_sided_diffuse;
 | 
					                bool two_sided_diffuse;
 | 
				
			||||||
                bool dist_atten_enable;
 | 
					                bool dist_atten_enable;
 | 
				
			||||||
                bool spot_atten_enable;
 | 
					                bool spot_atten_enable;
 | 
				
			||||||
 | 
					                bool geometric_factor_0;
 | 
				
			||||||
 | 
					                bool geometric_factor_1;
 | 
				
			||||||
            } light[8];
 | 
					            } light[8];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            bool enable;
 | 
					            bool enable;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user