From 8b8b9c456be7fa452504bf1caf486cb5c88fb765 Mon Sep 17 00:00:00 2001 From: Eric Undersander Date: Fri, 4 Sep 2020 00:32:45 +0200 Subject: [PATCH] Shaders: remove incorrect light direction normalization in Phong.vert. Adapted slight changes in existing tests, the new ground truth now passes. --- doc/changelog.dox | 3 +++ .../Test/CompileTestFiles/phong-flat.tga | Bin 4114 -> 2998 bytes .../Test/CompileTestFiles/phong-smooth.tga | Bin 4114 -> 2953 bytes .../MeshTools/Test/CompileTestFiles/phong.tga | Bin 4114 -> 3000 bytes src/Magnum/Shaders/Phong.vert | 2 +- .../Shaders/Test/PhongTestFiles/defaults.tga | Bin 19218 -> 15082 bytes .../Test/PhongTestFiles/textured-normal.tga | Bin 19218 -> 11108 bytes 7 files changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/changelog.dox b/doc/changelog.dox index 0c543693c..39eef6aa9 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -145,6 +145,9 @@ See also: - For meshes with multiple sets of vertex attributes (such as texture coordinates), @ref MeshTools::compile() should be using only the first set but it wasn't. +- @ref Shaders::Phong was normalizing light direction in vertex shader, + causing the fragment-interpolated direction being incorrect with visible + artifacts on long polygons under low light angle @subsection changelog-latest-deprecated Deprecated APIs diff --git a/src/Magnum/MeshTools/Test/CompileTestFiles/phong-flat.tga b/src/Magnum/MeshTools/Test/CompileTestFiles/phong-flat.tga index 3b9e47aba95a324b81751199473a27f97cbb920a..4947cdb13de8fb27eb46ed96a72666ddf1e8eebc 100644 GIT binary patch literal 2998 zcmZ{m*-lhJ6h-^d_~fJE1)qSXf%Zcb(FPm<`4%TE04)j$E5dE7x`1m`g`* z>bj-tb~kN&SxOt97t^Uvx;`wXlkauCTSzC~ETrSF77`CR&&N4F_8+=9lMY{+Nz0d; z$HpV?bkniBy6$z;;C|QG&96cP=3~Zyc&qERFfV&){dq5~J?$BHc7!vkt{#l4J_aTu z1`p=b>O)M`@wI}ngbnRKsN+}0Zw|)ruO-fOV zp%aiTPRgj(in1Cjc`O7NAuwkBMb9Ro6xBwmL?c7#1Z2Tk;uKK`br?v0Fb&jtM$rq} zPG5+?s!AEi+<~y%Lu|Hw_D2Rc*oe%T!k!|1wMrBkDP;vG6ulvN^a zrxjv_9aBpGqy&{9QD&S_gq~h808V0{<;*0s`y0a|bc3~0nM9w)lwztB29Ah$C={2m zAwYGDj%aC!B33Pyv95bsDaBB31IJL1(k;cNjCssojn=bPB4UwfIn`jg8{)r6cweY1o^w4w*U0gM%6Pf zH&o|dlkhTFtdFd?#cI^c(6k2Y@k9e-Q3-PU@4?|ZsL^@hk#G+eGfleXB#}jNgXLHJ zsWzKid4$s(%GDoKQU+*BpcG2tcNpm<$ZD5*myn~zN@=mVclGRIl=~cLJ<6tMw2?C0 zD}rT6|5$|dTV>KH);yD8!_~+JOO@P4`+ZnpdOJ*ch68Pt>a`bQ?j3{1z_F2hx+r2^ zpxNvei-Ibxgn!qP%o~gNfW}ycDNdT0&4|~S!3>mA-C)ONlf-IJSacq$dOrtRCVB(O zp*UqGDXk5rfi0Fnsp5j!^lTzJ_nO9_koz1Xj_({L2C1YuuMQ&HV8b}iXf}HyI>!tH zK{-BwQ$O3aQO_>NO@sA;rrV3zlh7}rO zYpnWA#LCgHHDFa55T{kjy%beSIRs-ls-K~kv{Tbgt`hxl@pOMzhIeRUU2jnObdk1)ds`&j8gx2?Q3vUx(k_89C7m6 z5SGUj1mmtgk!;k|7*v7crMBRPug#839&^V=q4#D|55Zs}k3<=!jy*OfZ#Q*>R literal 4114 zcmeH~*KQO+6htk4#601!4*ZC7SO*MzDkA5cbIyoQXzG;vwtIKoUh{y&gF!7zW@f5x zRo$9lWaQXL{5d|t-_g<0baeh-4dyS5rG-m6m&eoM6`gD2Y3aJojfu2$b0TejoJrds zrqkAYop;k|^Nr5yskHHODs^8>{k6Aq=T4-#^J8iL;x29vrtp?;>D-=3D|dA6PNoHM zI`v5$Y94QQd2GBA4{_)|>!kH3owW9-Gn5b5p7rY9oIRNLCe!MDod=U?O$RL&b?vDy zGrc_ewa6TXWu3Ws9@>KIIcv;^!qpt>k9TK63%tOWov-5XIrGS#Y@$W@Ar8av@tT>y zUImvq!OVE;PdnDL`&_!}a19)n#h3fcq0)j}6b?i3K-Tb^d3Yw+p0mQlPqKx#%mp|6 zAPaCdhi|hzewc%D$vp>UlG)MGx@#_;?Ron!$@rFZCGU|dxHdW9Ma~1Io#FZD#=L>Kt$kzX$eQ;&bHJ+s4mp!> z4Ii5L`)H5f_>6u$!}(Ue$k~p3MwjrlD;=5~=!on?3%^Hu?O2cYXwJ-F3-|PQogcG% zzUFKVcp*K>6!(P&P5i#x_iK;l%nkOLpE|#0%S=Uw$b_rRT zdriib757l~gPn5!!htTL`{*EXU~XgQ&Lg9-XWmWq2mHxG_|U|!bY&L%z&l8pfCF=| zV>Jgf_uS&#uRXi#eNYZo$bp{4TrGUh#Gd6nZ*eGIC=c!fH0S6(?|7}fvg1xddv;Oz zYU0x~x#!$(dDr`OC|=0hf+^nk!TsJvaic%n%a!(Yd<(zyeC0#*%>V~7so82w@=iAF zdqaEPaV`AX*OEo)x-SRzLcZ3R{??Kv{@$v)I66q$^Nw%f^ZV#~z8MBML?+n_J(F%> zCw-(fx$yf~Id%6av+ke#U2xFs!KrkjP7~{4FGo9pAPs-1xn_j=qIM z-8JEdwD5i^7j!k<;5h?Rvl>$xv1@3~++g!9zm> diff --git a/src/Magnum/MeshTools/Test/CompileTestFiles/phong-smooth.tga b/src/Magnum/MeshTools/Test/CompileTestFiles/phong-smooth.tga index ddc81ed349947ea38b6b56e135039b658d42fc6e..07f653f909e15bdfb14fb89fe73125883ef2d047 100644 GIT binary patch literal 2953 zcmai$$!Zi)6oy;Hn2zlWWD|F4G?POF@dX4Ci9;L`6Qc$N!3R)~QZRd$Zt?-=y6m38TmQ0oZ)bqLv_o=WwG_r@)($!o|nhD zb?}zPomH{xuExDpk#SfssI$S_`h}riGY&02)BQUc#6nD(2f(R1${2<3&_QStX5IZj z<55@ad93lID>4rAIotiPD|X!n?t|`KNIXD^4_UC9I7oqE8M>AEnQiY=jpyAl^g`oh zcVrxDob7$qZSo#P0n#URB#B*?Jl9)8sm``&20?TL&-jWe$D zD|eyPvJ=u$KJ>|EE(0=$opQ0F#Nj5y73`_ zlf$+(Pan{%Ah)9sD=~sttqx@pWZ0+P*#BAMOJ9tAogRGW8Zj7;ZfR~X8iO%cVwk@X zyO<1;WONcSk7FOm{UAYo>x%>5HGcF(#-YX)f-qcn+Hk;VP8F4Bl=5kWw%c4XseDi> z7>lW+2?*@x>NxmI<99yvoon#Hm(f%hRwtXOlG(5-VlrTRmCr(_EVM?D!j1n~6NjTe zj>LNXUl)gTPAFwGc01FQmt;`G#?G*~ow{{asafn*M#&i2!&asSc{Db}@z@j-u{}=4 z<~SA`WBl*hI$DPF9M6*`6dOBhX6M9`HAS907n7UpW%X)3fEsxq{)XHS0 z1_3I42!T)t2}hjclF_NOkTi!{w+R`7F|K5l2GyBL3M0uS#)1Zk;TTT>{)?SiQtr9( zpY&4(UbT5y6-HB5Dj(3OMkPqfjB>NdDnFZ?msNw>Ij~w=#;WMuqtxywjY4s5HmWgv zdJ*+cBQdyKQcbyKan52gOPRF=mdZo17m~`tIZkE^Jy+WpLn(Pxi=ow!C|VCKh`DE$ zRIR`&^~UBex6~pFw5D~gg?D>g%&PXX(JwSnnrXR3(rjtEG~cGySY#HcZlkxL*TqHi zpf}5IHxTJ2dt{u!cellaq)|wxUx5mq8fJc8HI3LM#wsE*P}r}ZrYvSM&PB0 z5d8XULm#GEBS6-wg0@cDgcc_+)dK2GQH@ux^NQA#TlD5&mlt47$<)C8g0ChJsj#{P zBa!MOAUT$PhAZ8?kY=lr&hb^LrT|P-6wo0Xk zlzOK%KNS^Lc{f(|yHkN+9QV4%CX5VZZ`X)w!CT{Wn+*ji&xz3c#*DLh^hRd%2D9pY xh;H!qP7g8(Re=;3Y*!18cf=WLGc@^I1!Og`%R6JP;fklrbMB4sBoo#T{{RCOk$wOG literal 4114 zcmeH~xpLG{5Jji>5t9Kn-fbY_7YukE?+eBSB=8H6kdTw|5k$l!1TGe{@4MNGeW%>q z(|S*q21_yo6oH58^30R;?(N&R`-xg@Q!Rcr*Z9}e)MOj+|7x&rahvsDY_@^R%{I8C zxYA-nSCim-Zta@Zv!VO`w6=Zcw%FeDTMgWSO94-N4&P|8kz3nsL2&E#=h64NmY-4sfW# zCvSLqzS?W_eu6drq|L^kw%NpTKE|JEUDx2my>&u->UR^~=tT~ZLlr)nlQ;R0+ZedQ zn0Vf9lP}wC>XqX4YE0_)zeodmj5@&?Ezz9396R97ed)BhuU)I5-?N_+J~Qvd6Ar40bHEcB zf6^c1SA>u6(1~a88o98a=dGN<-TzJTz02l*5Z(TrHF%+mYY}unKm33v@lz$fYL8Al z1An|mebJo#!2xq&rN<80PCIP7?4a$i13!D52mG9abnsf>2Ryk>eC8TFslDR|?b*|F zSKeSBvE6pe`s}2Q+Hu=sNA-JQr8nUabZ|fD`B;ZE{}TVLg^$l8KAMv^*k|p8E!!De zveS0T=ADDS!@w;7f@&-G8;D8R)0&ln%R5NOa7u^T) z6y7SE!8!lYdyVzi-e77Su10ARZnv*x!J`dt72=%9j=>dA0-Y(Oh*%a}a89Wnba9Rg?G0XyZfQjaO_c;`2 z05dtxA$1368s64XtBM0h@=Hv}F@Ag&rjn|o1?3D|x bvA1*8U%w}_Mvvk1_2}J*xAFVm{$KPLYM?dI diff --git a/src/Magnum/MeshTools/Test/CompileTestFiles/phong.tga b/src/Magnum/MeshTools/Test/CompileTestFiles/phong.tga index 89dd5beecdadc784a32c0b2dae2d6aabbb8daba3..c952c51a2de1aad36ee2c236301f220d9ecad964 100644 GIT binary patch literal 3000 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 E5BLWbmH+?% literal 19218 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 diff --git a/src/Magnum/Shaders/Test/PhongTestFiles/textured-normal.tga b/src/Magnum/Shaders/Test/PhongTestFiles/textured-normal.tga index 679a3b3ce79dc59fe7409e36f6514ff9bf016e4d..87b5d7ea65e92bd0cb2e33185afc7fffd78f7594 100644 GIT binary patch literal 11108 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 N7OyZ+VW4CN{tbV=hVK9X