œ]™bœ€5.5.1f1ţ˙˙˙˙˙Č0ĹňĂôL.`?^Ů0D7€˙˙˙˙€Ś€˛€ЀŚ€Ś€Ś€#Ś€+H€3˙˙˙˙€1€1€˙˙˙˙@ހ€ Q€j€ ™€< Ś€H H€Z˙˙˙˙ €1€1€˙˙˙˙@ހ€Q€j€ЀgŚ€Ś€Ś€#Ś€+v~ € €– €Ÿ €¨ €ą €ş €Ă €Ě €Ő €Ţ  €ç! €ń" €ű# €$ €% €&Ő€#˙˙˙˙'€1€1€˙˙˙˙(€ހ€)H€j€˙˙˙˙*€1€1€˙˙˙˙+@ހ€,Q€j€-™€*.ހ8/AssetMetaDataguiddata[0]data[1]data[2]data[3]pathNametimeCreatedoriginalChangesetoriginalNameoriginalParentHash128originalDigestbytes[0]bytes[1]bytes[2]bytes[3]bytes[4]bytes[5]bytes[6]bytes[7]bytes[8]bytes[9]bytes[10]bytes[11]bytes[12]bytes[13]bytes[14]bytes[15]labelsassetStoreReflicenseTypeď˙˙2ƒ…>”KËĽŁMźHîÁƒ#{7€˙˙˙˙€Ś€˛€Ő€ ހ%.€.†€Ä€ ހ%.€.H€Ť€˙˙˙˙€1€1€˙˙˙˙ @ހ€ Q€j€ Ő€7˙˙˙˙ Ŕ1€1€˙˙˙˙ €ހ€€j€˙˙˙˙€H€›€˙˙˙˙€1€1€˙˙˙˙@ހ€Q€j€°€ € ހ%.€.H€I˙˙˙˙€1€1€˙˙˙˙@ހ€Q€j€H€T˙˙˙˙€1€1€˙˙˙˙@ހ€Q€j€H€f˙˙˙˙€1€1€˙˙˙˙ @ހ€!Q€j€"ShaderImporterPPtrm_FileIDm_PathIDm_DefaultTexturesm_UserDatam_AssetBundleNamem_AssetBundleVariant0˙˙şěŻu`Aă•\á|^FďYŹü 7€˙˙˙˙€Ś€˛€Ő€ ހ.€&†€Ä€ ހ.€&H€Ť€˙˙˙˙€1€1€˙˙˙˙ @ހ€ Q€j€ /@˙˙˙˙ €Mb˙˙˙˙ €Ő€m˙˙˙˙€1€1€˙˙˙˙€ހ€uj€˙˙˙˙€H€Ť€˙˙˙˙€1€1€˙˙˙˙@ހ€Q€j€H€ˆ˙˙˙˙€1€1€˙˙˙˙@ހ€Q€j€Ő€–˙˙˙˙€1€1€˙˙˙˙€ހ€H€j€˙˙˙˙€ 1€1€˙˙˙˙@ ހ€ Q€j€ ހ€!Ś€Ł"Ą€Ť#Ą€š$Ą€Ç%Ą€Ő&ăý˙˙˙˙'€H€ ˙˙˙˙(€1€1€˙˙˙˙)@ ހ€* Q€j€+ހ,Ő€!˙˙˙˙-€1€1€˙˙˙˙.€ހ€/.j€˙˙˙˙0€Ő€B˙˙˙˙1€1€1€˙˙˙˙2€ހ€3Kj€˙˙˙˙4€ń€Z˙˙˙˙5€ 1€1€˙˙˙˙6€ ހ€7 €j€˙˙˙˙8€ H€›€˙˙˙˙9€ 1€1€˙˙˙˙:@ ހ€; Q€j€< ހ €=ހ€>h~˙˙˙˙?€ H€Ť€˙˙˙˙@€ 1€1€˙˙˙˙A@ ހ€B Q€j€C †Ł˙˙˙˙D€ ŹÇ˙˙˙˙E€ Ą€ĐF Š€Ô˙˙˙˙G€ H€Ô˙˙˙˙H€ 1€1€˙˙˙˙I@ހ€JQ€j€K ŹŮ˙˙˙˙L€ Ą€ĐM Š€Ô˙˙˙˙N€ H€Ô˙˙˙˙O€ 1€1€˙˙˙˙P@ހ€QQ€j€R Źă˙˙˙˙S€ Ą€ĐT Š€Ô˙˙˙˙U€ H€Ô˙˙˙˙V€ 1€1€˙˙˙˙W@ހ€XQ€j€Y Źń˙˙˙˙Z€ Ą€Đ[ Š€Ô˙˙˙˙\€ H€Ô˙˙˙˙]€ 1€1€˙˙˙˙^@ހ€_Q€j€` Ź˙˙˙˙a€ Ą€Đb Š€Ô˙˙˙˙c€ H€Ô˙˙˙˙d€ 1€1€˙˙˙˙e@ހ€fQ€j€g Ź˙˙˙˙h€ Ą€Đi Š€Ô˙˙˙˙j€ H€Ô˙˙˙˙k€ 1€1€˙˙˙˙l@ހ€mQ€j€n Ź˙˙˙˙o€ Ą€Đp Š€Ô˙˙˙˙q€ H€Ô˙˙˙˙r€ 1€1€˙˙˙˙s@ހ€tQ€j€u †˙˙˙˙v€ ŹÇ˙˙˙˙w€ Ą€Đx Š€Ô˙˙˙˙y€ H€Ô˙˙˙˙z€ 1€1€˙˙˙˙{@ހ€|Q€j€} ŹŮ˙˙˙˙~€ Ą€Đ Š€Ô˙˙˙˙€€ H€Ô˙˙˙˙€ 1€1€˙˙˙˙‚@ހ€ƒQ€j€„ Źă˙˙˙˙…€ Ą€Đ† Š€Ô˙˙˙˙‡€ H€Ô˙˙˙˙ˆ€ 1€1€˙˙˙˙‰@ހ€ŠQ€j€‹ Źń˙˙˙˙Œ€ Ą€Đ Š€Ô˙˙˙˙Ž€ H€Ô˙˙˙˙€ 1€1€˙˙˙˙@ހ€‘Q€j€’ Ź˙˙˙˙“€ Ą€Đ” Š€Ô˙˙˙˙•€ H€Ô˙˙˙˙–€ 1€1€˙˙˙˙—@ހ€˜Q€j€™ Ź˙˙˙˙š€ Ą€Đ› Š€Ô˙˙˙˙œ€ H€Ô˙˙˙˙€ 1€1€˙˙˙˙ž@ހ€ŸQ€j€  Ź˙˙˙˙Ą€ Ą€Đ˘ Š€Ô˙˙˙˙Ł€ H€Ô˙˙˙˙¤€ 1€1€˙˙˙˙Ľ@ހ€ŚQ€j€§ †&˙˙˙˙¨€ ŹÇ˙˙˙˙Š€ Ą€ĐŞ Š€Ô˙˙˙˙Ť€ H€Ô˙˙˙˙Ź€ 1€1€˙˙˙˙­@ހ€ŽQ€j€Ż ŹŮ˙˙˙˙°€ Ą€Đą Š€Ô˙˙˙˙˛€ H€Ô˙˙˙˙ł€ 1€1€˙˙˙˙´@ހ€ľQ€j€ś Źă˙˙˙˙ˇ€ Ą€Đ¸ Š€Ô˙˙˙˙š€ H€Ô˙˙˙˙ş€ 1€1€˙˙˙˙ť@ހ€źQ€j€˝ Źń˙˙˙˙ž€ Ą€Đż Š€Ô˙˙˙˙Ŕ€ H€Ô˙˙˙˙Á€ 1€1€˙˙˙˙Â@ހ€ĂQ€j€Ä Ź˙˙˙˙ŀ Ą€ĐĆ Š€Ô˙˙˙˙ǀ H€Ô˙˙˙˙Ȁ 1€1€˙˙˙˙É@ހ€ĘQ€j€Ë Ź˙˙˙˙̀ Ą€ĐÍ Š€Ô˙˙˙˙΀ H€Ô˙˙˙˙π 1€1€˙˙˙˙Đ@ހ€ŃQ€j€Ň Ź˙˙˙˙Ӏ Ą€ĐÔ Š€Ô˙˙˙˙Հ H€Ô˙˙˙˙ր 1€1€˙˙˙˙×@ހ€ŘQ€j€Ů †/˙˙˙˙ڀ ŹÇ˙˙˙˙ۀ Ą€ĐÜ Š€Ô˙˙˙˙݀ H€Ô˙˙˙˙ހ 1€1€˙˙˙˙ß@ހ€ŕQ€j€á ŹŮ˙˙˙˙†Ą€Đă Š€Ô˙˙˙˙ä€ H€Ô˙˙˙˙ĺ€ 1€1€˙˙˙˙ć@ހ€çQ€j€č Źă˙˙˙˙é€ Ą€Đę Š€Ô˙˙˙˙ë€ H€Ô˙˙˙˙ě€ 1€1€˙˙˙˙í@ހ€îQ€j€ď Źń˙˙˙˙đ€ Ą€Đń Š€Ô˙˙˙˙ň€ H€Ô˙˙˙˙ó€ 1€1€˙˙˙˙ô@ހ€őQ€j€ö Ź˙˙˙˙÷€ Ą€Đř Š€Ô˙˙˙˙ů€ H€Ô˙˙˙˙ú€ 1€1€˙˙˙˙ű@ހ€üQ€j€ý Ź˙˙˙˙ţ€ Ą€Đ˙ Š€Ô˙˙˙˙€ H€Ô˙˙˙˙€ 1€1€˙˙˙˙@ހ€Q€j€ Ź˙˙˙˙€ Ą€Đ Š€Ô˙˙˙˙€ H€Ô˙˙˙˙€ 1€1€˙˙˙˙ @ހ€ Q€j€  †8˙˙˙˙ € ŹÇ˙˙˙˙ € Ą€Đ Š€Ô˙˙˙˙€ H€Ô˙˙˙˙€ 1€1€˙˙˙˙@ހ€Q€j€ ŹŮ˙˙˙˙€ Ą€Đ Š€Ô˙˙˙˙€ H€Ô˙˙˙˙€ 1€1€˙˙˙˙@ހ€Q€j€ Źă˙˙˙˙€ Ą€Đ Š€Ô˙˙˙˙€ H€Ô˙˙˙˙€ 1€1€˙˙˙˙@ހ€ Q€j€! Źń˙˙˙˙"€ Ą€Đ# Š€Ô˙˙˙˙$€ H€Ô˙˙˙˙%€ 1€1€˙˙˙˙&@ހ€'Q€j€( Ź˙˙˙˙)€ Ą€Đ* Š€Ô˙˙˙˙+€ H€Ô˙˙˙˙,€ 1€1€˙˙˙˙-@ހ€.Q€j€/ Ź˙˙˙˙0€ Ą€Đ1 Š€Ô˙˙˙˙2€ H€Ô˙˙˙˙3€ 1€1€˙˙˙˙4@ހ€5Q€j€6 Ź˙˙˙˙7€ Ą€Đ8 Š€Ô˙˙˙˙9€ H€Ô˙˙˙˙:€ 1€1€˙˙˙˙;@ހ€<Q€j€= †A˙˙˙˙>€ ŹÇ˙˙˙˙?€ Ą€Đ@ Š€Ô˙˙˙˙A€ H€Ô˙˙˙˙B€ 1€1€˙˙˙˙C@ހ€DQ€j€E ŹŮ˙˙˙˙F€ Ą€ĐG Š€Ô˙˙˙˙H€ H€Ô˙˙˙˙I€ 1€1€˙˙˙˙J@ހ€KQ€j€L Źă˙˙˙˙M€ Ą€ĐN Š€Ô˙˙˙˙O€ H€Ô˙˙˙˙P€ 1€1€˙˙˙˙Q@ހ€RQ€j€S Źń˙˙˙˙T€ Ą€ĐU Š€Ô˙˙˙˙V€ H€Ô˙˙˙˙W€ 1€1€˙˙˙˙X@ހ€YQ€j€Z Ź˙˙˙˙[€ Ą€Đ\ Š€Ô˙˙˙˙]€ H€Ô˙˙˙˙^€ 1€1€˙˙˙˙_@ހ€`Q€j€a Ź˙˙˙˙b€ Ą€Đc Š€Ô˙˙˙˙d€ H€Ô˙˙˙˙e€ 1€1€˙˙˙˙f@ހ€gQ€j€h Ź˙˙˙˙i€ Ą€Đj Š€Ô˙˙˙˙k€ H€Ô˙˙˙˙l€ 1€1€˙˙˙˙m@ހ€nQ€j€o †J˙˙˙˙p€ ŹÇ˙˙˙˙q€ Ą€Đr Š€Ô˙˙˙˙s€ H€Ô˙˙˙˙t€ 1€1€˙˙˙˙u@ހ€vQ€j€w ŹŮ˙˙˙˙x€ Ą€Đy Š€Ô˙˙˙˙z€ H€Ô˙˙˙˙{€ 1€1€˙˙˙˙|@ހ€}Q€j€~ Źă˙˙˙˙€ Ą€Đ€ Š€Ô˙˙˙˙€ H€Ô˙˙˙˙‚€ 1€1€˙˙˙˙ƒ@ހ€„Q€j€… Źń˙˙˙˙†€ Ą€Đ‡ Š€Ô˙˙˙˙ˆ€ H€Ô˙˙˙˙‰€ 1€1€˙˙˙˙Š@ހ€‹Q€j€Œ Ź˙˙˙˙€ Ą€ĐŽ Š€Ô˙˙˙˙€ H€Ô˙˙˙˙€ 1€1€˙˙˙˙‘@ހ€’Q€j€“ Ź˙˙˙˙”€ Ą€Đ• Š€Ô˙˙˙˙–€ H€Ô˙˙˙˙—€ 1€1€˙˙˙˙˜@ހ€™Q€j€š Ź˙˙˙˙›€ Ą€Đœ Š€Ô˙˙˙˙€ H€Ô˙˙˙˙ž€ 1€1€˙˙˙˙Ÿ@ހ€ Q€j€Ą †S˙˙˙˙˘€ ŹÇ˙˙˙˙Ł€ Ą€Đ¤ Š€Ô˙˙˙˙Ľ€ H€Ô˙˙˙˙Ś€ 1€1€˙˙˙˙§@ހ€¨Q€j€Š ŹŮ˙˙˙˙Ş€ Ą€ĐŤ Š€Ô˙˙˙˙Ź€ H€Ô˙˙˙˙­€ 1€1€˙˙˙˙Ž@ހ€ŻQ€j€° Źă˙˙˙˙ą€ Ą€Đ˛ Š€Ô˙˙˙˙ł€ H€Ô˙˙˙˙´€ 1€1€˙˙˙˙ľ@ހ€śQ€j€ˇ Źń˙˙˙˙¸€ Ą€Đš Š€Ô˙˙˙˙ş€ H€Ô˙˙˙˙ť€ 1€1€˙˙˙˙ź@ހ€˝Q€j€ž Ź˙˙˙˙ż€ Ą€ĐŔ Š€Ô˙˙˙˙Á€ H€Ô˙˙˙˙€ 1€1€˙˙˙˙Ă@ހ€ÄQ€j€Ĺ Ź˙˙˙˙Ć€ Ą€ĐÇ Š€Ô˙˙˙˙Č€ H€Ô˙˙˙˙É€ 1€1€˙˙˙˙Ę@ހ€ËQ€j€Ě Ź˙˙˙˙Í€ Ą€ĐÎ Š€Ô˙˙˙˙Ď€ H€Ô˙˙˙˙Đ€ 1€1€˙˙˙˙Ń@ހ€ŇQ€j€Ó L€\Ô@ Źl˙˙˙˙Ő€ Ą€ĐÖ Š€Ô˙˙˙˙×€ H€Ô˙˙˙˙Ř€ 1€1€˙˙˙˙Ů@ ހ€Ú Q€j€Ű Źr˙˙˙˙Ü€ Ą€ĐÝ Š€Ô˙˙˙˙Ţ€ H€Ô˙˙˙˙߀ 1€1€˙˙˙˙ŕ@ ހ€á Q€j€â Źy˙˙˙˙〠Ą€Đä Š€Ô˙˙˙˙ĺ€ H€Ô˙˙˙˙ć€ 1€1€˙˙˙˙ç@ ހ€č Q€j€é Ź˙˙˙˙ę€ Ą€Đë Š€Ô˙˙˙˙ě€ H€Ô˙˙˙˙í€ 1€1€˙˙˙˙î@ ހ€ď Q€j€đ ŹŽ˙˙˙˙ń€ Ą€Đň Š€Ô˙˙˙˙ó€ H€Ô˙˙˙˙ô€ 1€1€˙˙˙˙ő@ ހ€ö Q€j€÷ Źš˙˙˙˙ř€ Ą€Đů Š€Ô˙˙˙˙ú€ H€Ô˙˙˙˙ű€ 1€1€˙˙˙˙ü@ ހ€ý Q€j€ţ Śş˙˙˙˙˙€ ŹÄ˙˙˙˙€ Ą€Đ Š€Ô˙˙˙˙€ H€Ô˙˙˙˙€ 1€1€˙˙˙˙@ހ€Q€j€ ŹÉ˙˙˙˙€ Ą€Đ Š€Ô˙˙˙˙ € H€Ô˙˙˙˙ € 1€1€˙˙˙˙ @ހ€ Q€j€  ŹÎ˙˙˙˙€ Ą€Đ Š€Ô˙˙˙˙€ H€Ô˙˙˙˙€ 1€1€˙˙˙˙@ހ€Q€j€ ŹÔ˙˙˙˙€ Ą€Đ Š€Ô˙˙˙˙€ H€Ô˙˙˙˙€ 1€1€˙˙˙˙@ހ€Q€j€ ŚŮ˙˙˙˙€ ŹÄ˙˙˙˙€ Ą€Đ Š€Ô˙˙˙˙€ H€Ô˙˙˙˙ € 1€1€˙˙˙˙!@ހ€"Q€j€# ŹÉ˙˙˙˙$€ Ą€Đ% Š€Ô˙˙˙˙&€ H€Ô˙˙˙˙'€ 1€1€˙˙˙˙(@ހ€)Q€j€* ŹÎ˙˙˙˙+€ Ą€Đ, Š€Ô˙˙˙˙-€ H€Ô˙˙˙˙.€ 1€1€˙˙˙˙/@ހ€0Q€j€1 ŹÔ˙˙˙˙2€ Ą€Đ3 Š€Ô˙˙˙˙4€ H€Ô˙˙˙˙5€ 1€1€˙˙˙˙6@ހ€7Q€j€8 Śč˙˙˙˙9€ ŹÄ˙˙˙˙:€ Ą€Đ; Š€Ô˙˙˙˙<€ H€Ô˙˙˙˙=€ 1€1€˙˙˙˙>@ހ€?Q€j€@ ŹÉ˙˙˙˙A€ Ą€ĐB Š€Ô˙˙˙˙C€ H€Ô˙˙˙˙D€ 1€1€˙˙˙˙E@ހ€FQ€j€G ŹÎ˙˙˙˙H€ Ą€ĐI Š€Ô˙˙˙˙J€ H€Ô˙˙˙˙K€ 1€1€˙˙˙˙L@ހ€MQ€j€N ŹÔ˙˙˙˙O€ Ą€ĐP Š€Ô˙˙˙˙Q€ H€Ô˙˙˙˙R€ 1€1€˙˙˙˙S@ހ€TQ€j€U Źö˙˙˙˙V€ Ą€ĐW Š€Ô˙˙˙˙X€ H€Ô˙˙˙˙Y€ 1€1€˙˙˙˙Z@ ހ€[ Q€j€\ Ź˙˙˙˙]€ Ą€Đ^ Š€Ô˙˙˙˙_€ H€Ô˙˙˙˙`€ 1€1€˙˙˙˙a@ ހ€b Q€j€c Ź˙˙˙˙d€ Ą€Đe Š€Ô˙˙˙˙f€ H€Ô˙˙˙˙g€ 1€1€˙˙˙˙h@ ހ€i Q€j€j Ź"˙˙˙˙k€ Ą€Đl Š€Ô˙˙˙˙m€ H€Ô˙˙˙˙n€ 1€1€˙˙˙˙o@ ހ€p Q€j€q Ź+˙˙˙˙r€ Ą€Đs Š€Ô˙˙˙˙t€ H€Ô˙˙˙˙u€ 1€1€˙˙˙˙v@ ހ€w Q€j€x Ź2˙˙˙˙y€ Ą€Đz Š€Ô˙˙˙˙{€ H€Ô˙˙˙˙|€ 1€1€˙˙˙˙}@ ހ€~ Q€j€ =Y˙˙˙˙€€ Źb˙˙˙˙€ Ą€Đ‚ Š€Ô˙˙˙˙ƒ€ H€Ô˙˙˙˙„€ 1€1€˙˙˙˙…@ހ€†Q€j€‡ Źd˙˙˙˙ˆ€ Ą€Đ‰ Š€Ô˙˙˙˙Š€ H€Ô˙˙˙˙‹€ 1€1€˙˙˙˙Œ@ހ€Q€j€Ž Źf˙˙˙˙€ Ą€Đ Š€Ô˙˙˙˙‘€ H€Ô˙˙˙˙’€ 1€1€˙˙˙˙“@ހ€”Q€j€• Źh˙˙˙˙–€ Ą€Đ— Š€Ô˙˙˙˙˜€ H€Ô˙˙˙˙™€ 1€1€˙˙˙˙š@ހ€›Q€j€œ Š€Ô˙˙˙˙€ H€Ô˙˙˙˙ž€ 1€1€˙˙˙˙Ÿ@ ހ€  Q€j€Ą ހj˘ ހrŁ ˙˙˙˙¤€ ń€—˙˙˙˙Ľ€ 1€1€˙˙˙˙Ś€ ހ€§ €j€˙˙˙˙¨€ H€›€˙˙˙˙Š€1€1€˙˙˙˙Ş@ހ€ŤQ€j€Ź H€ €˙˙˙˙­€1€1€˙˙˙˙Ž@ހ€ŻQ€j€° ހœą L€˘˛@Ś€ŤłšË˙˙˙˙´€ Ő€Ö˙˙˙˙ľ€ 1€1€˙˙˙˙ś€ ހ€ˇ äj€˙˙˙˙¸€ Ś€ůš ˙˙˙˙ş€ Ő€˙˙˙˙ť@1€1€˙˙˙˙źހ€˝#j€ž5€5ż5€<Ŕ Ś€CÁ Ő€O˙˙˙˙ 1€1€˙˙˙˙Ăހ€Ä‹€j€Ĺ 5€`Ć 5€uÇ@ Ő€†˙˙˙˙Č€ 1€1€˙˙˙˙É€ހ€Ę•j€Ë€ހĽĚހƒ€ÍހąÎ5€€Ď5€˝Đ@ Ő€Ă˙˙˙˙Ń€ 1€1€˙˙˙˙Ň€ހ€ÓŇj€Ô€ހĽŐހƒ€Öހą×5€€Ř5€âŮ@ Ő€í˙˙˙˙Ú€ 1€1€˙˙˙˙Ű€ހ€Üýj€ Ý€ހĽŢހƒ€ßހŕ5€˝á@ Ő€˙˙˙˙â 1€1€˙˙˙˙ăހ€ä,j€ĺހĽćހƒ€ç Ő€:˙˙˙˙č€ 1€1€˙˙˙˙é€ހ€ęLj€˙˙˙˙ë€ހĽěŐ€Ă˙˙˙˙í€1€1€˙˙˙˙î€ހ€ďŇj€đ€ހĽńހƒ€ňހąó5€€ô5€âő@Ő€†˙˙˙˙ö€1€1€˙˙˙˙÷€ހ€ř•j€ů€ހĽúހƒ€űހąü5€€ý5€˝ţ@ހ[˙ Ő€b˙˙˙˙ 1€1€˙˙˙˙ހ€,j€ހĽހƒ€ Ő€{˙˙˙˙ 1€1€˙˙˙˙ހ€‡j€ ހĽ ހƒ€ ހ” š¤˙˙˙˙ € Ő€Ö˙˙˙˙€ 1€1€˙˙˙˙€ ހ€ äj€˙˙˙˙€ Ś€ů ˙˙˙˙€ Ő€˙˙˙˙@1€1€˙˙˙˙ހ€#j€5€55€< Ś€C Ő€O˙˙˙˙ 1€1€˙˙˙˙ހ€‹€j€ 5€` 5€u @ Ő€†˙˙˙˙!€ 1€1€˙˙˙˙"€ހ€#•j€$€ހĽ%ހƒ€&ހą'5€€(5€˝)@ Ő€Ă˙˙˙˙*€ 1€1€˙˙˙˙+€ހ€,Ňj€-€ހĽ.ހƒ€/ހą05€€15€â2@ Ő€í˙˙˙˙3€ 1€1€˙˙˙˙4€ހ€5ýj€ 6€ހĽ7ހƒ€8ހ95€˝:@ Ő€˙˙˙˙; 1€1€˙˙˙˙<ހ€=,j€>ހĽ?ހƒ€@ Ő€:˙˙˙˙A€ 1€1€˙˙˙˙B€ހ€CLj€˙˙˙˙D€ހĽEŐ€Ă˙˙˙˙F€1€1€˙˙˙˙G€ހ€HŇj€I€ހĽJހƒ€KހąL5€€M5€âN@Ő€†˙˙˙˙O€1€1€˙˙˙˙P€ހ€Q•j€R€ހĽSހƒ€TހąU5€€V5€˝W@ހ[X Ő€b˙˙˙˙Y 1€1€˙˙˙˙Zހ€[,j€\ހĽ]ހƒ€^ Ő€{˙˙˙˙_ 1€1€˙˙˙˙`ހ€a‡j€ bހĽcހƒ€dހ”ešą˙˙˙˙f€ Ő€Ö˙˙˙˙g€ 1€1€˙˙˙˙h€ ހ€i äj€˙˙˙˙j€ Ś€ůk ˙˙˙˙l€ Ő€˙˙˙˙m@1€1€˙˙˙˙nހ€o#j€p5€5q5€<r Ś€Cs Ő€O˙˙˙˙t 1€1€˙˙˙˙uހ€v‹€j€w 5€`x 5€uy@ Ő€†˙˙˙˙z€ 1€1€˙˙˙˙{€ހ€|•j€}€ހĽ~ހƒ€ހą€5€€5€˝‚@ Ő€Ă˙˙˙˙ƒ€ 1€1€˙˙˙˙„€ހ€…Ňj€†€ހĽ‡ހƒ€ˆހą‰5€€Š5€â‹@ Ő€í˙˙˙˙Œ€ 1€1€˙˙˙˙€ހ€Žýj€ €ހĽހƒ€‘ހ’5€˝“@ Ő€˙˙˙˙” 1€1€˙˙˙˙•ހ€–,j€—ހĽ˜ހƒ€™ Ő€:˙˙˙˙š€ 1€1€˙˙˙˙›€ހ€œLj€˙˙˙˙€ހĽžŐ€Ă˙˙˙˙Ÿ€1€1€˙˙˙˙ €ހ€ĄŇj€˘€ހĽŁހƒ€¤ހąĽ5€€Ś5€â§@Ő€†˙˙˙˙¨€1€1€˙˙˙˙Š€ހ€Ş•j€Ť€ހĽŹހƒ€­ހąŽ5€€Ż5€˝°@ހ[ą Ő€b˙˙˙˙˛ 1€1€˙˙˙˙łހ€´,j€ľހĽśހƒ€ˇ Ő€{˙˙˙˙¸ 1€1€˙˙˙˙šހ€ş‡j€ ťހĽźހƒ€˝ހ”žšž˙˙˙˙ż€ Ő€Ö˙˙˙˙Ŕ€ 1€1€˙˙˙˙Á€ ހ€Â äj€˙˙˙˙Ă€ Ś€ůÄ ˙˙˙˙Ĺ€ Ő€˙˙˙˙Ć@1€1€˙˙˙˙Çހ€Č#j€É5€5Ę5€<Ë Ś€CĚ Ő€O˙˙˙˙Í 1€1€˙˙˙˙Îހ€Ď‹€j€Đ 5€`Ń 5€uŇ@ Ő€†˙˙˙˙Ó€ 1€1€˙˙˙˙Ô€ހ€Ő•j€Ö€ހĽ×ހƒ€ŘހąŮ5€€Ú5€˝Ű@ Ő€Ă˙˙˙˙Ü€ 1€1€˙˙˙˙Ý€ހ€ŢŇj€ß€ހĽŕހƒ€áހąâ5€€ă5€âä@ Ő€í˙˙˙˙ĺ€ 1€1€˙˙˙˙ć€ހ€çýj€ č€ހĽéހƒ€ęހë5€˝ě@ Ő€˙˙˙˙í 1€1€˙˙˙˙îހ€ď,j€đހĽńހƒ€ň Ő€:˙˙˙˙ó€ 1€1€˙˙˙˙ô€ހ€őLj€˙˙˙˙ö€ހĽ÷Ő€Ă˙˙˙˙ř€1€1€˙˙˙˙ů€ހ€úŇj€ű€ހĽüހƒ€ýހąţ5€€˙5€â@Ő€†˙˙˙˙€1€1€˙˙˙˙€ހ€•j€€ހĽހƒ€ހą5€€5€˝ @ހ[  Ő€b˙˙˙˙  1€1€˙˙˙˙ ހ€ ,j€ހĽހƒ€ Ő€{˙˙˙˙ 1€1€˙˙˙˙ހ€‡j€ ހĽހƒ€ހ”šÇ˙˙˙˙€ Ő€Ö˙˙˙˙€ 1€1€˙˙˙˙€ ހ€ äj€˙˙˙˙€ Ś€ů ˙˙˙˙€ Ő€˙˙˙˙@1€1€˙˙˙˙ ހ€!#j€"5€5#5€<$ Ś€C% Ő€O˙˙˙˙& 1€1€˙˙˙˙'ހ€(‹€j€) 5€`* 5€u+@ Ő€†˙˙˙˙,€ 1€1€˙˙˙˙-€ހ€.•j€/€ހĽ0ހƒ€1ހą25€€35€˝4@ Ő€Ă˙˙˙˙5€ 1€1€˙˙˙˙6€ހ€7Ňj€8€ހĽ9ހƒ€:ހą;5€€<5€â=@ Ő€í˙˙˙˙>€ 1€1€˙˙˙˙?€ހ€@ýj€ A€ހĽBހƒ€CހD5€˝E@ Ő€˙˙˙˙F 1€1€˙˙˙˙Gހ€H,j€IހĽJހƒ€K Ő€:˙˙˙˙L€ 1€1€˙˙˙˙M€ހ€NLj€˙˙˙˙O€ހĽPŐ€Ă˙˙˙˙Q€1€1€˙˙˙˙R€ހ€SŇj€T€ހĽUހƒ€VހąW5€€X5€âY@Ő€†˙˙˙˙Z€1€1€˙˙˙˙[€ހ€\•j€]€ހĽ^ހƒ€_ހą`5€€a5€˝b@ހ[c Ő€b˙˙˙˙d 1€1€˙˙˙˙eހ€f,j€gހĽhހƒ€i Ő€{˙˙˙˙j 1€1€˙˙˙˙kހ€l‡j€ mހĽnހƒ€oހ”pL€Ňq@H€é˙˙˙˙r€ 1€1€˙˙˙˙s@ ހ€t Q€j€uH€Ť€˙˙˙˙v€ 1€1€˙˙˙˙w@ ހ€x Q€j€yH€ó˙˙˙˙z€ 1€1€˙˙˙˙{@ ހ€| Q€j€}˙˙˙˙~€ ń€—˙˙˙˙€ 1€1€˙˙˙˙€€ ހ€ €j€˙˙˙˙‚€ H€›€˙˙˙˙ƒ€ 1€1€˙˙˙˙„@ހ€…Q€j€† H€ €˙˙˙˙‡€ 1€1€˙˙˙˙ˆ@ހ€‰Q€j€Š˙˙˙˙‹€ń€—˙˙˙˙Œ€1€1€˙˙˙˙€ހ€Ž€j€˙˙˙˙€ H€›€˙˙˙˙€ 1€1€˙˙˙˙‘@ ހ€’ Q€j€“ H€ €˙˙˙˙”€ 1€1€˙˙˙˙•@ ހ€– Q€j€—ހœ˜H€Ť€˙˙˙˙™€1€1€˙˙˙˙š@ހ€›Q€j€œH€˙˙˙˙€1€1€˙˙˙˙ž@ހ€ŸQ€j€ H€˙˙˙˙Ą€1€1€˙˙˙˙˘@ހ€ŁQ€j€¤Ő€#˙˙˙˙Ľ€1€1€˙˙˙˙Ś€ހ€§2j€˙˙˙˙¨€H€M˙˙˙˙Š€1€1€˙˙˙˙Ş@ހ€ŤQ€j€ŹH€R˙˙˙˙­€1€1€˙˙˙˙Ž@ހ€ŻQ€j€°L€Uą@Ő€r˙˙˙˙˛1€1€˙˙˙˙łހ€´Ś€j€ľŐ€|˙˙˙˙ś1€1€˙˙˙˙ˇހ€¸Ś€j€šŐ€„˙˙˙˙ş1€1€˙˙˙˙ťހ€źŚ€j€˝Ő€–˙˙˙˙ž1€1€˙˙˙˙żހ€ŔŚ€j€ÁŐ€Ş˙˙˙˙€1€1€˙˙˙˙Ă@ހ€Ä €j€ĹŐ€#˙˙˙˙Ć1€1€˙˙˙˙Çހ€Čšj€ ÉހĘ.€&ËL€ĆĚ@ń€Ö˙˙˙˙Í€1€1€˙˙˙˙΀ހ€Ď€j€˙˙˙˙Đ€H€›€˙˙˙˙Ń€1€1€˙˙˙˙Ň@ހ€ÓQ€j€Ô°€ € ŐހÖ.€&×čţ˙˙˙˙Ř€ń€ ˙˙˙˙Ů€1€1€˙˙˙˙Ú€ހ€Ű€j€˙˙˙˙Ü€ހ›€Ý €˙˙˙˙Ţ€H€%˙˙˙˙߀1€1€˙˙˙˙ŕ@ހ€áQ€j€âH€,˙˙˙˙ă€1€1€˙˙˙˙ä@ހ€ĺQ€j€ćŚ€8猀Gčހb錀nęz‚ë €‘ě €ší €Łî €Źď €ľđ €žń €Çň €Đó €Ůô €âő €ëö €ő÷ €˙ř € ů €ú €űL€'ü@ހ3ýŐ€>˙˙˙˙ţ€1€1€˙˙˙˙˙€ހ€Ő€j€˙˙˙˙€ 1€1€˙˙˙˙€ ހ€ H€j€˙˙˙˙€ 1€1€˙˙˙˙@ ހ€ Q€j€Ő€N˙˙˙˙€1€1€˙˙˙˙ €ހ€ Ő€j€˙˙˙˙ € 1€1€˙˙˙˙ € ހ€  H€j€˙˙˙˙€ 1€1€˙˙˙˙@ ހ€ Q€j€Ő€^˙˙˙˙€1€1€˙˙˙˙€ހ€Ő€j€˙˙˙˙€ 1€1€˙˙˙˙€ ހ€ H€j€˙˙˙˙€ 1€1€˙˙˙˙@ ހ€ Q€j€Ő€n˙˙˙˙€1€1€˙˙˙˙€ހ€Ő€j€˙˙˙˙€ 1€1€˙˙˙˙ € ހ€! H€j€˙˙˙˙"€ 1€1€˙˙˙˙#@ ހ€$ Q€j€%Ő€~˙˙˙˙&€1€1€˙˙˙˙'€ހ€(Ő€j€˙˙˙˙)€ 1€1€˙˙˙˙*€ ހ€+ H€j€˙˙˙˙,€ 1€1€˙˙˙˙-@ ހ€. Q€j€/Ő€Ž˙˙˙˙0€1€1€˙˙˙˙1€ހ€2Ő€j€˙˙˙˙3€ 1€1€˙˙˙˙4€ ހ€5 H€j€˙˙˙˙6€ 1€1€˙˙˙˙7@ ހ€8 Q€j€9Ő€ž˙˙˙˙:€1€1€˙˙˙˙;€ހ€<Ő€j€˙˙˙˙=€ 1€1€˙˙˙˙>€ ހ€? H€j€˙˙˙˙@€ 1€1€˙˙˙˙A@ ހ€B Q€j€CŐ€ą˙˙˙˙D€1€1€˙˙˙˙E€ހ€FŐ€j€˙˙˙˙G€ 1€1€˙˙˙˙H€ ހ€I H€j€˙˙˙˙J€ 1€1€˙˙˙˙K@ ހ€L Q€j€MŐ€Ä˙˙˙˙N€1€1€˙˙˙˙O€ހ€PŐ€j€˙˙˙˙Q€ 1€1€˙˙˙˙R€ ހ€S H€j€˙˙˙˙T€ 1€1€˙˙˙˙U@ ހ€V Q€j€WŐ€×˙˙˙˙X€1€1€˙˙˙˙Y€ހ€ZŐ€j€˙˙˙˙[€ 1€1€˙˙˙˙\€ ހ€] H€j€˙˙˙˙^€ 1€1€˙˙˙˙_@ ހ€` Q€j€aŐ€ę˙˙˙˙b€1€1€˙˙˙˙c€ހ€dŐ€j€˙˙˙˙e€ 1€1€˙˙˙˙f€ ހ€g H€j€˙˙˙˙h€ 1€1€˙˙˙˙i@ ހ€j Q€j€kŐ€ý˙˙˙˙l€1€1€˙˙˙˙m€ހ€nŐ€j€˙˙˙˙o€ 1€1€˙˙˙˙p€ ހ€q H€j€˙˙˙˙r€ 1€1€˙˙˙˙s@ ހ€t Q€j€uހ vŐ€ ˙˙˙˙w€1€1€˙˙˙˙x€ހ€yH€j€˙˙˙˙z€ 1€1€˙˙˙˙{@ ހ€| Q€j€}Ő€+ ˙˙˙˙~€1€1€˙˙˙˙€ހ€€H€j€˙˙˙˙€ 1€1€˙˙˙˙‚@ ހ€ƒ Q€j€„Ő€= ˙˙˙˙…€1€1€˙˙˙˙†€ހ€‡H€j€˙˙˙˙ˆ€ 1€1€˙˙˙˙‰@ ހ€Š Q€j€‹Ő€O ˙˙˙˙Œ€1€1€˙˙˙˙€ހ€ŽH€j€˙˙˙˙€ 1€1€˙˙˙˙@ ހ€‘ Q€j€’Ő€a ˙˙˙˙“€1€1€˙˙˙˙”€ހ€•H€j€˙˙˙˙–€ 1€1€˙˙˙˙—@ ހ€˜ Q€j€™Ő€s ˙˙˙˙š€1€1€˙˙˙˙›€ހ€œH€j€˙˙˙˙€ 1€1€˙˙˙˙ž@ ހ€Ÿ Q€j€ H€… ˙˙˙˙Ą€1€1€˙˙˙˙˘@ހ€ŁQ€j€¤H€Ÿ ˙˙˙˙Ľ€1€1€˙˙˙˙Ś@ހ€§Q€j€¨Ś€ą ŠL€Î ŞL€â ŤShaderPPtrm_FileIDm_PathIDSerializedShaderm_ParsedFormSerializedPropertiesm_PropInfom_PropsSerializedPropertym_Descriptionm_Attributesm_Flagsm_DefValue[0]m_DefValue[1]m_DefValue[2]m_DefValue[3]SerializedTexturePropertym_DefTexturem_DefaultNamem_TexDimm_SubShadersSerializedSubShaderm_PassesSerializedPassm_NameIndicesSerializedShaderStatem_StateSerializedShaderRTBlendStatertBlend0SerializedShaderFloatValuesrcBlendvalnamedestBlendsrcBlendAlphadestBlendAlphablendOpblendOpAlphacolMaskrtBlend1rtBlend2rtBlend3rtBlend4rtBlend5rtBlend6rtBlend7rtSeparateBlendzTestzWritecullingoffsetFactoroffsetUnitsalphaToMaskSerializedStencilOpstencilOppassfailzFailcompstencilOpFrontstencilOpBackstencilReadMaskstencilWriteMaskstencilReffogStartfogEndfogDensitySerializedShaderVectorValuefogColorxyzwfogModegpuProgramIDSerializedTagMapm_Tagstagsm_LODlightingm_ProgramMaskSerializedProgramprogVertexm_SubProgramsSerializedSubProgramm_BlobIndexParserBindChannelsm_ChannelsShaderBindChannelsourcetargetm_SourceMapm_KeywordIndicesm_ShaderHardwareTierm_GpuProgramTypem_VectorParamsVectorParameterm_NameIndexm_ArraySizem_Dimm_MatrixParamsMatrixParameterm_RowCountm_TextureParamsTextureParameterm_SamplerIndexm_BufferParamsBufferBindingm_ConstantBuffersConstantBufferm_Sizem_ConstantBufferBindingsm_UAVParamsUAVParameterm_OriginalIndexprogFragmentprogGeometryprogHullprogDomainm_HasInstancingVariantm_UseNamem_TextureNamem_CustomEditorNamem_FallbackNamem_DependenciesSerializedShaderDependencyfromtom_DisableNoSubshadersMessageplatformsoffsetscompressedLengthsdecompressedLengthscompressedBlobPPtrm_ShaderIsBakedm_DefaultTexturesShaderCompilationInfom_CompileInfom_SnippetsShaderSnippetm_Codem_AssetPathm_PlatformMaskm_HardwareTierVariantsMaskm_StartLinem_TypesMaskHash128m_IncludesHashbytes[0]bytes[1]bytes[2]bytes[3]bytes[4]bytes[5]bytes[6]bytes[7]bytes[8]bytes[9]bytes[10]bytes[11]bytes[12]bytes[13]bytes[14]bytes[15]m_FromOtherm_Languagem_VariantsUser0m_VariantsUser1m_VariantsUser2m_VariantsUser3m_VariantsUser4m_VariantsUser5m_VariantsBuiltin0m_VariantsBuiltin1m_VariantsBuiltin2m_VariantsBuiltin3m_VariantsBuiltin4m_VariantsBuiltin5m_Targetm_TargetVariants0m_TargetVariants1m_TargetVariants2m_TargetVariants3m_TargetVariants4m_TargetVariants5m_NonStrippedUserKeywordsm_BuiltinKeywordsm_MeshComponentsFromSnippetsm_HasSurfaceShadersm_HasFixedFunctionShaders¤¨0>IŘ üĐaDŰFAˇŞy/SĎľ”0LAssets/Standard Assets/Effects/ImageEffects/Shaders/EdgeDetectNormals.shader_MainTex Base (RGB)€? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA A A A A C C unity_FogStart unity_FogEndunity_FogDensity unity_FogColor˙˙˙˙Ť˛€? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA A A A A C C unity_FogStart unity_FogEndunity_FogDensity unity_FogColor˙˙˙˙ ý€? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA A A A A C C unity_FogStart unity_FogEndunity_FogDensity unity_FogColor˙˙˙˙/d€? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA A A A A C C unity_FogStart unity_FogEndunity_FogDensity unity_FogColor˙˙˙˙¨€? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA A A A A C C unity_FogStart unity_FogEndunity_FogDensity unity_FogColor˙˙˙˙ípHidden/EdgeDetectŤ˛ *#line 283 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif #include "HLSLSupport.cginc" #include "UnityShaderVariables.cginc" #line 7 #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv[5] : TEXCOORD0; }; struct v2fd { float4 pos : SV_POSITION; float2 uv[2] : TEXCOORD0; }; sampler2D _MainTex; uniform float4 _MainTex_TexelSize; half4 _MainTex_ST; sampler2D _CameraDepthNormalsTexture; half4 _CameraDepthNormalsTexture_ST; sampler2D_float _CameraDepthTexture; half4 _CameraDepthTexture_ST; uniform half4 _Sensitivity; uniform half4 _BgColor; uniform half _BgFade; uniform half _SampleDistance; uniform float _Exponent; uniform float _Threshold; struct v2flum { float4 pos : SV_POSITION; float2 uv[3] : TEXCOORD0; }; v2flum vertLum (appdata_img v) { v2flum o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); float2 uv = MultiplyUV( UNITY_MATRIX_TEXTURE0, v.texcoord ); o.uv[0] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); o.uv[1] = UnityStereoScreenSpaceUVAdjust(uv + float2(-_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); o.uv[2] = UnityStereoScreenSpaceUVAdjust(uv + float2(+_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); return o; } fixed4 fragLum (v2flum i) : SV_Target { fixed4 original = tex2D(_MainTex, i.uv[0]); // a very simple cross gradient filter half3 p1 = original.rgb; half3 p2 = tex2D(_MainTex, i.uv[1]).rgb; half3 p3 = tex2D(_MainTex, i.uv[2]).rgb; half3 diff = p1 * 2 - p2 - p3; half len = dot(diff, diff); len = step(len, _Threshold); //if(len >= _Threshold) // original.rgb = 0; return len * lerp(original, _BgColor, _BgFade); } inline half CheckSame (half2 centerNormal, float centerDepth, half4 theSample) { // difference in normals // do not bother decoding normals - there's no need here half2 diff = abs(centerNormal - theSample.xy) * _Sensitivity.y; int isSameNormal = (diff.x + diff.y) * _Sensitivity.y < 0.1; // difference in depth float sampleDepth = DecodeFloatRG (theSample.zw); float zdiff = abs(centerDepth-sampleDepth); // scale the required threshold by the distance int isSameDepth = zdiff * _Sensitivity.x < 0.09 * centerDepth; // return: // 1 - if normals and depth are similar enough // 0 - otherwise return isSameNormal * isSameDepth ? 1.0 : 0.0; } v2f vertRobert( appdata_img v ) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); float2 uv = v.texcoord.xy; o.uv[0] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) uv.y = 1-uv.y; #endif // calc coord for the X pattern // maybe nicer TODO for the future: 'rotated triangles' o.uv[1] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(1,1) * _SampleDistance, _MainTex_ST); o.uv[2] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(-1,-1) * _SampleDistance, _MainTex_ST); o.uv[3] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(-1,1) * _SampleDistance, _MainTex_ST); o.uv[4] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(1,-1) * _SampleDistance, _MainTex_ST); return o; } v2f vertThin( appdata_img v ) { v2f o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); float2 uv = v.texcoord.xy; o.uv[0] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) uv.y = 1-uv.y; #endif o.uv[1] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); o.uv[4] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); // offsets for two additional samples o.uv[2] = UnityStereoScreenSpaceUVAdjust(uv + float2(-_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); o.uv[3] = UnityStereoScreenSpaceUVAdjust(uv + float2(+_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); return o; } v2fd vertD( appdata_img v ) { v2fd o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); float2 uv = v.texcoord.xy; o.uv[0] = uv; #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) uv.y = 1-uv.y; #endif o.uv[1] = uv; return o; } float4 fragDCheap(v2fd i) : SV_Target { // inspired by borderlands implementation of popular "sobel filter" float centerDepth = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv[1])); float4 depthsDiag; float4 depthsAxis; float2 uvDist = _SampleDistance * _MainTex_TexelSize.xy; depthsDiag.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist, _CameraDepthTexture_ST))); // TR depthsDiag.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(-1,1), _CameraDepthTexture_ST))); // TL depthsDiag.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(-1,1), _CameraDepthTexture_ST))); // BR depthsDiag.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist, _CameraDepthTexture_ST))); // BL depthsAxis.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(0,1), _CameraDepthTexture_ST))); // T depthsAxis.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(1,0), _CameraDepthTexture_ST))); // L depthsAxis.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(1,0), _CameraDepthTexture_ST))); // R depthsAxis.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(0,1), _CameraDepthTexture_ST))); // B depthsDiag -= centerDepth; depthsAxis /= centerDepth; const float4 HorizDiagCoeff = float4(1,1,-1,-1); const float4 VertDiagCoeff = float4(-1,1,-1,1); const float4 HorizAxisCoeff = float4(1,0,0,-1); const float4 VertAxisCoeff = float4(0,1,-1,0); float4 SobelH = depthsDiag * HorizDiagCoeff + depthsAxis * HorizAxisCoeff; float4 SobelV = depthsDiag * VertDiagCoeff + depthsAxis * VertAxisCoeff; float SobelX = dot(SobelH, float4(1,1,1,1)); float SobelY = dot(SobelV, float4(1,1,1,1)); float Sobel = sqrt(SobelX * SobelX + SobelY * SobelY); Sobel = 1.0-pow(saturate(Sobel), _Exponent); return Sobel * lerp(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)), _BgColor, _BgFade); } // pretty much also just a sobel filter, except for that edges "outside" the silhouette get discarded // which makes it compatible with other depth based post fx float4 fragD(v2fd i) : SV_Target { // inspired by borderlands implementation of popular "sobel filter" float centerDepth = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1], _CameraDepthTexture_ST))); float4 depthsDiag; float4 depthsAxis; float2 uvDist = _SampleDistance * _MainTex_TexelSize.xy; depthsDiag.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist, _CameraDepthTexture_ST))); // TR depthsDiag.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(-1,1), _CameraDepthTexture_ST))); // TL depthsDiag.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(-1,1), _CameraDepthTexture_ST))); // BR depthsDiag.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist, _CameraDepthTexture_ST))); // BL depthsAxis.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(0,1), _CameraDepthTexture_ST))); // T depthsAxis.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(1,0), _CameraDepthTexture_ST))); // L depthsAxis.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(1,0), _CameraDepthTexture_ST))); // R depthsAxis.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(0,1), _CameraDepthTexture_ST))); // B // make it work nicely with depth based image effects such as depth of field: depthsDiag = (depthsDiag > centerDepth.xxxx) ? depthsDiag : centerDepth.xxxx; depthsAxis = (depthsAxis > centerDepth.xxxx) ? depthsAxis : centerDepth.xxxx; depthsDiag -= centerDepth; depthsAxis /= centerDepth; const float4 HorizDiagCoeff = float4(1,1,-1,-1); const float4 VertDiagCoeff = float4(-1,1,-1,1); const float4 HorizAxisCoeff = float4(1,0,0,-1); const float4 VertAxisCoeff = float4(0,1,-1,0); float4 SobelH = depthsDiag * HorizDiagCoeff + depthsAxis * HorizAxisCoeff; float4 SobelV = depthsDiag * VertDiagCoeff + depthsAxis * VertAxisCoeff; float SobelX = dot(SobelH, float4(1,1,1,1)); float SobelY = dot(SobelV, float4(1,1,1,1)); float Sobel = sqrt(SobelX * SobelX + SobelY * SobelY); Sobel = 1.0-pow(saturate(Sobel), _Exponent); return Sobel * lerp(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)), _BgColor, _BgFade); } half4 fragRobert(v2f i) : SV_Target { half4 sample1 = tex2D(_CameraDepthNormalsTexture, i.uv[1].xy); half4 sample2 = tex2D(_CameraDepthNormalsTexture, i.uv[2].xy); half4 sample3 = tex2D(_CameraDepthNormalsTexture, i.uv[3].xy); half4 sample4 = tex2D(_CameraDepthNormalsTexture, i.uv[4].xy); half edge = 1.0; edge *= CheckSame(sample1.xy, DecodeFloatRG(sample1.zw), sample2); edge *= CheckSame(sample3.xy, DecodeFloatRG(sample3.zw), sample4); return edge * lerp(tex2D(_MainTex, i.uv[0]), _BgColor, _BgFade); } half4 fragThin (v2f i) : SV_Target { half4 original = tex2D(_MainTex, i.uv[0]); half4 center = tex2D (_CameraDepthNormalsTexture, i.uv[1]); half4 sample1 = tex2D (_CameraDepthNormalsTexture, i.uv[2]); half4 sample2 = tex2D (_CameraDepthNormalsTexture, i.uv[3]); // encoded normal half2 centerNormal = center.xy; // decoded depth float centerDepth = DecodeFloatRG (center.zw); half edge = 1.0; edge *= CheckSame(centerNormal, centerDepth, sample1); edge *= CheckSame(centerNormal, centerDepth, sample2); return edge * lerp(original, _BgColor, _BgFade); } #line 283 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif /* UNITY: Original start of shader */ #pragma vertex vertThin #pragma fragment fragThin 3Assets/Standard Assets/Effects/ImageEffects/Shaders˙˙˙˙=(´žçˇ‘Šd{´ěy SHADOWS_SOFTDIRLIGHTMAP_COMBINEDDIRLIGHTMAP_SEPARATEDYNAMICLIGHTMAP_ON INSTANCING_ON ý*#line 291 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif #include "HLSLSupport.cginc" #include "UnityShaderVariables.cginc" #line 7 #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv[5] : TEXCOORD0; }; struct v2fd { float4 pos : SV_POSITION; float2 uv[2] : TEXCOORD0; }; sampler2D _MainTex; uniform float4 _MainTex_TexelSize; half4 _MainTex_ST; sampler2D _CameraDepthNormalsTexture; half4 _CameraDepthNormalsTexture_ST; sampler2D_float _CameraDepthTexture; half4 _CameraDepthTexture_ST; uniform half4 _Sensitivity; uniform half4 _BgColor; uniform half _BgFade; uniform half _SampleDistance; uniform float _Exponent; uniform float _Threshold; struct v2flum { float4 pos : SV_POSITION; float2 uv[3] : TEXCOORD0; }; v2flum vertLum (appdata_img v) { v2flum o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); float2 uv = MultiplyUV( UNITY_MATRIX_TEXTURE0, v.texcoord ); o.uv[0] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); o.uv[1] = UnityStereoScreenSpaceUVAdjust(uv + float2(-_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); o.uv[2] = UnityStereoScreenSpaceUVAdjust(uv + float2(+_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); return o; } fixed4 fragLum (v2flum i) : SV_Target { fixed4 original = tex2D(_MainTex, i.uv[0]); // a very simple cross gradient filter half3 p1 = original.rgb; half3 p2 = tex2D(_MainTex, i.uv[1]).rgb; half3 p3 = tex2D(_MainTex, i.uv[2]).rgb; half3 diff = p1 * 2 - p2 - p3; half len = dot(diff, diff); len = step(len, _Threshold); //if(len >= _Threshold) // original.rgb = 0; return len * lerp(original, _BgColor, _BgFade); } inline half CheckSame (half2 centerNormal, float centerDepth, half4 theSample) { // difference in normals // do not bother decoding normals - there's no need here half2 diff = abs(centerNormal - theSample.xy) * _Sensitivity.y; int isSameNormal = (diff.x + diff.y) * _Sensitivity.y < 0.1; // difference in depth float sampleDepth = DecodeFloatRG (theSample.zw); float zdiff = abs(centerDepth-sampleDepth); // scale the required threshold by the distance int isSameDepth = zdiff * _Sensitivity.x < 0.09 * centerDepth; // return: // 1 - if normals and depth are similar enough // 0 - otherwise return isSameNormal * isSameDepth ? 1.0 : 0.0; } v2f vertRobert( appdata_img v ) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); float2 uv = v.texcoord.xy; o.uv[0] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) uv.y = 1-uv.y; #endif // calc coord for the X pattern // maybe nicer TODO for the future: 'rotated triangles' o.uv[1] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(1,1) * _SampleDistance, _MainTex_ST); o.uv[2] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(-1,-1) * _SampleDistance, _MainTex_ST); o.uv[3] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(-1,1) * _SampleDistance, _MainTex_ST); o.uv[4] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(1,-1) * _SampleDistance, _MainTex_ST); return o; } v2f vertThin( appdata_img v ) { v2f o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); float2 uv = v.texcoord.xy; o.uv[0] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) uv.y = 1-uv.y; #endif o.uv[1] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); o.uv[4] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); // offsets for two additional samples o.uv[2] = UnityStereoScreenSpaceUVAdjust(uv + float2(-_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); o.uv[3] = UnityStereoScreenSpaceUVAdjust(uv + float2(+_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); return o; } v2fd vertD( appdata_img v ) { v2fd o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); float2 uv = v.texcoord.xy; o.uv[0] = uv; #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) uv.y = 1-uv.y; #endif o.uv[1] = uv; return o; } float4 fragDCheap(v2fd i) : SV_Target { // inspired by borderlands implementation of popular "sobel filter" float centerDepth = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv[1])); float4 depthsDiag; float4 depthsAxis; float2 uvDist = _SampleDistance * _MainTex_TexelSize.xy; depthsDiag.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist, _CameraDepthTexture_ST))); // TR depthsDiag.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(-1,1), _CameraDepthTexture_ST))); // TL depthsDiag.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(-1,1), _CameraDepthTexture_ST))); // BR depthsDiag.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist, _CameraDepthTexture_ST))); // BL depthsAxis.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(0,1), _CameraDepthTexture_ST))); // T depthsAxis.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(1,0), _CameraDepthTexture_ST))); // L depthsAxis.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(1,0), _CameraDepthTexture_ST))); // R depthsAxis.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(0,1), _CameraDepthTexture_ST))); // B depthsDiag -= centerDepth; depthsAxis /= centerDepth; const float4 HorizDiagCoeff = float4(1,1,-1,-1); const float4 VertDiagCoeff = float4(-1,1,-1,1); const float4 HorizAxisCoeff = float4(1,0,0,-1); const float4 VertAxisCoeff = float4(0,1,-1,0); float4 SobelH = depthsDiag * HorizDiagCoeff + depthsAxis * HorizAxisCoeff; float4 SobelV = depthsDiag * VertDiagCoeff + depthsAxis * VertAxisCoeff; float SobelX = dot(SobelH, float4(1,1,1,1)); float SobelY = dot(SobelV, float4(1,1,1,1)); float Sobel = sqrt(SobelX * SobelX + SobelY * SobelY); Sobel = 1.0-pow(saturate(Sobel), _Exponent); return Sobel * lerp(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)), _BgColor, _BgFade); } // pretty much also just a sobel filter, except for that edges "outside" the silhouette get discarded // which makes it compatible with other depth based post fx float4 fragD(v2fd i) : SV_Target { // inspired by borderlands implementation of popular "sobel filter" float centerDepth = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1], _CameraDepthTexture_ST))); float4 depthsDiag; float4 depthsAxis; float2 uvDist = _SampleDistance * _MainTex_TexelSize.xy; depthsDiag.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist, _CameraDepthTexture_ST))); // TR depthsDiag.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(-1,1), _CameraDepthTexture_ST))); // TL depthsDiag.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(-1,1), _CameraDepthTexture_ST))); // BR depthsDiag.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist, _CameraDepthTexture_ST))); // BL depthsAxis.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(0,1), _CameraDepthTexture_ST))); // T depthsAxis.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(1,0), _CameraDepthTexture_ST))); // L depthsAxis.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(1,0), _CameraDepthTexture_ST))); // R depthsAxis.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(0,1), _CameraDepthTexture_ST))); // B // make it work nicely with depth based image effects such as depth of field: depthsDiag = (depthsDiag > centerDepth.xxxx) ? depthsDiag : centerDepth.xxxx; depthsAxis = (depthsAxis > centerDepth.xxxx) ? depthsAxis : centerDepth.xxxx; depthsDiag -= centerDepth; depthsAxis /= centerDepth; const float4 HorizDiagCoeff = float4(1,1,-1,-1); const float4 VertDiagCoeff = float4(-1,1,-1,1); const float4 HorizAxisCoeff = float4(1,0,0,-1); const float4 VertAxisCoeff = float4(0,1,-1,0); float4 SobelH = depthsDiag * HorizDiagCoeff + depthsAxis * HorizAxisCoeff; float4 SobelV = depthsDiag * VertDiagCoeff + depthsAxis * VertAxisCoeff; float SobelX = dot(SobelH, float4(1,1,1,1)); float SobelY = dot(SobelV, float4(1,1,1,1)); float Sobel = sqrt(SobelX * SobelX + SobelY * SobelY); Sobel = 1.0-pow(saturate(Sobel), _Exponent); return Sobel * lerp(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)), _BgColor, _BgFade); } half4 fragRobert(v2f i) : SV_Target { half4 sample1 = tex2D(_CameraDepthNormalsTexture, i.uv[1].xy); half4 sample2 = tex2D(_CameraDepthNormalsTexture, i.uv[2].xy); half4 sample3 = tex2D(_CameraDepthNormalsTexture, i.uv[3].xy); half4 sample4 = tex2D(_CameraDepthNormalsTexture, i.uv[4].xy); half edge = 1.0; edge *= CheckSame(sample1.xy, DecodeFloatRG(sample1.zw), sample2); edge *= CheckSame(sample3.xy, DecodeFloatRG(sample3.zw), sample4); return edge * lerp(tex2D(_MainTex, i.uv[0]), _BgColor, _BgFade); } half4 fragThin (v2f i) : SV_Target { half4 original = tex2D(_MainTex, i.uv[0]); half4 center = tex2D (_CameraDepthNormalsTexture, i.uv[1]); half4 sample1 = tex2D (_CameraDepthNormalsTexture, i.uv[2]); half4 sample2 = tex2D (_CameraDepthNormalsTexture, i.uv[3]); // encoded normal half2 centerNormal = center.xy; // decoded depth float centerDepth = DecodeFloatRG (center.zw); half edge = 1.0; edge *= CheckSame(centerNormal, centerDepth, sample1); edge *= CheckSame(centerNormal, centerDepth, sample2); return edge * lerp(original, _BgColor, _BgFade); } #line 291 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif /* UNITY: Original start of shader */ #pragma vertex vertRobert #pragma fragment fragRobert 3Assets/Standard Assets/Effects/ImageEffects/Shaders˙˙˙˙%=(´žçˇ‘Šd{´ěy SHADOWS_SOFTDIRLIGHTMAP_COMBINEDDIRLIGHTMAP_SEPARATEDYNAMICLIGHTMAP_ON INSTANCING_ON/d%*#line 299 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif #include "HLSLSupport.cginc" #include "UnityShaderVariables.cginc" #line 7 #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv[5] : TEXCOORD0; }; struct v2fd { float4 pos : SV_POSITION; float2 uv[2] : TEXCOORD0; }; sampler2D _MainTex; uniform float4 _MainTex_TexelSize; half4 _MainTex_ST; sampler2D _CameraDepthNormalsTexture; half4 _CameraDepthNormalsTexture_ST; sampler2D_float _CameraDepthTexture; half4 _CameraDepthTexture_ST; uniform half4 _Sensitivity; uniform half4 _BgColor; uniform half _BgFade; uniform half _SampleDistance; uniform float _Exponent; uniform float _Threshold; struct v2flum { float4 pos : SV_POSITION; float2 uv[3] : TEXCOORD0; }; v2flum vertLum (appdata_img v) { v2flum o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); float2 uv = MultiplyUV( UNITY_MATRIX_TEXTURE0, v.texcoord ); o.uv[0] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); o.uv[1] = UnityStereoScreenSpaceUVAdjust(uv + float2(-_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); o.uv[2] = UnityStereoScreenSpaceUVAdjust(uv + float2(+_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); return o; } fixed4 fragLum (v2flum i) : SV_Target { fixed4 original = tex2D(_MainTex, i.uv[0]); // a very simple cross gradient filter half3 p1 = original.rgb; half3 p2 = tex2D(_MainTex, i.uv[1]).rgb; half3 p3 = tex2D(_MainTex, i.uv[2]).rgb; half3 diff = p1 * 2 - p2 - p3; half len = dot(diff, diff); len = step(len, _Threshold); //if(len >= _Threshold) // original.rgb = 0; return len * lerp(original, _BgColor, _BgFade); } inline half CheckSame (half2 centerNormal, float centerDepth, half4 theSample) { // difference in normals // do not bother decoding normals - there's no need here half2 diff = abs(centerNormal - theSample.xy) * _Sensitivity.y; int isSameNormal = (diff.x + diff.y) * _Sensitivity.y < 0.1; // difference in depth float sampleDepth = DecodeFloatRG (theSample.zw); float zdiff = abs(centerDepth-sampleDepth); // scale the required threshold by the distance int isSameDepth = zdiff * _Sensitivity.x < 0.09 * centerDepth; // return: // 1 - if normals and depth are similar enough // 0 - otherwise return isSameNormal * isSameDepth ? 1.0 : 0.0; } v2f vertRobert( appdata_img v ) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); float2 uv = v.texcoord.xy; o.uv[0] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) uv.y = 1-uv.y; #endif // calc coord for the X pattern // maybe nicer TODO for the future: 'rotated triangles' o.uv[1] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(1,1) * _SampleDistance, _MainTex_ST); o.uv[2] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(-1,-1) * _SampleDistance, _MainTex_ST); o.uv[3] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(-1,1) * _SampleDistance, _MainTex_ST); o.uv[4] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(1,-1) * _SampleDistance, _MainTex_ST); return o; } v2f vertThin( appdata_img v ) { v2f o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); float2 uv = v.texcoord.xy; o.uv[0] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) uv.y = 1-uv.y; #endif o.uv[1] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); o.uv[4] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); // offsets for two additional samples o.uv[2] = UnityStereoScreenSpaceUVAdjust(uv + float2(-_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); o.uv[3] = UnityStereoScreenSpaceUVAdjust(uv + float2(+_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); return o; } v2fd vertD( appdata_img v ) { v2fd o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); float2 uv = v.texcoord.xy; o.uv[0] = uv; #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) uv.y = 1-uv.y; #endif o.uv[1] = uv; return o; } float4 fragDCheap(v2fd i) : SV_Target { // inspired by borderlands implementation of popular "sobel filter" float centerDepth = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv[1])); float4 depthsDiag; float4 depthsAxis; float2 uvDist = _SampleDistance * _MainTex_TexelSize.xy; depthsDiag.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist, _CameraDepthTexture_ST))); // TR depthsDiag.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(-1,1), _CameraDepthTexture_ST))); // TL depthsDiag.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(-1,1), _CameraDepthTexture_ST))); // BR depthsDiag.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist, _CameraDepthTexture_ST))); // BL depthsAxis.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(0,1), _CameraDepthTexture_ST))); // T depthsAxis.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(1,0), _CameraDepthTexture_ST))); // L depthsAxis.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(1,0), _CameraDepthTexture_ST))); // R depthsAxis.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(0,1), _CameraDepthTexture_ST))); // B depthsDiag -= centerDepth; depthsAxis /= centerDepth; const float4 HorizDiagCoeff = float4(1,1,-1,-1); const float4 VertDiagCoeff = float4(-1,1,-1,1); const float4 HorizAxisCoeff = float4(1,0,0,-1); const float4 VertAxisCoeff = float4(0,1,-1,0); float4 SobelH = depthsDiag * HorizDiagCoeff + depthsAxis * HorizAxisCoeff; float4 SobelV = depthsDiag * VertDiagCoeff + depthsAxis * VertAxisCoeff; float SobelX = dot(SobelH, float4(1,1,1,1)); float SobelY = dot(SobelV, float4(1,1,1,1)); float Sobel = sqrt(SobelX * SobelX + SobelY * SobelY); Sobel = 1.0-pow(saturate(Sobel), _Exponent); return Sobel * lerp(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)), _BgColor, _BgFade); } // pretty much also just a sobel filter, except for that edges "outside" the silhouette get discarded // which makes it compatible with other depth based post fx float4 fragD(v2fd i) : SV_Target { // inspired by borderlands implementation of popular "sobel filter" float centerDepth = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1], _CameraDepthTexture_ST))); float4 depthsDiag; float4 depthsAxis; float2 uvDist = _SampleDistance * _MainTex_TexelSize.xy; depthsDiag.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist, _CameraDepthTexture_ST))); // TR depthsDiag.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(-1,1), _CameraDepthTexture_ST))); // TL depthsDiag.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(-1,1), _CameraDepthTexture_ST))); // BR depthsDiag.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist, _CameraDepthTexture_ST))); // BL depthsAxis.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(0,1), _CameraDepthTexture_ST))); // T depthsAxis.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(1,0), _CameraDepthTexture_ST))); // L depthsAxis.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(1,0), _CameraDepthTexture_ST))); // R depthsAxis.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(0,1), _CameraDepthTexture_ST))); // B // make it work nicely with depth based image effects such as depth of field: depthsDiag = (depthsDiag > centerDepth.xxxx) ? depthsDiag : centerDepth.xxxx; depthsAxis = (depthsAxis > centerDepth.xxxx) ? depthsAxis : centerDepth.xxxx; depthsDiag -= centerDepth; depthsAxis /= centerDepth; const float4 HorizDiagCoeff = float4(1,1,-1,-1); const float4 VertDiagCoeff = float4(-1,1,-1,1); const float4 HorizAxisCoeff = float4(1,0,0,-1); const float4 VertAxisCoeff = float4(0,1,-1,0); float4 SobelH = depthsDiag * HorizDiagCoeff + depthsAxis * HorizAxisCoeff; float4 SobelV = depthsDiag * VertDiagCoeff + depthsAxis * VertAxisCoeff; float SobelX = dot(SobelH, float4(1,1,1,1)); float SobelY = dot(SobelV, float4(1,1,1,1)); float Sobel = sqrt(SobelX * SobelX + SobelY * SobelY); Sobel = 1.0-pow(saturate(Sobel), _Exponent); return Sobel * lerp(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)), _BgColor, _BgFade); } half4 fragRobert(v2f i) : SV_Target { half4 sample1 = tex2D(_CameraDepthNormalsTexture, i.uv[1].xy); half4 sample2 = tex2D(_CameraDepthNormalsTexture, i.uv[2].xy); half4 sample3 = tex2D(_CameraDepthNormalsTexture, i.uv[3].xy); half4 sample4 = tex2D(_CameraDepthNormalsTexture, i.uv[4].xy); half edge = 1.0; edge *= CheckSame(sample1.xy, DecodeFloatRG(sample1.zw), sample2); edge *= CheckSame(sample3.xy, DecodeFloatRG(sample3.zw), sample4); return edge * lerp(tex2D(_MainTex, i.uv[0]), _BgColor, _BgFade); } half4 fragThin (v2f i) : SV_Target { half4 original = tex2D(_MainTex, i.uv[0]); half4 center = tex2D (_CameraDepthNormalsTexture, i.uv[1]); half4 sample1 = tex2D (_CameraDepthNormalsTexture, i.uv[2]); half4 sample2 = tex2D (_CameraDepthNormalsTexture, i.uv[3]); // encoded normal half2 centerNormal = center.xy; // decoded depth float centerDepth = DecodeFloatRG (center.zw); half edge = 1.0; edge *= CheckSame(centerNormal, centerDepth, sample1); edge *= CheckSame(centerNormal, centerDepth, sample2); return edge * lerp(original, _BgColor, _BgFade); } #line 299 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif /* UNITY: Original start of shader */ #pragma target 3.0 #pragma vertex vertD #pragma fragment fragDCheap 3Assets/Standard Assets/Effects/ImageEffects/Shaders˙˙˙˙-=(´žçˇ‘Šd{´ěy SHADOWS_SOFTDIRLIGHTMAP_COMBINEDDIRLIGHTMAP_SEPARATEDYNAMICLIGHTMAP_ON INSTANCING_ON¨ *#line 308 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif #include "HLSLSupport.cginc" #include "UnityShaderVariables.cginc" #line 7 #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv[5] : TEXCOORD0; }; struct v2fd { float4 pos : SV_POSITION; float2 uv[2] : TEXCOORD0; }; sampler2D _MainTex; uniform float4 _MainTex_TexelSize; half4 _MainTex_ST; sampler2D _CameraDepthNormalsTexture; half4 _CameraDepthNormalsTexture_ST; sampler2D_float _CameraDepthTexture; half4 _CameraDepthTexture_ST; uniform half4 _Sensitivity; uniform half4 _BgColor; uniform half _BgFade; uniform half _SampleDistance; uniform float _Exponent; uniform float _Threshold; struct v2flum { float4 pos : SV_POSITION; float2 uv[3] : TEXCOORD0; }; v2flum vertLum (appdata_img v) { v2flum o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); float2 uv = MultiplyUV( UNITY_MATRIX_TEXTURE0, v.texcoord ); o.uv[0] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); o.uv[1] = UnityStereoScreenSpaceUVAdjust(uv + float2(-_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); o.uv[2] = UnityStereoScreenSpaceUVAdjust(uv + float2(+_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); return o; } fixed4 fragLum (v2flum i) : SV_Target { fixed4 original = tex2D(_MainTex, i.uv[0]); // a very simple cross gradient filter half3 p1 = original.rgb; half3 p2 = tex2D(_MainTex, i.uv[1]).rgb; half3 p3 = tex2D(_MainTex, i.uv[2]).rgb; half3 diff = p1 * 2 - p2 - p3; half len = dot(diff, diff); len = step(len, _Threshold); //if(len >= _Threshold) // original.rgb = 0; return len * lerp(original, _BgColor, _BgFade); } inline half CheckSame (half2 centerNormal, float centerDepth, half4 theSample) { // difference in normals // do not bother decoding normals - there's no need here half2 diff = abs(centerNormal - theSample.xy) * _Sensitivity.y; int isSameNormal = (diff.x + diff.y) * _Sensitivity.y < 0.1; // difference in depth float sampleDepth = DecodeFloatRG (theSample.zw); float zdiff = abs(centerDepth-sampleDepth); // scale the required threshold by the distance int isSameDepth = zdiff * _Sensitivity.x < 0.09 * centerDepth; // return: // 1 - if normals and depth are similar enough // 0 - otherwise return isSameNormal * isSameDepth ? 1.0 : 0.0; } v2f vertRobert( appdata_img v ) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); float2 uv = v.texcoord.xy; o.uv[0] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) uv.y = 1-uv.y; #endif // calc coord for the X pattern // maybe nicer TODO for the future: 'rotated triangles' o.uv[1] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(1,1) * _SampleDistance, _MainTex_ST); o.uv[2] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(-1,-1) * _SampleDistance, _MainTex_ST); o.uv[3] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(-1,1) * _SampleDistance, _MainTex_ST); o.uv[4] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(1,-1) * _SampleDistance, _MainTex_ST); return o; } v2f vertThin( appdata_img v ) { v2f o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); float2 uv = v.texcoord.xy; o.uv[0] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) uv.y = 1-uv.y; #endif o.uv[1] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); o.uv[4] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); // offsets for two additional samples o.uv[2] = UnityStereoScreenSpaceUVAdjust(uv + float2(-_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); o.uv[3] = UnityStereoScreenSpaceUVAdjust(uv + float2(+_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); return o; } v2fd vertD( appdata_img v ) { v2fd o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); float2 uv = v.texcoord.xy; o.uv[0] = uv; #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) uv.y = 1-uv.y; #endif o.uv[1] = uv; return o; } float4 fragDCheap(v2fd i) : SV_Target { // inspired by borderlands implementation of popular "sobel filter" float centerDepth = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv[1])); float4 depthsDiag; float4 depthsAxis; float2 uvDist = _SampleDistance * _MainTex_TexelSize.xy; depthsDiag.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist, _CameraDepthTexture_ST))); // TR depthsDiag.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(-1,1), _CameraDepthTexture_ST))); // TL depthsDiag.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(-1,1), _CameraDepthTexture_ST))); // BR depthsDiag.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist, _CameraDepthTexture_ST))); // BL depthsAxis.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(0,1), _CameraDepthTexture_ST))); // T depthsAxis.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(1,0), _CameraDepthTexture_ST))); // L depthsAxis.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(1,0), _CameraDepthTexture_ST))); // R depthsAxis.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(0,1), _CameraDepthTexture_ST))); // B depthsDiag -= centerDepth; depthsAxis /= centerDepth; const float4 HorizDiagCoeff = float4(1,1,-1,-1); const float4 VertDiagCoeff = float4(-1,1,-1,1); const float4 HorizAxisCoeff = float4(1,0,0,-1); const float4 VertAxisCoeff = float4(0,1,-1,0); float4 SobelH = depthsDiag * HorizDiagCoeff + depthsAxis * HorizAxisCoeff; float4 SobelV = depthsDiag * VertDiagCoeff + depthsAxis * VertAxisCoeff; float SobelX = dot(SobelH, float4(1,1,1,1)); float SobelY = dot(SobelV, float4(1,1,1,1)); float Sobel = sqrt(SobelX * SobelX + SobelY * SobelY); Sobel = 1.0-pow(saturate(Sobel), _Exponent); return Sobel * lerp(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)), _BgColor, _BgFade); } // pretty much also just a sobel filter, except for that edges "outside" the silhouette get discarded // which makes it compatible with other depth based post fx float4 fragD(v2fd i) : SV_Target { // inspired by borderlands implementation of popular "sobel filter" float centerDepth = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1], _CameraDepthTexture_ST))); float4 depthsDiag; float4 depthsAxis; float2 uvDist = _SampleDistance * _MainTex_TexelSize.xy; depthsDiag.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist, _CameraDepthTexture_ST))); // TR depthsDiag.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(-1,1), _CameraDepthTexture_ST))); // TL depthsDiag.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(-1,1), _CameraDepthTexture_ST))); // BR depthsDiag.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist, _CameraDepthTexture_ST))); // BL depthsAxis.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(0,1), _CameraDepthTexture_ST))); // T depthsAxis.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(1,0), _CameraDepthTexture_ST))); // L depthsAxis.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(1,0), _CameraDepthTexture_ST))); // R depthsAxis.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(0,1), _CameraDepthTexture_ST))); // B // make it work nicely with depth based image effects such as depth of field: depthsDiag = (depthsDiag > centerDepth.xxxx) ? depthsDiag : centerDepth.xxxx; depthsAxis = (depthsAxis > centerDepth.xxxx) ? depthsAxis : centerDepth.xxxx; depthsDiag -= centerDepth; depthsAxis /= centerDepth; const float4 HorizDiagCoeff = float4(1,1,-1,-1); const float4 VertDiagCoeff = float4(-1,1,-1,1); const float4 HorizAxisCoeff = float4(1,0,0,-1); const float4 VertAxisCoeff = float4(0,1,-1,0); float4 SobelH = depthsDiag * HorizDiagCoeff + depthsAxis * HorizAxisCoeff; float4 SobelV = depthsDiag * VertDiagCoeff + depthsAxis * VertAxisCoeff; float SobelX = dot(SobelH, float4(1,1,1,1)); float SobelY = dot(SobelV, float4(1,1,1,1)); float Sobel = sqrt(SobelX * SobelX + SobelY * SobelY); Sobel = 1.0-pow(saturate(Sobel), _Exponent); return Sobel * lerp(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)), _BgColor, _BgFade); } half4 fragRobert(v2f i) : SV_Target { half4 sample1 = tex2D(_CameraDepthNormalsTexture, i.uv[1].xy); half4 sample2 = tex2D(_CameraDepthNormalsTexture, i.uv[2].xy); half4 sample3 = tex2D(_CameraDepthNormalsTexture, i.uv[3].xy); half4 sample4 = tex2D(_CameraDepthNormalsTexture, i.uv[4].xy); half edge = 1.0; edge *= CheckSame(sample1.xy, DecodeFloatRG(sample1.zw), sample2); edge *= CheckSame(sample3.xy, DecodeFloatRG(sample3.zw), sample4); return edge * lerp(tex2D(_MainTex, i.uv[0]), _BgColor, _BgFade); } half4 fragThin (v2f i) : SV_Target { half4 original = tex2D(_MainTex, i.uv[0]); half4 center = tex2D (_CameraDepthNormalsTexture, i.uv[1]); half4 sample1 = tex2D (_CameraDepthNormalsTexture, i.uv[2]); half4 sample2 = tex2D (_CameraDepthNormalsTexture, i.uv[3]); // encoded normal half2 centerNormal = center.xy; // decoded depth float centerDepth = DecodeFloatRG (center.zw); half edge = 1.0; edge *= CheckSame(centerNormal, centerDepth, sample1); edge *= CheckSame(centerNormal, centerDepth, sample2); return edge * lerp(original, _BgColor, _BgFade); } #line 308 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif /* UNITY: Original start of shader */ #pragma target 3.0 #pragma vertex vertD #pragma fragment fragD 3Assets/Standard Assets/Effects/ImageEffects/Shaders˙˙˙˙6=(´žçˇ‘Šd{´ěy SHADOWS_SOFTDIRLIGHTMAP_COMBINEDDIRLIGHTMAP_SEPARATEDYNAMICLIGHTMAP_ON INSTANCING_ONíp$*#line 317 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif #include "HLSLSupport.cginc" #include "UnityShaderVariables.cginc" #line 7 #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv[5] : TEXCOORD0; }; struct v2fd { float4 pos : SV_POSITION; float2 uv[2] : TEXCOORD0; }; sampler2D _MainTex; uniform float4 _MainTex_TexelSize; half4 _MainTex_ST; sampler2D _CameraDepthNormalsTexture; half4 _CameraDepthNormalsTexture_ST; sampler2D_float _CameraDepthTexture; half4 _CameraDepthTexture_ST; uniform half4 _Sensitivity; uniform half4 _BgColor; uniform half _BgFade; uniform half _SampleDistance; uniform float _Exponent; uniform float _Threshold; struct v2flum { float4 pos : SV_POSITION; float2 uv[3] : TEXCOORD0; }; v2flum vertLum (appdata_img v) { v2flum o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); float2 uv = MultiplyUV( UNITY_MATRIX_TEXTURE0, v.texcoord ); o.uv[0] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); o.uv[1] = UnityStereoScreenSpaceUVAdjust(uv + float2(-_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); o.uv[2] = UnityStereoScreenSpaceUVAdjust(uv + float2(+_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); return o; } fixed4 fragLum (v2flum i) : SV_Target { fixed4 original = tex2D(_MainTex, i.uv[0]); // a very simple cross gradient filter half3 p1 = original.rgb; half3 p2 = tex2D(_MainTex, i.uv[1]).rgb; half3 p3 = tex2D(_MainTex, i.uv[2]).rgb; half3 diff = p1 * 2 - p2 - p3; half len = dot(diff, diff); len = step(len, _Threshold); //if(len >= _Threshold) // original.rgb = 0; return len * lerp(original, _BgColor, _BgFade); } inline half CheckSame (half2 centerNormal, float centerDepth, half4 theSample) { // difference in normals // do not bother decoding normals - there's no need here half2 diff = abs(centerNormal - theSample.xy) * _Sensitivity.y; int isSameNormal = (diff.x + diff.y) * _Sensitivity.y < 0.1; // difference in depth float sampleDepth = DecodeFloatRG (theSample.zw); float zdiff = abs(centerDepth-sampleDepth); // scale the required threshold by the distance int isSameDepth = zdiff * _Sensitivity.x < 0.09 * centerDepth; // return: // 1 - if normals and depth are similar enough // 0 - otherwise return isSameNormal * isSameDepth ? 1.0 : 0.0; } v2f vertRobert( appdata_img v ) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); float2 uv = v.texcoord.xy; o.uv[0] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) uv.y = 1-uv.y; #endif // calc coord for the X pattern // maybe nicer TODO for the future: 'rotated triangles' o.uv[1] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(1,1) * _SampleDistance, _MainTex_ST); o.uv[2] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(-1,-1) * _SampleDistance, _MainTex_ST); o.uv[3] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(-1,1) * _SampleDistance, _MainTex_ST); o.uv[4] = UnityStereoScreenSpaceUVAdjust(uv + _MainTex_TexelSize.xy * half2(1,-1) * _SampleDistance, _MainTex_ST); return o; } v2f vertThin( appdata_img v ) { v2f o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); float2 uv = v.texcoord.xy; o.uv[0] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) uv.y = 1-uv.y; #endif o.uv[1] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); o.uv[4] = UnityStereoScreenSpaceUVAdjust(uv, _MainTex_ST); // offsets for two additional samples o.uv[2] = UnityStereoScreenSpaceUVAdjust(uv + float2(-_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); o.uv[3] = UnityStereoScreenSpaceUVAdjust(uv + float2(+_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _SampleDistance, _MainTex_ST); return o; } v2fd vertD( appdata_img v ) { v2fd o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); float2 uv = v.texcoord.xy; o.uv[0] = uv; #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) uv.y = 1-uv.y; #endif o.uv[1] = uv; return o; } float4 fragDCheap(v2fd i) : SV_Target { // inspired by borderlands implementation of popular "sobel filter" float centerDepth = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv[1])); float4 depthsDiag; float4 depthsAxis; float2 uvDist = _SampleDistance * _MainTex_TexelSize.xy; depthsDiag.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist, _CameraDepthTexture_ST))); // TR depthsDiag.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(-1,1), _CameraDepthTexture_ST))); // TL depthsDiag.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(-1,1), _CameraDepthTexture_ST))); // BR depthsDiag.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist, _CameraDepthTexture_ST))); // BL depthsAxis.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(0,1), _CameraDepthTexture_ST))); // T depthsAxis.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(1,0), _CameraDepthTexture_ST))); // L depthsAxis.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(1,0), _CameraDepthTexture_ST))); // R depthsAxis.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(0,1), _CameraDepthTexture_ST))); // B depthsDiag -= centerDepth; depthsAxis /= centerDepth; const float4 HorizDiagCoeff = float4(1,1,-1,-1); const float4 VertDiagCoeff = float4(-1,1,-1,1); const float4 HorizAxisCoeff = float4(1,0,0,-1); const float4 VertAxisCoeff = float4(0,1,-1,0); float4 SobelH = depthsDiag * HorizDiagCoeff + depthsAxis * HorizAxisCoeff; float4 SobelV = depthsDiag * VertDiagCoeff + depthsAxis * VertAxisCoeff; float SobelX = dot(SobelH, float4(1,1,1,1)); float SobelY = dot(SobelV, float4(1,1,1,1)); float Sobel = sqrt(SobelX * SobelX + SobelY * SobelY); Sobel = 1.0-pow(saturate(Sobel), _Exponent); return Sobel * lerp(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)), _BgColor, _BgFade); } // pretty much also just a sobel filter, except for that edges "outside" the silhouette get discarded // which makes it compatible with other depth based post fx float4 fragD(v2fd i) : SV_Target { // inspired by borderlands implementation of popular "sobel filter" float centerDepth = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1], _CameraDepthTexture_ST))); float4 depthsDiag; float4 depthsAxis; float2 uvDist = _SampleDistance * _MainTex_TexelSize.xy; depthsDiag.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist, _CameraDepthTexture_ST))); // TR depthsDiag.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(-1,1), _CameraDepthTexture_ST))); // TL depthsDiag.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(-1,1), _CameraDepthTexture_ST))); // BR depthsDiag.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist, _CameraDepthTexture_ST))); // BL depthsAxis.x = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(0,1), _CameraDepthTexture_ST))); // T depthsAxis.y = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(1,0), _CameraDepthTexture_ST))); // L depthsAxis.z = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]+uvDist*float2(1,0), _CameraDepthTexture_ST))); // R depthsAxis.w = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoScreenSpaceUVAdjust(i.uv[1]-uvDist*float2(0,1), _CameraDepthTexture_ST))); // B // make it work nicely with depth based image effects such as depth of field: depthsDiag = (depthsDiag > centerDepth.xxxx) ? depthsDiag : centerDepth.xxxx; depthsAxis = (depthsAxis > centerDepth.xxxx) ? depthsAxis : centerDepth.xxxx; depthsDiag -= centerDepth; depthsAxis /= centerDepth; const float4 HorizDiagCoeff = float4(1,1,-1,-1); const float4 VertDiagCoeff = float4(-1,1,-1,1); const float4 HorizAxisCoeff = float4(1,0,0,-1); const float4 VertAxisCoeff = float4(0,1,-1,0); float4 SobelH = depthsDiag * HorizDiagCoeff + depthsAxis * HorizAxisCoeff; float4 SobelV = depthsDiag * VertDiagCoeff + depthsAxis * VertAxisCoeff; float SobelX = dot(SobelH, float4(1,1,1,1)); float SobelY = dot(SobelV, float4(1,1,1,1)); float Sobel = sqrt(SobelX * SobelX + SobelY * SobelY); Sobel = 1.0-pow(saturate(Sobel), _Exponent); return Sobel * lerp(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv[0].xy, _MainTex_ST)), _BgColor, _BgFade); } half4 fragRobert(v2f i) : SV_Target { half4 sample1 = tex2D(_CameraDepthNormalsTexture, i.uv[1].xy); half4 sample2 = tex2D(_CameraDepthNormalsTexture, i.uv[2].xy); half4 sample3 = tex2D(_CameraDepthNormalsTexture, i.uv[3].xy); half4 sample4 = tex2D(_CameraDepthNormalsTexture, i.uv[4].xy); half edge = 1.0; edge *= CheckSame(sample1.xy, DecodeFloatRG(sample1.zw), sample2); edge *= CheckSame(sample3.xy, DecodeFloatRG(sample3.zw), sample4); return edge * lerp(tex2D(_MainTex, i.uv[0]), _BgColor, _BgFade); } half4 fragThin (v2f i) : SV_Target { half4 original = tex2D(_MainTex, i.uv[0]); half4 center = tex2D (_CameraDepthNormalsTexture, i.uv[1]); half4 sample1 = tex2D (_CameraDepthNormalsTexture, i.uv[2]); half4 sample2 = tex2D (_CameraDepthNormalsTexture, i.uv[3]); // encoded normal half2 centerNormal = center.xy; // decoded depth float centerDepth = DecodeFloatRG (center.zw); half edge = 1.0; edge *= CheckSame(centerNormal, centerDepth, sample1); edge *= CheckSame(centerNormal, centerDepth, sample2); return edge * lerp(original, _BgColor, _BgFade); } #line 317 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif /* UNITY: Original start of shader */ #pragma target 3.0 #pragma vertex vertLum #pragma fragment fragLum 3Assets/Standard Assets/Effects/ImageEffects/Shaders˙˙˙˙?=(´žçˇ‘Šd{´ěy SHADOWS_SOFTDIRLIGHTMAP_COMBINEDDIRLIGHTMAP_SEPARATEDYNAMICLIGHTMAP_ON INSTANCING_ON