mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	SwRasterizer/Lighting: implement spot light
This commit is contained in:
		
							parent
							
								
									aaf5161344
								
							
						
					
					
						commit
						945f9a1b04
					
				
					 1 changed files with 19 additions and 3 deletions
				
			
		|  | @ -95,6 +95,12 @@ std::tuple<Math::Vec4<u8>, Math::Vec4<u8>> ComputeFragmentsColors( | |||
|                 result = Math::Dot(light_vector, normal); | ||||
|                 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: | ||||
|                 LOG_CRITICAL(HW_GPU, "Unknown lighting LUT input %u\n", static_cast<u32>(input)); | ||||
|                 UNIMPLEMENTED(); | ||||
|  | @ -125,6 +131,16 @@ std::tuple<Math::Vec4<u8>, Math::Vec4<u8>> ComputeFragmentsColors( | |||
|                    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
 | ||||
|         float d0_lut_value = 1.0f; | ||||
|         if (lighting.config1.disable_lut_d0 == 0 && | ||||
|  | @ -226,10 +242,10 @@ std::tuple<Math::Vec4<u8>, Math::Vec4<u8>> ComputeFragmentsColors( | |||
| 
 | ||||
|         auto diffuse = | ||||
|             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 += | ||||
|             Math::MakeVec((specular_0 + specular_1) * clamp_highlights * dist_atten, 0.0f); | ||||
|         specular_sum += Math::MakeVec( | ||||
|             (specular_0 + specular_1) * clamp_highlights * dist_atten * spot_atten, 0.0f); | ||||
|     } | ||||
| 
 | ||||
|     diffuse_sum += Math::MakeVec(lighting.global_ambient.ToVec3f(), 0.0f); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue