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); |                 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…
	
	Add table
		Add a link
		
	
		Reference in a new issue