œ]7Öœ€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Іš3wĎbJ”“­Ýnďó EAssets/Standard Assets/Effects/ImageEffects/Shaders/Tonemapper.shader_MainTexblack _SmallTexgrey_Curveblack €? €? 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˙˙˙˙8 @ A  @ A pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA A A A A C C unity_FogStart unity_FogEndunity_FogDensity unity_FogColor˙˙˙˙ze€? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA A A A A C C unity_FogStart unity_FogEndunity_FogDensity unity_FogColor˙˙˙˙Ť8€? €? 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˙˙˙˙Sz€? €? 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˙˙˙˙ěS€? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA A A A A C C unity_FogStart unity_FogEndunity_FogDensity unity_FogColor˙˙˙˙Sw €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA €? €? pA A A A A C C unity_FogStart unity_FogEndunity_FogDensity unity_FogColor˙˙˙˙3Ą Hidden/Tonemapper _Š#line 243 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif #include "HLSLSupport.cginc" #include "UnityShaderVariables.cginc" #line 8 #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; }; sampler2D _MainTex; sampler2D _SmallTex; sampler2D _Curve; float4 _HdrParams; float2 intensity; float4 _MainTex_TexelSize; half4 _MainTex_ST; float _AdaptionSpeed; float _ExposureAdjustment; float _RangeScale; v2f vert( appdata_img v ) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.texcoord.xy; return o; } float4 fragLog(v2f i) : SV_Target { const float EPSILON = 1e-4h; float fLogLumSum = 0.0f; fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1,-1), _MainTex_ST)).rgb))); float avg = fLogLumSum / 4.0; return float4(avg, avg, avg, avg); } float4 fragExp(v2f i) : SV_Target { float2 lum = float2(0.0f, 0.0f); lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,1), _MainTex_ST)).xy; lum = exp(lum / 4.0f); return float4(lum.x, lum.y, lum.x, saturate(0.0125 * _AdaptionSpeed)); } float3 ToCIE(float3 FullScreenImage) { // RGB -> XYZ conversion // http://www.w3.org/Graphics/Color/sRGB // The official sRGB to XYZ conversion matrix is (following ITU-R BT.709) // 0.4125 0.3576 0.1805 // 0.2126 0.7152 0.0722 // 0.0193 0.1192 0.9505 float3x3 RGB2XYZ = {0.5141364, 0.3238786, 0.16036376, 0.265068, 0.67023428, 0.06409157, 0.0241188, 0.1228178, 0.84442666}; float3 XYZ = mul(RGB2XYZ, FullScreenImage.rgb); // XYZ -> Yxy conversion float3 Yxy; Yxy.r = XYZ.g; // x = X / (X + Y + Z) // y = X / (X + Y + Z) float temp = dot(float3(1.0,1.0,1.0), XYZ.rgb); Yxy.gb = XYZ.rg / temp; return Yxy; } float3 FromCIE(float3 Yxy) { float3 XYZ; // Yxy -> XYZ conversion XYZ.r = Yxy.r * Yxy.g / Yxy. b; // X = Y * x / y XYZ.g = Yxy.r; // copy luminance Y XYZ.b = Yxy.r * (1 - Yxy.g - Yxy.b) / Yxy.b; // Z = Y * (1-x-y) / y // XYZ -> RGB conversion // The official XYZ to sRGB conversion matrix is (following ITU-R BT.709) // 3.2410 -1.5374 -0.4986 // -0.9692 1.8760 0.0416 // 0.0556 -0.2040 1.0570 float3x3 XYZ2RGB = { 2.5651,-1.1665,-0.3986, -1.0217, 1.9777, 0.0439, 0.0753, -0.2543, 1.1892}; return mul(XYZ2RGB, XYZ); } // NOTE/OPTIMIZATION: we're not going the extra CIE detour anymore, but // scale with the OUT/IN luminance ratio,this is sooooo much faster float4 fragAdaptive(v2f i) : SV_Target { float avgLum = tex2D(_SmallTex, i.uv).x; float4 color = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (_HdrParams.w)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragAdaptiveAutoWhite(v2f i) : SV_Target { float2 avgLum = tex2D(_SmallTex, i.uv).xy; float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (avgLum.y*avgLum.y)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragCurve(v2f i) : SV_Target { float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float3 cie = ToCIE(color.rgb); // Remap to new lum range float newLum = tex2D(_Curve, float2(cie.r * _RangeScale, 0.5)).r; cie.r = newLum; color.rgb = FromCIE(cie); return color; } float4 fragHable(v2f i) : SV_Target { const float A = 0.15; const float B = 0.50; const float C = 0.10; const float D = 0.20; const float E = 0.02; const float F = 0.30; const float W = 11.2; float3 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)).rgb; texColor *= _ExposureAdjustment; float ExposureBias = 2.0; float3 x = ExposureBias*texColor; float3 curr = ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F; x = W; float3 whiteScale = 1.0f/(((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F); float3 color = curr*whiteScale; // float3 retColor = pow(color,1/2.2); // we have SRGB write enabled at this stage return float4(color, 1.0); } // we are doing it on luminance here (better color preservation, but some other problems like very fast saturation) float4 fragSimpleReinhard(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float lum = Luminance(texColor.rgb); float lumTm = lum * _ExposureAdjustment; float scale = lumTm / (1+lumTm); return float4(texColor.rgb * scale / lum, texColor.a); } float4 fragOptimizedHejiDawson(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); texColor *= _ExposureAdjustment; float4 X = max(float4(0.0,0.0,0.0,0.0), texColor-0.004); float4 retColor = (X*(6.2*X+.5))/(X*(6.2*X+1.7)+0.06); return retColor*retColor; } float4 fragPhotographic(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); return 1-exp2(-_ExposureAdjustment * texColor); } float4 fragDownsample(v2f i) : SV_Target { float4 tapA = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapB = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapC = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 tapD = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 average = (tapA+tapB+tapC+tapD)/4; average.y = max(max(tapA.y,tapB.y), max(tapC.y,tapD.y)); return average; } #line 243 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif /* UNITY: Original start of shader */ #pragma vertex vert #pragma fragment fragAdaptive 3Assets/Standard Assets/Effects/ImageEffects/Shaders˙˙˙˙ő=(´žçˇ‘Šd{´ěy SHADOWS_SOFTDIRLIGHTMAP_COMBINEDDIRLIGHTMAP_SEPARATEDYNAMICLIGHTMAP_ON INSTANCING_ON8 #line 253 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif #include "HLSLSupport.cginc" #include "UnityShaderVariables.cginc" #line 8 #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; }; sampler2D _MainTex; sampler2D _SmallTex; sampler2D _Curve; float4 _HdrParams; float2 intensity; float4 _MainTex_TexelSize; half4 _MainTex_ST; float _AdaptionSpeed; float _ExposureAdjustment; float _RangeScale; v2f vert( appdata_img v ) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.texcoord.xy; return o; } float4 fragLog(v2f i) : SV_Target { const float EPSILON = 1e-4h; float fLogLumSum = 0.0f; fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1,-1), _MainTex_ST)).rgb))); float avg = fLogLumSum / 4.0; return float4(avg, avg, avg, avg); } float4 fragExp(v2f i) : SV_Target { float2 lum = float2(0.0f, 0.0f); lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,1), _MainTex_ST)).xy; lum = exp(lum / 4.0f); return float4(lum.x, lum.y, lum.x, saturate(0.0125 * _AdaptionSpeed)); } float3 ToCIE(float3 FullScreenImage) { // RGB -> XYZ conversion // http://www.w3.org/Graphics/Color/sRGB // The official sRGB to XYZ conversion matrix is (following ITU-R BT.709) // 0.4125 0.3576 0.1805 // 0.2126 0.7152 0.0722 // 0.0193 0.1192 0.9505 float3x3 RGB2XYZ = {0.5141364, 0.3238786, 0.16036376, 0.265068, 0.67023428, 0.06409157, 0.0241188, 0.1228178, 0.84442666}; float3 XYZ = mul(RGB2XYZ, FullScreenImage.rgb); // XYZ -> Yxy conversion float3 Yxy; Yxy.r = XYZ.g; // x = X / (X + Y + Z) // y = X / (X + Y + Z) float temp = dot(float3(1.0,1.0,1.0), XYZ.rgb); Yxy.gb = XYZ.rg / temp; return Yxy; } float3 FromCIE(float3 Yxy) { float3 XYZ; // Yxy -> XYZ conversion XYZ.r = Yxy.r * Yxy.g / Yxy. b; // X = Y * x / y XYZ.g = Yxy.r; // copy luminance Y XYZ.b = Yxy.r * (1 - Yxy.g - Yxy.b) / Yxy.b; // Z = Y * (1-x-y) / y // XYZ -> RGB conversion // The official XYZ to sRGB conversion matrix is (following ITU-R BT.709) // 3.2410 -1.5374 -0.4986 // -0.9692 1.8760 0.0416 // 0.0556 -0.2040 1.0570 float3x3 XYZ2RGB = { 2.5651,-1.1665,-0.3986, -1.0217, 1.9777, 0.0439, 0.0753, -0.2543, 1.1892}; return mul(XYZ2RGB, XYZ); } // NOTE/OPTIMIZATION: we're not going the extra CIE detour anymore, but // scale with the OUT/IN luminance ratio,this is sooooo much faster float4 fragAdaptive(v2f i) : SV_Target { float avgLum = tex2D(_SmallTex, i.uv).x; float4 color = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (_HdrParams.w)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragAdaptiveAutoWhite(v2f i) : SV_Target { float2 avgLum = tex2D(_SmallTex, i.uv).xy; float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (avgLum.y*avgLum.y)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragCurve(v2f i) : SV_Target { float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float3 cie = ToCIE(color.rgb); // Remap to new lum range float newLum = tex2D(_Curve, float2(cie.r * _RangeScale, 0.5)).r; cie.r = newLum; color.rgb = FromCIE(cie); return color; } float4 fragHable(v2f i) : SV_Target { const float A = 0.15; const float B = 0.50; const float C = 0.10; const float D = 0.20; const float E = 0.02; const float F = 0.30; const float W = 11.2; float3 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)).rgb; texColor *= _ExposureAdjustment; float ExposureBias = 2.0; float3 x = ExposureBias*texColor; float3 curr = ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F; x = W; float3 whiteScale = 1.0f/(((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F); float3 color = curr*whiteScale; // float3 retColor = pow(color,1/2.2); // we have SRGB write enabled at this stage return float4(color, 1.0); } // we are doing it on luminance here (better color preservation, but some other problems like very fast saturation) float4 fragSimpleReinhard(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float lum = Luminance(texColor.rgb); float lumTm = lum * _ExposureAdjustment; float scale = lumTm / (1+lumTm); return float4(texColor.rgb * scale / lum, texColor.a); } float4 fragOptimizedHejiDawson(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); texColor *= _ExposureAdjustment; float4 X = max(float4(0.0,0.0,0.0,0.0), texColor-0.004); float4 retColor = (X*(6.2*X+.5))/(X*(6.2*X+1.7)+0.06); return retColor*retColor; } float4 fragPhotographic(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); return 1-exp2(-_ExposureAdjustment * texColor); } float4 fragDownsample(v2f i) : SV_Target { float4 tapA = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapB = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapC = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 tapD = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 average = (tapA+tapB+tapC+tapD)/4; average.y = max(max(tapA.y,tapB.y), max(tapC.y,tapD.y)); return average; } #line 253 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif /* UNITY: Original start of shader */ #pragma vertex vert #pragma fragment fragLog 3Assets/Standard Assets/Effects/ImageEffects/Shaders˙˙˙˙˙=(´žçˇ‘Šd{´ěy SHADOWS_SOFTDIRLIGHTMAP_COMBINEDDIRLIGHTMAP_SEPARATEDYNAMICLIGHTMAP_ON INSTANCING_ONze #line 263 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif #include "HLSLSupport.cginc" #include "UnityShaderVariables.cginc" #line 8 #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; }; sampler2D _MainTex; sampler2D _SmallTex; sampler2D _Curve; float4 _HdrParams; float2 intensity; float4 _MainTex_TexelSize; half4 _MainTex_ST; float _AdaptionSpeed; float _ExposureAdjustment; float _RangeScale; v2f vert( appdata_img v ) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.texcoord.xy; return o; } float4 fragLog(v2f i) : SV_Target { const float EPSILON = 1e-4h; float fLogLumSum = 0.0f; fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1,-1), _MainTex_ST)).rgb))); float avg = fLogLumSum / 4.0; return float4(avg, avg, avg, avg); } float4 fragExp(v2f i) : SV_Target { float2 lum = float2(0.0f, 0.0f); lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,1), _MainTex_ST)).xy; lum = exp(lum / 4.0f); return float4(lum.x, lum.y, lum.x, saturate(0.0125 * _AdaptionSpeed)); } float3 ToCIE(float3 FullScreenImage) { // RGB -> XYZ conversion // http://www.w3.org/Graphics/Color/sRGB // The official sRGB to XYZ conversion matrix is (following ITU-R BT.709) // 0.4125 0.3576 0.1805 // 0.2126 0.7152 0.0722 // 0.0193 0.1192 0.9505 float3x3 RGB2XYZ = {0.5141364, 0.3238786, 0.16036376, 0.265068, 0.67023428, 0.06409157, 0.0241188, 0.1228178, 0.84442666}; float3 XYZ = mul(RGB2XYZ, FullScreenImage.rgb); // XYZ -> Yxy conversion float3 Yxy; Yxy.r = XYZ.g; // x = X / (X + Y + Z) // y = X / (X + Y + Z) float temp = dot(float3(1.0,1.0,1.0), XYZ.rgb); Yxy.gb = XYZ.rg / temp; return Yxy; } float3 FromCIE(float3 Yxy) { float3 XYZ; // Yxy -> XYZ conversion XYZ.r = Yxy.r * Yxy.g / Yxy. b; // X = Y * x / y XYZ.g = Yxy.r; // copy luminance Y XYZ.b = Yxy.r * (1 - Yxy.g - Yxy.b) / Yxy.b; // Z = Y * (1-x-y) / y // XYZ -> RGB conversion // The official XYZ to sRGB conversion matrix is (following ITU-R BT.709) // 3.2410 -1.5374 -0.4986 // -0.9692 1.8760 0.0416 // 0.0556 -0.2040 1.0570 float3x3 XYZ2RGB = { 2.5651,-1.1665,-0.3986, -1.0217, 1.9777, 0.0439, 0.0753, -0.2543, 1.1892}; return mul(XYZ2RGB, XYZ); } // NOTE/OPTIMIZATION: we're not going the extra CIE detour anymore, but // scale with the OUT/IN luminance ratio,this is sooooo much faster float4 fragAdaptive(v2f i) : SV_Target { float avgLum = tex2D(_SmallTex, i.uv).x; float4 color = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (_HdrParams.w)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragAdaptiveAutoWhite(v2f i) : SV_Target { float2 avgLum = tex2D(_SmallTex, i.uv).xy; float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (avgLum.y*avgLum.y)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragCurve(v2f i) : SV_Target { float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float3 cie = ToCIE(color.rgb); // Remap to new lum range float newLum = tex2D(_Curve, float2(cie.r * _RangeScale, 0.5)).r; cie.r = newLum; color.rgb = FromCIE(cie); return color; } float4 fragHable(v2f i) : SV_Target { const float A = 0.15; const float B = 0.50; const float C = 0.10; const float D = 0.20; const float E = 0.02; const float F = 0.30; const float W = 11.2; float3 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)).rgb; texColor *= _ExposureAdjustment; float ExposureBias = 2.0; float3 x = ExposureBias*texColor; float3 curr = ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F; x = W; float3 whiteScale = 1.0f/(((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F); float3 color = curr*whiteScale; // float3 retColor = pow(color,1/2.2); // we have SRGB write enabled at this stage return float4(color, 1.0); } // we are doing it on luminance here (better color preservation, but some other problems like very fast saturation) float4 fragSimpleReinhard(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float lum = Luminance(texColor.rgb); float lumTm = lum * _ExposureAdjustment; float scale = lumTm / (1+lumTm); return float4(texColor.rgb * scale / lum, texColor.a); } float4 fragOptimizedHejiDawson(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); texColor *= _ExposureAdjustment; float4 X = max(float4(0.0,0.0,0.0,0.0), texColor-0.004); float4 retColor = (X*(6.2*X+.5))/(X*(6.2*X+1.7)+0.06); return retColor*retColor; } float4 fragPhotographic(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); return 1-exp2(-_ExposureAdjustment * texColor); } float4 fragDownsample(v2f i) : SV_Target { float4 tapA = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapB = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapC = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 tapD = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 average = (tapA+tapB+tapC+tapD)/4; average.y = max(max(tapA.y,tapB.y), max(tapC.y,tapD.y)); return average; } #line 263 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif /* UNITY: Original start of shader */ #pragma vertex vert #pragma fragment fragExp 3Assets/Standard Assets/Effects/ImageEffects/Shaders˙˙˙˙ =(´žçˇ‘Šd{´ěy SHADOWS_SOFTDIRLIGHTMAP_COMBINEDDIRLIGHTMAP_SEPARATEDYNAMICLIGHTMAP_ON INSTANCING_ONŤ8 #line 274 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif #include "HLSLSupport.cginc" #include "UnityShaderVariables.cginc" #line 8 #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; }; sampler2D _MainTex; sampler2D _SmallTex; sampler2D _Curve; float4 _HdrParams; float2 intensity; float4 _MainTex_TexelSize; half4 _MainTex_ST; float _AdaptionSpeed; float _ExposureAdjustment; float _RangeScale; v2f vert( appdata_img v ) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.texcoord.xy; return o; } float4 fragLog(v2f i) : SV_Target { const float EPSILON = 1e-4h; float fLogLumSum = 0.0f; fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1,-1), _MainTex_ST)).rgb))); float avg = fLogLumSum / 4.0; return float4(avg, avg, avg, avg); } float4 fragExp(v2f i) : SV_Target { float2 lum = float2(0.0f, 0.0f); lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,1), _MainTex_ST)).xy; lum = exp(lum / 4.0f); return float4(lum.x, lum.y, lum.x, saturate(0.0125 * _AdaptionSpeed)); } float3 ToCIE(float3 FullScreenImage) { // RGB -> XYZ conversion // http://www.w3.org/Graphics/Color/sRGB // The official sRGB to XYZ conversion matrix is (following ITU-R BT.709) // 0.4125 0.3576 0.1805 // 0.2126 0.7152 0.0722 // 0.0193 0.1192 0.9505 float3x3 RGB2XYZ = {0.5141364, 0.3238786, 0.16036376, 0.265068, 0.67023428, 0.06409157, 0.0241188, 0.1228178, 0.84442666}; float3 XYZ = mul(RGB2XYZ, FullScreenImage.rgb); // XYZ -> Yxy conversion float3 Yxy; Yxy.r = XYZ.g; // x = X / (X + Y + Z) // y = X / (X + Y + Z) float temp = dot(float3(1.0,1.0,1.0), XYZ.rgb); Yxy.gb = XYZ.rg / temp; return Yxy; } float3 FromCIE(float3 Yxy) { float3 XYZ; // Yxy -> XYZ conversion XYZ.r = Yxy.r * Yxy.g / Yxy. b; // X = Y * x / y XYZ.g = Yxy.r; // copy luminance Y XYZ.b = Yxy.r * (1 - Yxy.g - Yxy.b) / Yxy.b; // Z = Y * (1-x-y) / y // XYZ -> RGB conversion // The official XYZ to sRGB conversion matrix is (following ITU-R BT.709) // 3.2410 -1.5374 -0.4986 // -0.9692 1.8760 0.0416 // 0.0556 -0.2040 1.0570 float3x3 XYZ2RGB = { 2.5651,-1.1665,-0.3986, -1.0217, 1.9777, 0.0439, 0.0753, -0.2543, 1.1892}; return mul(XYZ2RGB, XYZ); } // NOTE/OPTIMIZATION: we're not going the extra CIE detour anymore, but // scale with the OUT/IN luminance ratio,this is sooooo much faster float4 fragAdaptive(v2f i) : SV_Target { float avgLum = tex2D(_SmallTex, i.uv).x; float4 color = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (_HdrParams.w)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragAdaptiveAutoWhite(v2f i) : SV_Target { float2 avgLum = tex2D(_SmallTex, i.uv).xy; float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (avgLum.y*avgLum.y)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragCurve(v2f i) : SV_Target { float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float3 cie = ToCIE(color.rgb); // Remap to new lum range float newLum = tex2D(_Curve, float2(cie.r * _RangeScale, 0.5)).r; cie.r = newLum; color.rgb = FromCIE(cie); return color; } float4 fragHable(v2f i) : SV_Target { const float A = 0.15; const float B = 0.50; const float C = 0.10; const float D = 0.20; const float E = 0.02; const float F = 0.30; const float W = 11.2; float3 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)).rgb; texColor *= _ExposureAdjustment; float ExposureBias = 2.0; float3 x = ExposureBias*texColor; float3 curr = ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F; x = W; float3 whiteScale = 1.0f/(((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F); float3 color = curr*whiteScale; // float3 retColor = pow(color,1/2.2); // we have SRGB write enabled at this stage return float4(color, 1.0); } // we are doing it on luminance here (better color preservation, but some other problems like very fast saturation) float4 fragSimpleReinhard(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float lum = Luminance(texColor.rgb); float lumTm = lum * _ExposureAdjustment; float scale = lumTm / (1+lumTm); return float4(texColor.rgb * scale / lum, texColor.a); } float4 fragOptimizedHejiDawson(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); texColor *= _ExposureAdjustment; float4 X = max(float4(0.0,0.0,0.0,0.0), texColor-0.004); float4 retColor = (X*(6.2*X+.5))/(X*(6.2*X+1.7)+0.06); return retColor*retColor; } float4 fragPhotographic(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); return 1-exp2(-_ExposureAdjustment * texColor); } float4 fragDownsample(v2f i) : SV_Target { float4 tapA = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapB = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapC = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 tapD = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 average = (tapA+tapB+tapC+tapD)/4; average.y = max(max(tapA.y,tapB.y), max(tapC.y,tapD.y)); return average; } #line 274 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif /* UNITY: Original start of shader */ #pragma vertex vert #pragma fragment fragExp 3Assets/Standard Assets/Effects/ImageEffects/Shaders˙˙˙˙=(´žçˇ‘Šd{´ěy SHADOWS_SOFTDIRLIGHTMAP_COMBINEDDIRLIGHTMAP_SEPARATEDYNAMICLIGHTMAP_ON INSTANCING_ONޞ #line 284 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif #include "HLSLSupport.cginc" #include "UnityShaderVariables.cginc" #line 8 #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; }; sampler2D _MainTex; sampler2D _SmallTex; sampler2D _Curve; float4 _HdrParams; float2 intensity; float4 _MainTex_TexelSize; half4 _MainTex_ST; float _AdaptionSpeed; float _ExposureAdjustment; float _RangeScale; v2f vert( appdata_img v ) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.texcoord.xy; return o; } float4 fragLog(v2f i) : SV_Target { const float EPSILON = 1e-4h; float fLogLumSum = 0.0f; fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1,-1), _MainTex_ST)).rgb))); float avg = fLogLumSum / 4.0; return float4(avg, avg, avg, avg); } float4 fragExp(v2f i) : SV_Target { float2 lum = float2(0.0f, 0.0f); lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,1), _MainTex_ST)).xy; lum = exp(lum / 4.0f); return float4(lum.x, lum.y, lum.x, saturate(0.0125 * _AdaptionSpeed)); } float3 ToCIE(float3 FullScreenImage) { // RGB -> XYZ conversion // http://www.w3.org/Graphics/Color/sRGB // The official sRGB to XYZ conversion matrix is (following ITU-R BT.709) // 0.4125 0.3576 0.1805 // 0.2126 0.7152 0.0722 // 0.0193 0.1192 0.9505 float3x3 RGB2XYZ = {0.5141364, 0.3238786, 0.16036376, 0.265068, 0.67023428, 0.06409157, 0.0241188, 0.1228178, 0.84442666}; float3 XYZ = mul(RGB2XYZ, FullScreenImage.rgb); // XYZ -> Yxy conversion float3 Yxy; Yxy.r = XYZ.g; // x = X / (X + Y + Z) // y = X / (X + Y + Z) float temp = dot(float3(1.0,1.0,1.0), XYZ.rgb); Yxy.gb = XYZ.rg / temp; return Yxy; } float3 FromCIE(float3 Yxy) { float3 XYZ; // Yxy -> XYZ conversion XYZ.r = Yxy.r * Yxy.g / Yxy. b; // X = Y * x / y XYZ.g = Yxy.r; // copy luminance Y XYZ.b = Yxy.r * (1 - Yxy.g - Yxy.b) / Yxy.b; // Z = Y * (1-x-y) / y // XYZ -> RGB conversion // The official XYZ to sRGB conversion matrix is (following ITU-R BT.709) // 3.2410 -1.5374 -0.4986 // -0.9692 1.8760 0.0416 // 0.0556 -0.2040 1.0570 float3x3 XYZ2RGB = { 2.5651,-1.1665,-0.3986, -1.0217, 1.9777, 0.0439, 0.0753, -0.2543, 1.1892}; return mul(XYZ2RGB, XYZ); } // NOTE/OPTIMIZATION: we're not going the extra CIE detour anymore, but // scale with the OUT/IN luminance ratio,this is sooooo much faster float4 fragAdaptive(v2f i) : SV_Target { float avgLum = tex2D(_SmallTex, i.uv).x; float4 color = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (_HdrParams.w)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragAdaptiveAutoWhite(v2f i) : SV_Target { float2 avgLum = tex2D(_SmallTex, i.uv).xy; float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (avgLum.y*avgLum.y)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragCurve(v2f i) : SV_Target { float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float3 cie = ToCIE(color.rgb); // Remap to new lum range float newLum = tex2D(_Curve, float2(cie.r * _RangeScale, 0.5)).r; cie.r = newLum; color.rgb = FromCIE(cie); return color; } float4 fragHable(v2f i) : SV_Target { const float A = 0.15; const float B = 0.50; const float C = 0.10; const float D = 0.20; const float E = 0.02; const float F = 0.30; const float W = 11.2; float3 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)).rgb; texColor *= _ExposureAdjustment; float ExposureBias = 2.0; float3 x = ExposureBias*texColor; float3 curr = ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F; x = W; float3 whiteScale = 1.0f/(((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F); float3 color = curr*whiteScale; // float3 retColor = pow(color,1/2.2); // we have SRGB write enabled at this stage return float4(color, 1.0); } // we are doing it on luminance here (better color preservation, but some other problems like very fast saturation) float4 fragSimpleReinhard(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float lum = Luminance(texColor.rgb); float lumTm = lum * _ExposureAdjustment; float scale = lumTm / (1+lumTm); return float4(texColor.rgb * scale / lum, texColor.a); } float4 fragOptimizedHejiDawson(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); texColor *= _ExposureAdjustment; float4 X = max(float4(0.0,0.0,0.0,0.0), texColor-0.004); float4 retColor = (X*(6.2*X+.5))/(X*(6.2*X+1.7)+0.06); return retColor*retColor; } float4 fragPhotographic(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); return 1-exp2(-_ExposureAdjustment * texColor); } float4 fragDownsample(v2f i) : SV_Target { float4 tapA = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapB = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapC = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 tapD = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 average = (tapA+tapB+tapC+tapD)/4; average.y = max(max(tapA.y,tapB.y), max(tapC.y,tapD.y)); return average; } #line 284 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif /* UNITY: Original start of shader */ #pragma vertex vert #pragma fragment fragCurve 3Assets/Standard Assets/Effects/ImageEffects/Shaders˙˙˙˙=(´žçˇ‘Šd{´ěy SHADOWS_SOFTDIRLIGHTMAP_COMBINEDDIRLIGHTMAP_SEPARATEDYNAMICLIGHTMAP_ON INSTANCING_ONSz #line 294 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif #include "HLSLSupport.cginc" #include "UnityShaderVariables.cginc" #line 8 #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; }; sampler2D _MainTex; sampler2D _SmallTex; sampler2D _Curve; float4 _HdrParams; float2 intensity; float4 _MainTex_TexelSize; half4 _MainTex_ST; float _AdaptionSpeed; float _ExposureAdjustment; float _RangeScale; v2f vert( appdata_img v ) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.texcoord.xy; return o; } float4 fragLog(v2f i) : SV_Target { const float EPSILON = 1e-4h; float fLogLumSum = 0.0f; fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1,-1), _MainTex_ST)).rgb))); float avg = fLogLumSum / 4.0; return float4(avg, avg, avg, avg); } float4 fragExp(v2f i) : SV_Target { float2 lum = float2(0.0f, 0.0f); lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,1), _MainTex_ST)).xy; lum = exp(lum / 4.0f); return float4(lum.x, lum.y, lum.x, saturate(0.0125 * _AdaptionSpeed)); } float3 ToCIE(float3 FullScreenImage) { // RGB -> XYZ conversion // http://www.w3.org/Graphics/Color/sRGB // The official sRGB to XYZ conversion matrix is (following ITU-R BT.709) // 0.4125 0.3576 0.1805 // 0.2126 0.7152 0.0722 // 0.0193 0.1192 0.9505 float3x3 RGB2XYZ = {0.5141364, 0.3238786, 0.16036376, 0.265068, 0.67023428, 0.06409157, 0.0241188, 0.1228178, 0.84442666}; float3 XYZ = mul(RGB2XYZ, FullScreenImage.rgb); // XYZ -> Yxy conversion float3 Yxy; Yxy.r = XYZ.g; // x = X / (X + Y + Z) // y = X / (X + Y + Z) float temp = dot(float3(1.0,1.0,1.0), XYZ.rgb); Yxy.gb = XYZ.rg / temp; return Yxy; } float3 FromCIE(float3 Yxy) { float3 XYZ; // Yxy -> XYZ conversion XYZ.r = Yxy.r * Yxy.g / Yxy. b; // X = Y * x / y XYZ.g = Yxy.r; // copy luminance Y XYZ.b = Yxy.r * (1 - Yxy.g - Yxy.b) / Yxy.b; // Z = Y * (1-x-y) / y // XYZ -> RGB conversion // The official XYZ to sRGB conversion matrix is (following ITU-R BT.709) // 3.2410 -1.5374 -0.4986 // -0.9692 1.8760 0.0416 // 0.0556 -0.2040 1.0570 float3x3 XYZ2RGB = { 2.5651,-1.1665,-0.3986, -1.0217, 1.9777, 0.0439, 0.0753, -0.2543, 1.1892}; return mul(XYZ2RGB, XYZ); } // NOTE/OPTIMIZATION: we're not going the extra CIE detour anymore, but // scale with the OUT/IN luminance ratio,this is sooooo much faster float4 fragAdaptive(v2f i) : SV_Target { float avgLum = tex2D(_SmallTex, i.uv).x; float4 color = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (_HdrParams.w)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragAdaptiveAutoWhite(v2f i) : SV_Target { float2 avgLum = tex2D(_SmallTex, i.uv).xy; float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (avgLum.y*avgLum.y)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragCurve(v2f i) : SV_Target { float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float3 cie = ToCIE(color.rgb); // Remap to new lum range float newLum = tex2D(_Curve, float2(cie.r * _RangeScale, 0.5)).r; cie.r = newLum; color.rgb = FromCIE(cie); return color; } float4 fragHable(v2f i) : SV_Target { const float A = 0.15; const float B = 0.50; const float C = 0.10; const float D = 0.20; const float E = 0.02; const float F = 0.30; const float W = 11.2; float3 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)).rgb; texColor *= _ExposureAdjustment; float ExposureBias = 2.0; float3 x = ExposureBias*texColor; float3 curr = ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F; x = W; float3 whiteScale = 1.0f/(((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F); float3 color = curr*whiteScale; // float3 retColor = pow(color,1/2.2); // we have SRGB write enabled at this stage return float4(color, 1.0); } // we are doing it on luminance here (better color preservation, but some other problems like very fast saturation) float4 fragSimpleReinhard(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float lum = Luminance(texColor.rgb); float lumTm = lum * _ExposureAdjustment; float scale = lumTm / (1+lumTm); return float4(texColor.rgb * scale / lum, texColor.a); } float4 fragOptimizedHejiDawson(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); texColor *= _ExposureAdjustment; float4 X = max(float4(0.0,0.0,0.0,0.0), texColor-0.004); float4 retColor = (X*(6.2*X+.5))/(X*(6.2*X+1.7)+0.06); return retColor*retColor; } float4 fragPhotographic(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); return 1-exp2(-_ExposureAdjustment * texColor); } float4 fragDownsample(v2f i) : SV_Target { float4 tapA = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapB = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapC = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 tapD = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 average = (tapA+tapB+tapC+tapD)/4; average.y = max(max(tapA.y,tapB.y), max(tapC.y,tapD.y)); return average; } #line 294 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif /* UNITY: Original start of shader */ #pragma vertex vert #pragma fragment fragHable 3Assets/Standard Assets/Effects/ImageEffects/Shaders˙˙˙˙(=(´žçˇ‘Šd{´ěy SHADOWS_SOFTDIRLIGHTMAP_COMBINEDDIRLIGHTMAP_SEPARATEDYNAMICLIGHTMAP_ON INSTANCING_ONŚ‚#line 304 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif #include "HLSLSupport.cginc" #include "UnityShaderVariables.cginc" #line 8 #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; }; sampler2D _MainTex; sampler2D _SmallTex; sampler2D _Curve; float4 _HdrParams; float2 intensity; float4 _MainTex_TexelSize; half4 _MainTex_ST; float _AdaptionSpeed; float _ExposureAdjustment; float _RangeScale; v2f vert( appdata_img v ) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.texcoord.xy; return o; } float4 fragLog(v2f i) : SV_Target { const float EPSILON = 1e-4h; float fLogLumSum = 0.0f; fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1,-1), _MainTex_ST)).rgb))); float avg = fLogLumSum / 4.0; return float4(avg, avg, avg, avg); } float4 fragExp(v2f i) : SV_Target { float2 lum = float2(0.0f, 0.0f); lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,1), _MainTex_ST)).xy; lum = exp(lum / 4.0f); return float4(lum.x, lum.y, lum.x, saturate(0.0125 * _AdaptionSpeed)); } float3 ToCIE(float3 FullScreenImage) { // RGB -> XYZ conversion // http://www.w3.org/Graphics/Color/sRGB // The official sRGB to XYZ conversion matrix is (following ITU-R BT.709) // 0.4125 0.3576 0.1805 // 0.2126 0.7152 0.0722 // 0.0193 0.1192 0.9505 float3x3 RGB2XYZ = {0.5141364, 0.3238786, 0.16036376, 0.265068, 0.67023428, 0.06409157, 0.0241188, 0.1228178, 0.84442666}; float3 XYZ = mul(RGB2XYZ, FullScreenImage.rgb); // XYZ -> Yxy conversion float3 Yxy; Yxy.r = XYZ.g; // x = X / (X + Y + Z) // y = X / (X + Y + Z) float temp = dot(float3(1.0,1.0,1.0), XYZ.rgb); Yxy.gb = XYZ.rg / temp; return Yxy; } float3 FromCIE(float3 Yxy) { float3 XYZ; // Yxy -> XYZ conversion XYZ.r = Yxy.r * Yxy.g / Yxy. b; // X = Y * x / y XYZ.g = Yxy.r; // copy luminance Y XYZ.b = Yxy.r * (1 - Yxy.g - Yxy.b) / Yxy.b; // Z = Y * (1-x-y) / y // XYZ -> RGB conversion // The official XYZ to sRGB conversion matrix is (following ITU-R BT.709) // 3.2410 -1.5374 -0.4986 // -0.9692 1.8760 0.0416 // 0.0556 -0.2040 1.0570 float3x3 XYZ2RGB = { 2.5651,-1.1665,-0.3986, -1.0217, 1.9777, 0.0439, 0.0753, -0.2543, 1.1892}; return mul(XYZ2RGB, XYZ); } // NOTE/OPTIMIZATION: we're not going the extra CIE detour anymore, but // scale with the OUT/IN luminance ratio,this is sooooo much faster float4 fragAdaptive(v2f i) : SV_Target { float avgLum = tex2D(_SmallTex, i.uv).x; float4 color = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (_HdrParams.w)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragAdaptiveAutoWhite(v2f i) : SV_Target { float2 avgLum = tex2D(_SmallTex, i.uv).xy; float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (avgLum.y*avgLum.y)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragCurve(v2f i) : SV_Target { float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float3 cie = ToCIE(color.rgb); // Remap to new lum range float newLum = tex2D(_Curve, float2(cie.r * _RangeScale, 0.5)).r; cie.r = newLum; color.rgb = FromCIE(cie); return color; } float4 fragHable(v2f i) : SV_Target { const float A = 0.15; const float B = 0.50; const float C = 0.10; const float D = 0.20; const float E = 0.02; const float F = 0.30; const float W = 11.2; float3 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)).rgb; texColor *= _ExposureAdjustment; float ExposureBias = 2.0; float3 x = ExposureBias*texColor; float3 curr = ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F; x = W; float3 whiteScale = 1.0f/(((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F); float3 color = curr*whiteScale; // float3 retColor = pow(color,1/2.2); // we have SRGB write enabled at this stage return float4(color, 1.0); } // we are doing it on luminance here (better color preservation, but some other problems like very fast saturation) float4 fragSimpleReinhard(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float lum = Luminance(texColor.rgb); float lumTm = lum * _ExposureAdjustment; float scale = lumTm / (1+lumTm); return float4(texColor.rgb * scale / lum, texColor.a); } float4 fragOptimizedHejiDawson(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); texColor *= _ExposureAdjustment; float4 X = max(float4(0.0,0.0,0.0,0.0), texColor-0.004); float4 retColor = (X*(6.2*X+.5))/(X*(6.2*X+1.7)+0.06); return retColor*retColor; } float4 fragPhotographic(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); return 1-exp2(-_ExposureAdjustment * texColor); } float4 fragDownsample(v2f i) : SV_Target { float4 tapA = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapB = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapC = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 tapD = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 average = (tapA+tapB+tapC+tapD)/4; average.y = max(max(tapA.y,tapB.y), max(tapC.y,tapD.y)); return average; } #line 304 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif /* UNITY: Original start of shader */ #pragma vertex vert #pragma fragment fragSimpleReinhard 3Assets/Standard Assets/Effects/ImageEffects/Shaders˙˙˙˙2=(´žçˇ‘Šd{´ěy SHADOWS_SOFTDIRLIGHTMAP_COMBINEDDIRLIGHTMAP_SEPARATEDYNAMICLIGHTMAP_ON INSTANCING_ON@‘#line 314 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif #include "HLSLSupport.cginc" #include "UnityShaderVariables.cginc" #line 8 #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; }; sampler2D _MainTex; sampler2D _SmallTex; sampler2D _Curve; float4 _HdrParams; float2 intensity; float4 _MainTex_TexelSize; half4 _MainTex_ST; float _AdaptionSpeed; float _ExposureAdjustment; float _RangeScale; v2f vert( appdata_img v ) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.texcoord.xy; return o; } float4 fragLog(v2f i) : SV_Target { const float EPSILON = 1e-4h; float fLogLumSum = 0.0f; fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1,-1), _MainTex_ST)).rgb))); float avg = fLogLumSum / 4.0; return float4(avg, avg, avg, avg); } float4 fragExp(v2f i) : SV_Target { float2 lum = float2(0.0f, 0.0f); lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,1), _MainTex_ST)).xy; lum = exp(lum / 4.0f); return float4(lum.x, lum.y, lum.x, saturate(0.0125 * _AdaptionSpeed)); } float3 ToCIE(float3 FullScreenImage) { // RGB -> XYZ conversion // http://www.w3.org/Graphics/Color/sRGB // The official sRGB to XYZ conversion matrix is (following ITU-R BT.709) // 0.4125 0.3576 0.1805 // 0.2126 0.7152 0.0722 // 0.0193 0.1192 0.9505 float3x3 RGB2XYZ = {0.5141364, 0.3238786, 0.16036376, 0.265068, 0.67023428, 0.06409157, 0.0241188, 0.1228178, 0.84442666}; float3 XYZ = mul(RGB2XYZ, FullScreenImage.rgb); // XYZ -> Yxy conversion float3 Yxy; Yxy.r = XYZ.g; // x = X / (X + Y + Z) // y = X / (X + Y + Z) float temp = dot(float3(1.0,1.0,1.0), XYZ.rgb); Yxy.gb = XYZ.rg / temp; return Yxy; } float3 FromCIE(float3 Yxy) { float3 XYZ; // Yxy -> XYZ conversion XYZ.r = Yxy.r * Yxy.g / Yxy. b; // X = Y * x / y XYZ.g = Yxy.r; // copy luminance Y XYZ.b = Yxy.r * (1 - Yxy.g - Yxy.b) / Yxy.b; // Z = Y * (1-x-y) / y // XYZ -> RGB conversion // The official XYZ to sRGB conversion matrix is (following ITU-R BT.709) // 3.2410 -1.5374 -0.4986 // -0.9692 1.8760 0.0416 // 0.0556 -0.2040 1.0570 float3x3 XYZ2RGB = { 2.5651,-1.1665,-0.3986, -1.0217, 1.9777, 0.0439, 0.0753, -0.2543, 1.1892}; return mul(XYZ2RGB, XYZ); } // NOTE/OPTIMIZATION: we're not going the extra CIE detour anymore, but // scale with the OUT/IN luminance ratio,this is sooooo much faster float4 fragAdaptive(v2f i) : SV_Target { float avgLum = tex2D(_SmallTex, i.uv).x; float4 color = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (_HdrParams.w)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragAdaptiveAutoWhite(v2f i) : SV_Target { float2 avgLum = tex2D(_SmallTex, i.uv).xy; float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (avgLum.y*avgLum.y)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragCurve(v2f i) : SV_Target { float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float3 cie = ToCIE(color.rgb); // Remap to new lum range float newLum = tex2D(_Curve, float2(cie.r * _RangeScale, 0.5)).r; cie.r = newLum; color.rgb = FromCIE(cie); return color; } float4 fragHable(v2f i) : SV_Target { const float A = 0.15; const float B = 0.50; const float C = 0.10; const float D = 0.20; const float E = 0.02; const float F = 0.30; const float W = 11.2; float3 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)).rgb; texColor *= _ExposureAdjustment; float ExposureBias = 2.0; float3 x = ExposureBias*texColor; float3 curr = ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F; x = W; float3 whiteScale = 1.0f/(((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F); float3 color = curr*whiteScale; // float3 retColor = pow(color,1/2.2); // we have SRGB write enabled at this stage return float4(color, 1.0); } // we are doing it on luminance here (better color preservation, but some other problems like very fast saturation) float4 fragSimpleReinhard(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float lum = Luminance(texColor.rgb); float lumTm = lum * _ExposureAdjustment; float scale = lumTm / (1+lumTm); return float4(texColor.rgb * scale / lum, texColor.a); } float4 fragOptimizedHejiDawson(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); texColor *= _ExposureAdjustment; float4 X = max(float4(0.0,0.0,0.0,0.0), texColor-0.004); float4 retColor = (X*(6.2*X+.5))/(X*(6.2*X+1.7)+0.06); return retColor*retColor; } float4 fragPhotographic(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); return 1-exp2(-_ExposureAdjustment * texColor); } float4 fragDownsample(v2f i) : SV_Target { float4 tapA = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapB = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapC = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 tapD = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 average = (tapA+tapB+tapC+tapD)/4; average.y = max(max(tapA.y,tapB.y), max(tapC.y,tapD.y)); return average; } #line 314 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif /* UNITY: Original start of shader */ #pragma vertex vert #pragma fragment fragOptimizedHejiDawson 3Assets/Standard Assets/Effects/ImageEffects/Shaders˙˙˙˙<=(´žçˇ‘Šd{´ěy SHADOWS_SOFTDIRLIGHTMAP_COMBINEDDIRLIGHTMAP_SEPARATEDYNAMICLIGHTMAP_ON INSTANCING_ONěS#line 324 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif #include "HLSLSupport.cginc" #include "UnityShaderVariables.cginc" #line 8 #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; }; sampler2D _MainTex; sampler2D _SmallTex; sampler2D _Curve; float4 _HdrParams; float2 intensity; float4 _MainTex_TexelSize; half4 _MainTex_ST; float _AdaptionSpeed; float _ExposureAdjustment; float _RangeScale; v2f vert( appdata_img v ) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.texcoord.xy; return o; } float4 fragLog(v2f i) : SV_Target { const float EPSILON = 1e-4h; float fLogLumSum = 0.0f; fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1,-1), _MainTex_ST)).rgb))); float avg = fLogLumSum / 4.0; return float4(avg, avg, avg, avg); } float4 fragExp(v2f i) : SV_Target { float2 lum = float2(0.0f, 0.0f); lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,1), _MainTex_ST)).xy; lum = exp(lum / 4.0f); return float4(lum.x, lum.y, lum.x, saturate(0.0125 * _AdaptionSpeed)); } float3 ToCIE(float3 FullScreenImage) { // RGB -> XYZ conversion // http://www.w3.org/Graphics/Color/sRGB // The official sRGB to XYZ conversion matrix is (following ITU-R BT.709) // 0.4125 0.3576 0.1805 // 0.2126 0.7152 0.0722 // 0.0193 0.1192 0.9505 float3x3 RGB2XYZ = {0.5141364, 0.3238786, 0.16036376, 0.265068, 0.67023428, 0.06409157, 0.0241188, 0.1228178, 0.84442666}; float3 XYZ = mul(RGB2XYZ, FullScreenImage.rgb); // XYZ -> Yxy conversion float3 Yxy; Yxy.r = XYZ.g; // x = X / (X + Y + Z) // y = X / (X + Y + Z) float temp = dot(float3(1.0,1.0,1.0), XYZ.rgb); Yxy.gb = XYZ.rg / temp; return Yxy; } float3 FromCIE(float3 Yxy) { float3 XYZ; // Yxy -> XYZ conversion XYZ.r = Yxy.r * Yxy.g / Yxy. b; // X = Y * x / y XYZ.g = Yxy.r; // copy luminance Y XYZ.b = Yxy.r * (1 - Yxy.g - Yxy.b) / Yxy.b; // Z = Y * (1-x-y) / y // XYZ -> RGB conversion // The official XYZ to sRGB conversion matrix is (following ITU-R BT.709) // 3.2410 -1.5374 -0.4986 // -0.9692 1.8760 0.0416 // 0.0556 -0.2040 1.0570 float3x3 XYZ2RGB = { 2.5651,-1.1665,-0.3986, -1.0217, 1.9777, 0.0439, 0.0753, -0.2543, 1.1892}; return mul(XYZ2RGB, XYZ); } // NOTE/OPTIMIZATION: we're not going the extra CIE detour anymore, but // scale with the OUT/IN luminance ratio,this is sooooo much faster float4 fragAdaptive(v2f i) : SV_Target { float avgLum = tex2D(_SmallTex, i.uv).x; float4 color = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (_HdrParams.w)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragAdaptiveAutoWhite(v2f i) : SV_Target { float2 avgLum = tex2D(_SmallTex, i.uv).xy; float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (avgLum.y*avgLum.y)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragCurve(v2f i) : SV_Target { float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float3 cie = ToCIE(color.rgb); // Remap to new lum range float newLum = tex2D(_Curve, float2(cie.r * _RangeScale, 0.5)).r; cie.r = newLum; color.rgb = FromCIE(cie); return color; } float4 fragHable(v2f i) : SV_Target { const float A = 0.15; const float B = 0.50; const float C = 0.10; const float D = 0.20; const float E = 0.02; const float F = 0.30; const float W = 11.2; float3 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)).rgb; texColor *= _ExposureAdjustment; float ExposureBias = 2.0; float3 x = ExposureBias*texColor; float3 curr = ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F; x = W; float3 whiteScale = 1.0f/(((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F); float3 color = curr*whiteScale; // float3 retColor = pow(color,1/2.2); // we have SRGB write enabled at this stage return float4(color, 1.0); } // we are doing it on luminance here (better color preservation, but some other problems like very fast saturation) float4 fragSimpleReinhard(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float lum = Luminance(texColor.rgb); float lumTm = lum * _ExposureAdjustment; float scale = lumTm / (1+lumTm); return float4(texColor.rgb * scale / lum, texColor.a); } float4 fragOptimizedHejiDawson(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); texColor *= _ExposureAdjustment; float4 X = max(float4(0.0,0.0,0.0,0.0), texColor-0.004); float4 retColor = (X*(6.2*X+.5))/(X*(6.2*X+1.7)+0.06); return retColor*retColor; } float4 fragPhotographic(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); return 1-exp2(-_ExposureAdjustment * texColor); } float4 fragDownsample(v2f i) : SV_Target { float4 tapA = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapB = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapC = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 tapD = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 average = (tapA+tapB+tapC+tapD)/4; average.y = max(max(tapA.y,tapB.y), max(tapC.y,tapD.y)); return average; } #line 324 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif /* UNITY: Original start of shader */ #pragma vertex vert #pragma fragment fragPhotographic 3Assets/Standard Assets/Effects/ImageEffects/Shaders˙˙˙˙F=(´žçˇ‘Šd{´ěy SHADOWS_SOFTDIRLIGHTMAP_COMBINEDDIRLIGHTMAP_SEPARATEDYNAMICLIGHTMAP_ON INSTANCING_ONSw #line 334 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif #include "HLSLSupport.cginc" #include "UnityShaderVariables.cginc" #line 8 #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; }; sampler2D _MainTex; sampler2D _SmallTex; sampler2D _Curve; float4 _HdrParams; float2 intensity; float4 _MainTex_TexelSize; half4 _MainTex_ST; float _AdaptionSpeed; float _ExposureAdjustment; float _RangeScale; v2f vert( appdata_img v ) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.texcoord.xy; return o; } float4 fragLog(v2f i) : SV_Target { const float EPSILON = 1e-4h; float fLogLumSum = 0.0f; fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1,-1), _MainTex_ST)).rgb))); float avg = fLogLumSum / 4.0; return float4(avg, avg, avg, avg); } float4 fragExp(v2f i) : SV_Target { float2 lum = float2(0.0f, 0.0f); lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,1), _MainTex_ST)).xy; lum = exp(lum / 4.0f); return float4(lum.x, lum.y, lum.x, saturate(0.0125 * _AdaptionSpeed)); } float3 ToCIE(float3 FullScreenImage) { // RGB -> XYZ conversion // http://www.w3.org/Graphics/Color/sRGB // The official sRGB to XYZ conversion matrix is (following ITU-R BT.709) // 0.4125 0.3576 0.1805 // 0.2126 0.7152 0.0722 // 0.0193 0.1192 0.9505 float3x3 RGB2XYZ = {0.5141364, 0.3238786, 0.16036376, 0.265068, 0.67023428, 0.06409157, 0.0241188, 0.1228178, 0.84442666}; float3 XYZ = mul(RGB2XYZ, FullScreenImage.rgb); // XYZ -> Yxy conversion float3 Yxy; Yxy.r = XYZ.g; // x = X / (X + Y + Z) // y = X / (X + Y + Z) float temp = dot(float3(1.0,1.0,1.0), XYZ.rgb); Yxy.gb = XYZ.rg / temp; return Yxy; } float3 FromCIE(float3 Yxy) { float3 XYZ; // Yxy -> XYZ conversion XYZ.r = Yxy.r * Yxy.g / Yxy. b; // X = Y * x / y XYZ.g = Yxy.r; // copy luminance Y XYZ.b = Yxy.r * (1 - Yxy.g - Yxy.b) / Yxy.b; // Z = Y * (1-x-y) / y // XYZ -> RGB conversion // The official XYZ to sRGB conversion matrix is (following ITU-R BT.709) // 3.2410 -1.5374 -0.4986 // -0.9692 1.8760 0.0416 // 0.0556 -0.2040 1.0570 float3x3 XYZ2RGB = { 2.5651,-1.1665,-0.3986, -1.0217, 1.9777, 0.0439, 0.0753, -0.2543, 1.1892}; return mul(XYZ2RGB, XYZ); } // NOTE/OPTIMIZATION: we're not going the extra CIE detour anymore, but // scale with the OUT/IN luminance ratio,this is sooooo much faster float4 fragAdaptive(v2f i) : SV_Target { float avgLum = tex2D(_SmallTex, i.uv).x; float4 color = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (_HdrParams.w)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragAdaptiveAutoWhite(v2f i) : SV_Target { float2 avgLum = tex2D(_SmallTex, i.uv).xy; float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (avgLum.y*avgLum.y)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragCurve(v2f i) : SV_Target { float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float3 cie = ToCIE(color.rgb); // Remap to new lum range float newLum = tex2D(_Curve, float2(cie.r * _RangeScale, 0.5)).r; cie.r = newLum; color.rgb = FromCIE(cie); return color; } float4 fragHable(v2f i) : SV_Target { const float A = 0.15; const float B = 0.50; const float C = 0.10; const float D = 0.20; const float E = 0.02; const float F = 0.30; const float W = 11.2; float3 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)).rgb; texColor *= _ExposureAdjustment; float ExposureBias = 2.0; float3 x = ExposureBias*texColor; float3 curr = ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F; x = W; float3 whiteScale = 1.0f/(((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F); float3 color = curr*whiteScale; // float3 retColor = pow(color,1/2.2); // we have SRGB write enabled at this stage return float4(color, 1.0); } // we are doing it on luminance here (better color preservation, but some other problems like very fast saturation) float4 fragSimpleReinhard(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float lum = Luminance(texColor.rgb); float lumTm = lum * _ExposureAdjustment; float scale = lumTm / (1+lumTm); return float4(texColor.rgb * scale / lum, texColor.a); } float4 fragOptimizedHejiDawson(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); texColor *= _ExposureAdjustment; float4 X = max(float4(0.0,0.0,0.0,0.0), texColor-0.004); float4 retColor = (X*(6.2*X+.5))/(X*(6.2*X+1.7)+0.06); return retColor*retColor; } float4 fragPhotographic(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); return 1-exp2(-_ExposureAdjustment * texColor); } float4 fragDownsample(v2f i) : SV_Target { float4 tapA = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapB = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapC = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 tapD = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 average = (tapA+tapB+tapC+tapD)/4; average.y = max(max(tapA.y,tapB.y), max(tapC.y,tapD.y)); return average; } #line 334 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif /* UNITY: Original start of shader */ #pragma vertex vert #pragma fragment fragDownsample 3Assets/Standard Assets/Effects/ImageEffects/Shaders˙˙˙˙P=(´žçˇ‘Šd{´ěy SHADOWS_SOFTDIRLIGHTMAP_COMBINEDDIRLIGHTMAP_SEPARATEDYNAMICLIGHTMAP_ON INSTANCING_ON3Ą #line 344 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif #include "HLSLSupport.cginc" #include "UnityShaderVariables.cginc" #line 8 #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; }; sampler2D _MainTex; sampler2D _SmallTex; sampler2D _Curve; float4 _HdrParams; float2 intensity; float4 _MainTex_TexelSize; half4 _MainTex_ST; float _AdaptionSpeed; float _ExposureAdjustment; float _RangeScale; v2f vert( appdata_img v ) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.texcoord.xy; return o; } float4 fragLog(v2f i) : SV_Target { const float EPSILON = 1e-4h; float fLogLumSum = 0.0f; fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1, 1), _MainTex_ST)).rgb))); fLogLumSum += log( max( EPSILON, Luminance(tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2( 1,-1), _MainTex_ST)).rgb))); float avg = fLogLumSum / 4.0; return float4(avg, avg, avg, avg); } float4 fragExp(v2f i) : SV_Target { float2 lum = float2(0.0f, 0.0f); lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(1,-1), _MainTex_ST)).xy; lum += tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize.xy * float2(-1,1), _MainTex_ST)).xy; lum = exp(lum / 4.0f); return float4(lum.x, lum.y, lum.x, saturate(0.0125 * _AdaptionSpeed)); } float3 ToCIE(float3 FullScreenImage) { // RGB -> XYZ conversion // http://www.w3.org/Graphics/Color/sRGB // The official sRGB to XYZ conversion matrix is (following ITU-R BT.709) // 0.4125 0.3576 0.1805 // 0.2126 0.7152 0.0722 // 0.0193 0.1192 0.9505 float3x3 RGB2XYZ = {0.5141364, 0.3238786, 0.16036376, 0.265068, 0.67023428, 0.06409157, 0.0241188, 0.1228178, 0.84442666}; float3 XYZ = mul(RGB2XYZ, FullScreenImage.rgb); // XYZ -> Yxy conversion float3 Yxy; Yxy.r = XYZ.g; // x = X / (X + Y + Z) // y = X / (X + Y + Z) float temp = dot(float3(1.0,1.0,1.0), XYZ.rgb); Yxy.gb = XYZ.rg / temp; return Yxy; } float3 FromCIE(float3 Yxy) { float3 XYZ; // Yxy -> XYZ conversion XYZ.r = Yxy.r * Yxy.g / Yxy. b; // X = Y * x / y XYZ.g = Yxy.r; // copy luminance Y XYZ.b = Yxy.r * (1 - Yxy.g - Yxy.b) / Yxy.b; // Z = Y * (1-x-y) / y // XYZ -> RGB conversion // The official XYZ to sRGB conversion matrix is (following ITU-R BT.709) // 3.2410 -1.5374 -0.4986 // -0.9692 1.8760 0.0416 // 0.0556 -0.2040 1.0570 float3x3 XYZ2RGB = { 2.5651,-1.1665,-0.3986, -1.0217, 1.9777, 0.0439, 0.0753, -0.2543, 1.1892}; return mul(XYZ2RGB, XYZ); } // NOTE/OPTIMIZATION: we're not going the extra CIE detour anymore, but // scale with the OUT/IN luminance ratio,this is sooooo much faster float4 fragAdaptive(v2f i) : SV_Target { float avgLum = tex2D(_SmallTex, i.uv).x; float4 color = tex2D (_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (_HdrParams.w)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragAdaptiveAutoWhite(v2f i) : SV_Target { float2 avgLum = tex2D(_SmallTex, i.uv).xy; float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float cieLum = max(0.000001, Luminance(color.rgb)); //ToCIE(color.rgb); float lumScaled = cieLum * _HdrParams.z / (0.001 + avgLum.x); lumScaled = (lumScaled * (1.0f + lumScaled / (avgLum.y*avgLum.y)))/(1.0f + lumScaled); //cie.r = lumScaled; color.rgb = color.rgb * (lumScaled / cieLum); //color.rgb = FromCIE(cie); return color; } float4 fragCurve(v2f i) : SV_Target { float4 color = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float3 cie = ToCIE(color.rgb); // Remap to new lum range float newLum = tex2D(_Curve, float2(cie.r * _RangeScale, 0.5)).r; cie.r = newLum; color.rgb = FromCIE(cie); return color; } float4 fragHable(v2f i) : SV_Target { const float A = 0.15; const float B = 0.50; const float C = 0.10; const float D = 0.20; const float E = 0.02; const float F = 0.30; const float W = 11.2; float3 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)).rgb; texColor *= _ExposureAdjustment; float ExposureBias = 2.0; float3 x = ExposureBias*texColor; float3 curr = ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F; x = W; float3 whiteScale = 1.0f/(((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F); float3 color = curr*whiteScale; // float3 retColor = pow(color,1/2.2); // we have SRGB write enabled at this stage return float4(color, 1.0); } // we are doing it on luminance here (better color preservation, but some other problems like very fast saturation) float4 fragSimpleReinhard(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); float lum = Luminance(texColor.rgb); float lumTm = lum * _ExposureAdjustment; float scale = lumTm / (1+lumTm); return float4(texColor.rgb * scale / lum, texColor.a); } float4 fragOptimizedHejiDawson(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); texColor *= _ExposureAdjustment; float4 X = max(float4(0.0,0.0,0.0,0.0), texColor-0.004); float4 retColor = (X*(6.2*X+.5))/(X*(6.2*X+1.7)+0.06); return retColor*retColor; } float4 fragPhotographic(v2f i) : SV_Target { float4 texColor = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv, _MainTex_ST)); return 1-exp2(-_ExposureAdjustment * texColor); } float4 fragDownsample(v2f i) : SV_Target { float4 tapA = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapB = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * 0.5, _MainTex_ST)); float4 tapC = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv + _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 tapD = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(i.uv - _MainTex_TexelSize * float2(0.5,-0.5), _MainTex_ST)); float4 average = (tapA+tapB+tapC+tapD)/4; average.y = max(max(tapA.y,tapB.y), max(tapC.y,tapD.y)); return average; } #line 344 "" #ifdef DUMMY_PREPROCESSOR_TO_WORK_AROUND_HLSL_COMPILER_LINE_HANDLING #endif /* UNITY: Original start of shader */ #pragma vertex vert #pragma fragment fragAdaptiveAutoWhite 3Assets/Standard Assets/Effects/ImageEffects/Shaders˙˙˙˙Z=(´žçˇ‘Šd{´ěy SHADOWS_SOFTDIRLIGHTMAP_COMBINEDDIRLIGHTMAP_SEPARATEDYNAMICLIGHTMAP_ON INSTANCING_ON