mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	Merge pull request #2871 from wwylele/sw-spotlight
SwRasterizer/Lighting: implement spot light
This commit is contained in:
		
						commit
						8afa81ac1b
					
				@ -95,6 +95,12 @@ std::tuple<Math::Vec4<u8>, Math::Vec4<u8>> ComputeFragmentsColors(
 | 
				
			|||||||
                result = Math::Dot(light_vector, normal);
 | 
					                result = Math::Dot(light_vector, normal);
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            case LightingRegs::LightingLutInput::SP: {
 | 
				
			||||||
 | 
					                Math::Vec3<s32> spot_dir{light_config.spot_x.Value(), light_config.spot_y.Value(),
 | 
				
			||||||
 | 
					                                         light_config.spot_z.Value()};
 | 
				
			||||||
 | 
					                result = Math::Dot(light_vector, spot_dir.Cast<float>() / 2047.0f);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            default:
 | 
					            default:
 | 
				
			||||||
                LOG_CRITICAL(HW_GPU, "Unknown lighting LUT input %u\n", static_cast<u32>(input));
 | 
					                LOG_CRITICAL(HW_GPU, "Unknown lighting LUT input %u\n", static_cast<u32>(input));
 | 
				
			||||||
                UNIMPLEMENTED();
 | 
					                UNIMPLEMENTED();
 | 
				
			||||||
@ -125,6 +131,16 @@ std::tuple<Math::Vec4<u8>, Math::Vec4<u8>> ComputeFragmentsColors(
 | 
				
			|||||||
                   LookupLightingLut(lighting_state, static_cast<size_t>(sampler), index, delta);
 | 
					                   LookupLightingLut(lighting_state, static_cast<size_t>(sampler), index, delta);
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // If enabled, compute spot light attenuation value
 | 
				
			||||||
 | 
					        float spot_atten = 1.0f;
 | 
				
			||||||
 | 
					        if (!lighting.IsSpotAttenDisabled(num) &&
 | 
				
			||||||
 | 
					            LightingRegs::IsLightingSamplerSupported(
 | 
				
			||||||
 | 
					                lighting.config0.config, LightingRegs::LightingSampler::SpotlightAttenuation)) {
 | 
				
			||||||
 | 
					            auto lut = LightingRegs::SpotlightAttenuationSampler(num);
 | 
				
			||||||
 | 
					            spot_atten = GetLutValue(lighting.lut_input.sp, lighting.abs_lut_input.disable_sp == 0,
 | 
				
			||||||
 | 
					                                     lighting.lut_scale.sp, lut);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Specular 0 component
 | 
					        // Specular 0 component
 | 
				
			||||||
        float d0_lut_value = 1.0f;
 | 
					        float d0_lut_value = 1.0f;
 | 
				
			||||||
        if (lighting.config1.disable_lut_d0 == 0 &&
 | 
					        if (lighting.config1.disable_lut_d0 == 0 &&
 | 
				
			||||||
@ -226,10 +242,10 @@ std::tuple<Math::Vec4<u8>, Math::Vec4<u8>> ComputeFragmentsColors(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        auto diffuse =
 | 
					        auto diffuse =
 | 
				
			||||||
            light_config.diffuse.ToVec3f() * dot_product + light_config.ambient.ToVec3f();
 | 
					            light_config.diffuse.ToVec3f() * dot_product + light_config.ambient.ToVec3f();
 | 
				
			||||||
        diffuse_sum += Math::MakeVec(diffuse * dist_atten, 0.0f);
 | 
					        diffuse_sum += Math::MakeVec(diffuse * dist_atten * spot_atten, 0.0f);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        specular_sum +=
 | 
					        specular_sum += Math::MakeVec(
 | 
				
			||||||
            Math::MakeVec((specular_0 + specular_1) * clamp_highlights * dist_atten, 0.0f);
 | 
					            (specular_0 + specular_1) * clamp_highlights * dist_atten * spot_atten, 0.0f);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    diffuse_sum += Math::MakeVec(lighting.global_ambient.ToVec3f(), 0.0f);
 | 
					    diffuse_sum += Math::MakeVec(lighting.global_ambient.ToVec3f(), 0.0f);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user