summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSubv <subv2112@gmail.com>2017-06-09 21:55:54 +0200
committerwwylele <wwylele@gmail.com>2017-07-11 18:39:15 +0200
commit10b0bea06008fea89564dc5ef8895c0274f8ef18 (patch)
treed32aea17963c7e01ad447270423ca22475f1cc34
parentSwRasterizer: Calculate specular_1 for fragment lighting. (diff)
downloadyuzu-10b0bea06008fea89564dc5ef8895c0274f8ef18.tar
yuzu-10b0bea06008fea89564dc5ef8895c0274f8ef18.tar.gz
yuzu-10b0bea06008fea89564dc5ef8895c0274f8ef18.tar.bz2
yuzu-10b0bea06008fea89564dc5ef8895c0274f8ef18.tar.lz
yuzu-10b0bea06008fea89564dc5ef8895c0274f8ef18.tar.xz
yuzu-10b0bea06008fea89564dc5ef8895c0274f8ef18.tar.zst
yuzu-10b0bea06008fea89564dc5ef8895c0274f8ef18.zip
-rw-r--r--src/video_core/swrasterizer/rasterizer.cpp26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/video_core/swrasterizer/rasterizer.cpp b/src/video_core/swrasterizer/rasterizer.cpp
index e0c326a4a..2d1daa24a 100644
--- a/src/video_core/swrasterizer/rasterizer.cpp
+++ b/src/video_core/swrasterizer/rasterizer.cpp
@@ -310,7 +310,31 @@ std::tuple<Math::Vec4<u8>, Math::Vec4<u8>> ComputeFragmentsColors(const Math::Qu
Math::Vec3<float> specular_1 = d1_lut_value * refl_value * light_config.specular_1.ToVec3f();
- // TODO(Subv): Fresnel
+ if (lighting.config1.disable_lut_fr == 0 &&
+ LightingRegs::IsLightingSamplerSupported(
+ lighting.config0.config, LightingRegs::LightingSampler::Fresnel)) {
+
+ // Lookup fresnel LUT value
+ float index = GetLutIndex(num, lighting.lut_input.fr.Value(), lighting.abs_lut_input.disable_fr == 0);
+
+ float scale = lighting.lut_scale.GetScale(lighting.lut_scale.fr);
+
+ float lut_value = scale * LookupLightingLut(static_cast<size_t>(LightingRegs::LightingSampler::Fresnel), index);
+
+ // Enabled for difffuse lighting alpha component
+ if (lighting.config0.fresnel_selector == LightingRegs::LightingFresnelSelector::PrimaryAlpha ||
+ lighting.config0.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
+ diffuse_sum.a() *= lut_value;
+ }
+
+ // Enabled for the specular lighting alpha component
+ if (lighting.config0.fresnel_selector ==
+ LightingRegs::LightingFresnelSelector::SecondaryAlpha ||
+ lighting.config0.fresnel_selector == LightingRegs::LightingFresnelSelector::Both) {
+ specular_sum.a() *= lut_value;
+ }
+ }
+
auto diffuse = light_config.diffuse.ToVec3f() * dot_product + light_config.ambient.ToVec3f();
diffuse_sum += Math::MakeVec(diffuse * dist_atten, 0.0f);