123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204 |
- /**
- * @author alteredq / http://alteredqualia.com/
- * @author mrdoob / http://mrdoob.com/
- * @author mikael emtinger / http://gomo.se/
- */
- THREE.ShaderChunk = {
- // FOG
- fog_pars_fragment: [
- "#ifdef USE_FOG",
- "uniform vec3 fogColor;",
- "#ifdef FOG_EXP2",
- "uniform float fogDensity;",
- "#else",
- "uniform float fogNear;",
- "uniform float fogFar;",
- "#endif",
- "#endif"
- ].join("\n"),
- fog_fragment: [
- "#ifdef USE_FOG",
- "float depth = gl_FragCoord.z / gl_FragCoord.w;",
- "#ifdef FOG_EXP2",
- "const float LOG2 = 1.442695;",
- "float fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );",
- "fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );",
- "#else",
- "float fogFactor = smoothstep( fogNear, fogFar, depth );",
- "#endif",
- "gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );",
- "#endif"
- ].join("\n"),
- // ENVIRONMENT MAP
- envmap_pars_fragment: [
- "#ifdef USE_ENVMAP",
- "uniform float reflectivity;",
- "uniform samplerCube envMap;",
- "uniform float flipEnvMap;",
- "uniform int combine;",
- "#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )",
- "uniform bool useRefract;",
- "uniform float refractionRatio;",
- "#else",
- "varying vec3 vReflect;",
- "#endif",
- "#endif"
- ].join("\n"),
- envmap_fragment: [
- "#ifdef USE_ENVMAP",
- "vec3 reflectVec;",
- "#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )",
- "vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );",
- "if ( useRefract ) {",
- "reflectVec = refract( cameraToVertex, normal, refractionRatio );",
- "} else { ",
- "reflectVec = reflect( cameraToVertex, normal );",
- "}",
- "#else",
- "reflectVec = vReflect;",
- "#endif",
- "#ifdef DOUBLE_SIDED",
- "float flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );",
- "vec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );",
- "#else",
- "vec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );",
- "#endif",
- "#ifdef GAMMA_INPUT",
- "cubeColor.xyz *= cubeColor.xyz;",
- "#endif",
- "if ( combine == 1 ) {",
- "gl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularStrength * reflectivity );",
- "} else if ( combine == 2 ) {",
- "gl_FragColor.xyz += cubeColor.xyz * specularStrength * reflectivity;",
- "} else {",
- "gl_FragColor.xyz = mix( gl_FragColor.xyz, gl_FragColor.xyz * cubeColor.xyz, specularStrength * reflectivity );",
- "}",
- "#endif"
- ].join("\n"),
- envmap_pars_vertex: [
- "#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )",
- "varying vec3 vReflect;",
- "uniform float refractionRatio;",
- "uniform bool useRefract;",
- "#endif"
- ].join("\n"),
- worldpos_vertex : [
- "#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )",
- "#ifdef USE_SKINNING",
- "vec4 worldPosition = modelMatrix * skinned;",
- "#endif",
- "#if defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )",
- "vec4 worldPosition = modelMatrix * vec4( morphed, 1.0 );",
- "#endif",
- "#if ! defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )",
- "vec4 worldPosition = modelMatrix * vec4( position, 1.0 );",
- "#endif",
- "#endif"
- ].join("\n"),
- envmap_vertex : [
- "#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )",
- "vec3 worldNormal = mat3( modelMatrix[ 0 ].xyz, modelMatrix[ 1 ].xyz, modelMatrix[ 2 ].xyz ) * objectNormal;",
- "worldNormal = normalize( worldNormal );",
- "vec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );",
- "if ( useRefract ) {",
- "vReflect = refract( cameraToVertex, worldNormal, refractionRatio );",
- "} else {",
- "vReflect = reflect( cameraToVertex, worldNormal );",
- "}",
- "#endif"
- ].join("\n"),
- // COLOR MAP (particles)
- map_particle_pars_fragment: [
- "#ifdef USE_MAP",
- "uniform sampler2D map;",
- "#endif"
- ].join("\n"),
- map_particle_fragment: [
- "#ifdef USE_MAP",
- "gl_FragColor = gl_FragColor * texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) );",
- "#endif"
- ].join("\n"),
- // COLOR MAP (triangles)
- map_pars_vertex: [
- "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )",
- "varying vec2 vUv;",
- "uniform vec4 offsetRepeat;",
- "#endif"
- ].join("\n"),
- map_pars_fragment: [
- "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )",
- "varying vec2 vUv;",
- "#endif",
- "#ifdef USE_MAP",
- "uniform sampler2D map;",
- "#endif"
- ].join("\n"),
- map_vertex: [
- "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )",
- "vUv = uv * offsetRepeat.zw + offsetRepeat.xy;",
- "#endif"
- ].join("\n"),
- map_fragment: [
- "#ifdef USE_MAP",
- "vec4 texelColor = texture2D( map, vUv );",
- "#ifdef GAMMA_INPUT",
- "texelColor.xyz *= texelColor.xyz;",
- "#endif",
- "gl_FragColor = gl_FragColor * texelColor;",
- "#endif"
- ].join("\n"),
- // LIGHT MAP
- lightmap_pars_fragment: [
- "#ifdef USE_LIGHTMAP",
- "varying vec2 vUv2;",
- "uniform sampler2D lightMap;",
- "#endif"
- ].join("\n"),
- lightmap_pars_vertex: [
- "#ifdef USE_LIGHTMAP",
- "varying vec2 vUv2;",
- "#endif"
- ].join("\n"),
- lightmap_fragment: [
- "#ifdef USE_LIGHTMAP",
- "gl_FragColor = gl_FragColor * texture2D( lightMap, vUv2 );",
- "#endif"
- ].join("\n"),
- lightmap_vertex: [
- "#ifdef USE_LIGHTMAP",
- "vUv2 = uv2;",
- "#endif"
- ].join("\n"),
- // BUMP MAP
- bumpmap_pars_fragment: [
- "#ifdef USE_BUMPMAP",
- "uniform sampler2D bumpMap;",
- "uniform float bumpScale;",
- // Derivative maps - bump mapping unparametrized surfaces by Morten Mikkelsen
- // http://mmikkelsen3d.blogspot.sk/2011/07/derivative-maps.html
- // Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2)
- "vec2 dHdxy_fwd() {",
- "vec2 dSTdx = dFdx( vUv );",
- "vec2 dSTdy = dFdy( vUv );",
- "float Hll = bumpScale * texture2D( bumpMap, vUv ).x;",
- "float dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;",
- "float dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;",
- "return vec2( dBx, dBy );",
- "}",
- "vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {",
- "vec3 vSigmaX = dFdx( surf_pos );",
- "vec3 vSigmaY = dFdy( surf_pos );",
- "vec3 vN = surf_norm;", // normalized
- "vec3 R1 = cross( vSigmaY, vN );",
- "vec3 R2 = cross( vN, vSigmaX );",
- "float fDet = dot( vSigmaX, R1 );",
- "vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );",
- "return normalize( abs( fDet ) * surf_norm - vGrad );",
- "}",
- "#endif"
- ].join("\n"),
- // NORMAL MAP
- normalmap_pars_fragment: [
- "#ifdef USE_NORMALMAP",
- "uniform sampler2D normalMap;",
- "uniform vec2 normalScale;",
- // Per-Pixel Tangent Space Normal Mapping
- // http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html
- "vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {",
- "vec3 q0 = dFdx( eye_pos.xyz );",
- "vec3 q1 = dFdy( eye_pos.xyz );",
- "vec2 st0 = dFdx( vUv.st );",
- "vec2 st1 = dFdy( vUv.st );",
- "vec3 S = normalize( q0 * st1.t - q1 * st0.t );",
- "vec3 T = normalize( -q0 * st1.s + q1 * st0.s );",
- "vec3 N = normalize( surf_norm );",
- "vec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;",
- "mapN.xy = normalScale * mapN.xy;",
- "mat3 tsn = mat3( S, T, N );",
- "return normalize( tsn * mapN );",
- "}",
- "#endif"
- ].join("\n"),
- // SPECULAR MAP
- specularmap_pars_fragment: [
- "#ifdef USE_SPECULARMAP",
- "uniform sampler2D specularMap;",
- "#endif"
- ].join("\n"),
- specularmap_fragment: [
- "float specularStrength;",
- "#ifdef USE_SPECULARMAP",
- "vec4 texelSpecular = texture2D( specularMap, vUv );",
- "specularStrength = texelSpecular.r;",
- "#else",
- "specularStrength = 1.0;",
- "#endif"
- ].join("\n"),
- // LIGHTS LAMBERT
- lights_lambert_pars_vertex: [
- "uniform vec3 ambient;",
- "uniform vec3 diffuse;",
- "uniform vec3 emissive;",
- "uniform vec3 ambientLightColor;",
- "#if MAX_DIR_LIGHTS > 0",
- "uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
- "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
- "#endif",
- "#if MAX_HEMI_LIGHTS > 0",
- "uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];",
- "uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];",
- "uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];",
- "#endif",
- "#if MAX_POINT_LIGHTS > 0",
- "uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
- "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
- "uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",
- "#endif",
- "#if MAX_SPOT_LIGHTS > 0",
- "uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];",
- "uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];",
- "uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];",
- "uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];",
- "uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];",
- "uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];",
- "#endif",
- "#ifdef WRAP_AROUND",
- "uniform vec3 wrapRGB;",
- "#endif"
- ].join("\n"),
- lights_lambert_vertex: [
- "vLightFront = vec3( 0.0 );",
- "#ifdef DOUBLE_SIDED",
- "vLightBack = vec3( 0.0 );",
- "#endif",
- "transformedNormal = normalize( transformedNormal );",
- "#if MAX_DIR_LIGHTS > 0",
- "for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {",
- "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );",
- "vec3 dirVector = normalize( lDirection.xyz );",
- "float dotProduct = dot( transformedNormal, dirVector );",
- "vec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );",
- "#ifdef DOUBLE_SIDED",
- "vec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );",
- "#ifdef WRAP_AROUND",
- "vec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );",
- "#endif",
- "#endif",
- "#ifdef WRAP_AROUND",
- "vec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );",
- "directionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );",
- "#ifdef DOUBLE_SIDED",
- "directionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );",
- "#endif",
- "#endif",
- "vLightFront += directionalLightColor[ i ] * directionalLightWeighting;",
- "#ifdef DOUBLE_SIDED",
- "vLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;",
- "#endif",
- "}",
- "#endif",
- "#if MAX_POINT_LIGHTS > 0",
- "for( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {",
- "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );",
- "vec3 lVector = lPosition.xyz - mvPosition.xyz;",
- "float lDistance = 1.0;",
- "if ( pointLightDistance[ i ] > 0.0 )",
- "lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );",
- "lVector = normalize( lVector );",
- "float dotProduct = dot( transformedNormal, lVector );",
- "vec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );",
- "#ifdef DOUBLE_SIDED",
- "vec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );",
- "#ifdef WRAP_AROUND",
- "vec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );",
- "#endif",
- "#endif",
- "#ifdef WRAP_AROUND",
- "vec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );",
- "pointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );",
- "#ifdef DOUBLE_SIDED",
- "pointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );",
- "#endif",
- "#endif",
- "vLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;",
- "#ifdef DOUBLE_SIDED",
- "vLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;",
- "#endif",
- "}",
- "#endif",
- "#if MAX_SPOT_LIGHTS > 0",
- "for( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {",
- "vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );",
- "vec3 lVector = lPosition.xyz - mvPosition.xyz;",
- "float spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - worldPosition.xyz ) );",
- "if ( spotEffect > spotLightAngleCos[ i ] ) {",
- "spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );",
- "float lDistance = 1.0;",
- "if ( spotLightDistance[ i ] > 0.0 )",
- "lDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );",
- "lVector = normalize( lVector );",
- "float dotProduct = dot( transformedNormal, lVector );",
- "vec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );",
- "#ifdef DOUBLE_SIDED",
- "vec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );",
- "#ifdef WRAP_AROUND",
- "vec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );",
- "#endif",
- "#endif",
- "#ifdef WRAP_AROUND",
- "vec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );",
- "spotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );",
- "#ifdef DOUBLE_SIDED",
- "spotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );",
- "#endif",
- "#endif",
- "vLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;",
- "#ifdef DOUBLE_SIDED",
- "vLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;",
- "#endif",
- "}",
- "}",
- "#endif",
- "#if MAX_HEMI_LIGHTS > 0",
- "for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {",
- "vec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );",
- "vec3 lVector = normalize( lDirection.xyz );",
- "float dotProduct = dot( transformedNormal, lVector );",
- "float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;",
- "float hemiDiffuseWeightBack = -0.5 * dotProduct + 0.5;",
- "vLightFront += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );",
- "#ifdef DOUBLE_SIDED",
- "vLightBack += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeightBack );",
- "#endif",
- "}",
- "#endif",
- "vLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;",
- "#ifdef DOUBLE_SIDED",
- "vLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;",
- "#endif"
- ].join("\n"),
- // LIGHTS PHONG
- lights_phong_pars_vertex: [
- "#ifndef PHONG_PER_PIXEL",
- "#if MAX_POINT_LIGHTS > 0",
- "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
- "uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",
- "varying vec4 vPointLight[ MAX_POINT_LIGHTS ];",
- "#endif",
- "#if MAX_SPOT_LIGHTS > 0",
- "uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];",
- "uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];",
- "varying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];",
- "#endif",
- "#endif",
- "#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )",
- "varying vec3 vWorldPosition;",
- "#endif"
- ].join("\n"),
- lights_phong_vertex: [
- "#ifndef PHONG_PER_PIXEL",
- "#if MAX_POINT_LIGHTS > 0",
- "for( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {",
- "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );",
- "vec3 lVector = lPosition.xyz - mvPosition.xyz;",
- "float lDistance = 1.0;",
- "if ( pointLightDistance[ i ] > 0.0 )",
- "lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );",
- "vPointLight[ i ] = vec4( lVector, lDistance );",
- "}",
- "#endif",
- "#if MAX_SPOT_LIGHTS > 0",
- "for( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {",
- "vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );",
- "vec3 lVector = lPosition.xyz - mvPosition.xyz;",
- "float lDistance = 1.0;",
- "if ( spotLightDistance[ i ] > 0.0 )",
- "lDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );",
- "vSpotLight[ i ] = vec4( lVector, lDistance );",
- "}",
- "#endif",
- "#endif",
- "#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )",
- "vWorldPosition = worldPosition.xyz;",
- "#endif"
- ].join("\n"),
- lights_phong_pars_fragment: [
- "uniform vec3 ambientLightColor;",
- "#if MAX_DIR_LIGHTS > 0",
- "uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
- "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
- "#endif",
- "#if MAX_HEMI_LIGHTS > 0",
- "uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];",
- "uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];",
- "uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];",
- "#endif",
- "#if MAX_POINT_LIGHTS > 0",
- "uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
- "#ifdef PHONG_PER_PIXEL",
- "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
- "uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",
- "#else",
- "varying vec4 vPointLight[ MAX_POINT_LIGHTS ];",
- "#endif",
- "#endif",
- "#if MAX_SPOT_LIGHTS > 0",
- "uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];",
- "uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];",
- "uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];",
- "uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];",
- "uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];",
- "#ifdef PHONG_PER_PIXEL",
- "uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];",
- "#else",
- "varying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];",
- "#endif",
- "#endif",
- "#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )",
- "varying vec3 vWorldPosition;",
- "#endif",
- "#ifdef WRAP_AROUND",
- "uniform vec3 wrapRGB;",
- "#endif",
- "varying vec3 vViewPosition;",
- "varying vec3 vNormal;"
- ].join("\n"),
- lights_phong_fragment: [
- "vec3 normal = normalize( vNormal );",
- "vec3 viewPosition = normalize( vViewPosition );",
- "#ifdef DOUBLE_SIDED",
- "normal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );",
- "#endif",
- "#ifdef USE_NORMALMAP",
- "normal = perturbNormal2Arb( -vViewPosition, normal );",
- "#elif defined( USE_BUMPMAP )",
- "normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );",
- "#endif",
- "#if MAX_POINT_LIGHTS > 0",
- "vec3 pointDiffuse = vec3( 0.0 );",
- "vec3 pointSpecular = vec3( 0.0 );",
- "for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {",
- "#ifdef PHONG_PER_PIXEL",
- "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );",
- "vec3 lVector = lPosition.xyz + vViewPosition.xyz;",
- "float lDistance = 1.0;",
- "if ( pointLightDistance[ i ] > 0.0 )",
- "lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );",
- "lVector = normalize( lVector );",
- "#else",
- "vec3 lVector = normalize( vPointLight[ i ].xyz );",
- "float lDistance = vPointLight[ i ].w;",
- "#endif",
- // diffuse
- "float dotProduct = dot( normal, lVector );",
- "#ifdef WRAP_AROUND",
- "float pointDiffuseWeightFull = max( dotProduct, 0.0 );",
- "float pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );",
- "vec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );",
- "#else",
- "float pointDiffuseWeight = max( dotProduct, 0.0 );",
- "#endif",
- "pointDiffuse += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;",
- // specular
- "vec3 pointHalfVector = normalize( lVector + viewPosition );",
- "float pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );",
- "float pointSpecularWeight = specularStrength * max( pow( pointDotNormalHalf, shininess ), 0.0 );",
- "#ifdef PHYSICALLY_BASED_SHADING",
- // 2.0 => 2.0001 is hack to work around ANGLE bug
- "float specularNormalization = ( shininess + 2.0001 ) / 8.0;",
- "vec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, pointHalfVector ), 5.0 );",
- "pointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;",
- "#else",
- "pointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;",
- "#endif",
- "}",
- "#endif",
- "#if MAX_SPOT_LIGHTS > 0",
- "vec3 spotDiffuse = vec3( 0.0 );",
- "vec3 spotSpecular = vec3( 0.0 );",
- "for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {",
- "#ifdef PHONG_PER_PIXEL",
- "vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );",
- "vec3 lVector = lPosition.xyz + vViewPosition.xyz;",
- "float lDistance = 1.0;",
- "if ( spotLightDistance[ i ] > 0.0 )",
- "lDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );",
- "lVector = normalize( lVector );",
- "#else",
- "vec3 lVector = normalize( vSpotLight[ i ].xyz );",
- "float lDistance = vSpotLight[ i ].w;",
- "#endif",
- "float spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );",
- "if ( spotEffect > spotLightAngleCos[ i ] ) {",
- "spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );",
- // diffuse
- "float dotProduct = dot( normal, lVector );",
- "#ifdef WRAP_AROUND",
- "float spotDiffuseWeightFull = max( dotProduct, 0.0 );",
- "float spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );",
- "vec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );",
- "#else",
- "float spotDiffuseWeight = max( dotProduct, 0.0 );",
- "#endif",
- "spotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;",
- // specular
- "vec3 spotHalfVector = normalize( lVector + viewPosition );",
- "float spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );",
- "float spotSpecularWeight = specularStrength * max( pow( spotDotNormalHalf, shininess ), 0.0 );",
- "#ifdef PHYSICALLY_BASED_SHADING",
- // 2.0 => 2.0001 is hack to work around ANGLE bug
- "float specularNormalization = ( shininess + 2.0001 ) / 8.0;",
- "vec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, spotHalfVector ), 5.0 );",
- "spotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;",
- "#else",
- "spotSpecular += specular * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * spotEffect;",
- "#endif",
- "}",
- "}",
- "#endif",
- "#if MAX_DIR_LIGHTS > 0",
- "vec3 dirDiffuse = vec3( 0.0 );",
- "vec3 dirSpecular = vec3( 0.0 );" ,
- "for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {",
- "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );",
- "vec3 dirVector = normalize( lDirection.xyz );",
- // diffuse
- "float dotProduct = dot( normal, dirVector );",
- "#ifdef WRAP_AROUND",
- "float dirDiffuseWeightFull = max( dotProduct, 0.0 );",
- "float dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );",
- "vec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );",
- "#else",
- "float dirDiffuseWeight = max( dotProduct, 0.0 );",
- "#endif",
- "dirDiffuse += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;",
- // specular
- "vec3 dirHalfVector = normalize( dirVector + viewPosition );",
- "float dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );",
- "float dirSpecularWeight = specularStrength * max( pow( dirDotNormalHalf, shininess ), 0.0 );",
- "#ifdef PHYSICALLY_BASED_SHADING",
- /*
- // fresnel term from skin shader
- "const float F0 = 0.128;",
- "float base = 1.0 - dot( viewPosition, dirHalfVector );",
- "float exponential = pow( base, 5.0 );",
- "float fresnel = exponential + F0 * ( 1.0 - exponential );",
- */
- /*
- // fresnel term from fresnel shader
- "const float mFresnelBias = 0.08;",
- "const float mFresnelScale = 0.3;",
- "const float mFresnelPower = 5.0;",
- "float fresnel = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( -viewPosition ), normal ), mFresnelPower );",
- */
- // 2.0 => 2.0001 is hack to work around ANGLE bug
- "float specularNormalization = ( shininess + 2.0001 ) / 8.0;",
- //"dirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization * fresnel;",
- "vec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );",
- "dirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;",
- "#else",
- "dirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;",
- "#endif",
- "}",
- "#endif",
- "#if MAX_HEMI_LIGHTS > 0",
- "vec3 hemiDiffuse = vec3( 0.0 );",
- "vec3 hemiSpecular = vec3( 0.0 );" ,
- "for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {",
- "vec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );",
- "vec3 lVector = normalize( lDirection.xyz );",
- // diffuse
- "float dotProduct = dot( normal, lVector );",
- "float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;",
- "vec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );",
- "hemiDiffuse += diffuse * hemiColor;",
- // specular (sky light)
- "vec3 hemiHalfVectorSky = normalize( lVector + viewPosition );",
- "float hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;",
- "float hemiSpecularWeightSky = specularStrength * max( pow( hemiDotNormalHalfSky, shininess ), 0.0 );",
- // specular (ground light)
- "vec3 lVectorGround = -lVector;",
- "vec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );",
- "float hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;",
- "float hemiSpecularWeightGround = specularStrength * max( pow( hemiDotNormalHalfGround, shininess ), 0.0 );",
- "#ifdef PHYSICALLY_BASED_SHADING",
- "float dotProductGround = dot( normal, lVectorGround );",
- // 2.0 => 2.0001 is hack to work around ANGLE bug
- "float specularNormalization = ( shininess + 2.0001 ) / 8.0;",
- "vec3 schlickSky = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );",
- "vec3 schlickGround = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );",
- "hemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );",
- "#else",
- "hemiSpecular += specular * hemiColor * ( hemiSpecularWeightSky + hemiSpecularWeightGround ) * hemiDiffuseWeight;",
- "#endif",
- "}",
- "#endif",
- "vec3 totalDiffuse = vec3( 0.0 );",
- "vec3 totalSpecular = vec3( 0.0 );",
- "#if MAX_DIR_LIGHTS > 0",
- "totalDiffuse += dirDiffuse;",
- "totalSpecular += dirSpecular;",
- "#endif",
- "#if MAX_HEMI_LIGHTS > 0",
- "totalDiffuse += hemiDiffuse;",
- "totalSpecular += hemiSpecular;",
- "#endif",
- "#if MAX_POINT_LIGHTS > 0",
- "totalDiffuse += pointDiffuse;",
- "totalSpecular += pointSpecular;",
- "#endif",
- "#if MAX_SPOT_LIGHTS > 0",
- "totalDiffuse += spotDiffuse;",
- "totalSpecular += spotSpecular;",
- "#endif",
- "#ifdef METAL",
- "gl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );",
- "#else",
- "gl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;",
- "#endif"
- ].join("\n"),
- // VERTEX COLORS
- color_pars_fragment: [
- "#ifdef USE_COLOR",
- "varying vec3 vColor;",
- "#endif"
- ].join("\n"),
- color_fragment: [
- "#ifdef USE_COLOR",
- "gl_FragColor = gl_FragColor * vec4( vColor, opacity );",
- "#endif"
- ].join("\n"),
- color_pars_vertex: [
- "#ifdef USE_COLOR",
- "varying vec3 vColor;",
- "#endif"
- ].join("\n"),
- color_vertex: [
- "#ifdef USE_COLOR",
- "#ifdef GAMMA_INPUT",
- "vColor = color * color;",
- "#else",
- "vColor = color;",
- "#endif",
- "#endif"
- ].join("\n"),
- // SKINNING
- skinning_pars_vertex: [
- "#ifdef USE_SKINNING",
- "#ifdef BONE_TEXTURE",
- "uniform sampler2D boneTexture;",
- "uniform int boneTextureWidth;",
- "uniform int boneTextureHeight;",
- "mat4 getBoneMatrix( const in float i ) {",
- "float j = i * 4.0;",
- "float x = mod( j, float( boneTextureWidth ) );",
- "float y = floor( j / float( boneTextureWidth ) );",
- "float dx = 1.0 / float( boneTextureWidth );",
- "float dy = 1.0 / float( boneTextureHeight );",
- "y = dy * ( y + 0.5 );",
- "vec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );",
- "vec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );",
- "vec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );",
- "vec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );",
- "mat4 bone = mat4( v1, v2, v3, v4 );",
- "return bone;",
- "}",
- "#else",
- "uniform mat4 boneGlobalMatrices[ MAX_BONES ];",
- "mat4 getBoneMatrix( const in float i ) {",
- "mat4 bone = boneGlobalMatrices[ int(i) ];",
- "return bone;",
- "}",
- "#endif",
- "#endif"
- ].join("\n"),
- skinbase_vertex: [
- "#ifdef USE_SKINNING",
- "mat4 boneMatX = getBoneMatrix( skinIndex.x );",
- "mat4 boneMatY = getBoneMatrix( skinIndex.y );",
- "#endif"
- ].join("\n"),
- skinning_vertex: [
- "#ifdef USE_SKINNING",
- "#ifdef USE_MORPHTARGETS",
- "vec4 skinVertex = vec4( morphed, 1.0 );",
- "#else",
- "vec4 skinVertex = vec4( position, 1.0 );",
- "#endif",
- "vec4 skinned = boneMatX * skinVertex * skinWeight.x;",
- "skinned += boneMatY * skinVertex * skinWeight.y;",
- "#endif"
- ].join("\n"),
- // MORPHING
- morphtarget_pars_vertex: [
- "#ifdef USE_MORPHTARGETS",
- "#ifndef USE_MORPHNORMALS",
- "uniform float morphTargetInfluences[ 8 ];",
- "#else",
- "uniform float morphTargetInfluences[ 4 ];",
- "#endif",
- "#endif"
- ].join("\n"),
- morphtarget_vertex: [
- "#ifdef USE_MORPHTARGETS",
- "vec3 morphed = vec3( 0.0 );",
- "morphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];",
- "morphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];",
- "morphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];",
- "morphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];",
- "#ifndef USE_MORPHNORMALS",
- "morphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];",
- "morphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];",
- "morphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];",
- "morphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];",
- "#endif",
- "morphed += position;",
- "#endif"
- ].join("\n"),
- default_vertex : [
- "vec4 mvPosition;",
- "#ifdef USE_SKINNING",
- "mvPosition = modelViewMatrix * skinned;",
- "#endif",
- "#if !defined( USE_SKINNING ) && defined( USE_MORPHTARGETS )",
- "mvPosition = modelViewMatrix * vec4( morphed, 1.0 );",
- "#endif",
- "#if !defined( USE_SKINNING ) && ! defined( USE_MORPHTARGETS )",
- "mvPosition = modelViewMatrix * vec4( position, 1.0 );",
- "#endif",
- "gl_Position = projectionMatrix * mvPosition;"
- ].join("\n"),
- morphnormal_vertex: [
- "#ifdef USE_MORPHNORMALS",
- "vec3 morphedNormal = vec3( 0.0 );",
- "morphedNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];",
- "morphedNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];",
- "morphedNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];",
- "morphedNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];",
- "morphedNormal += normal;",
- "#endif"
- ].join("\n"),
- skinnormal_vertex: [
- "#ifdef USE_SKINNING",
- "mat4 skinMatrix = skinWeight.x * boneMatX;",
- "skinMatrix += skinWeight.y * boneMatY;",
- "#ifdef USE_MORPHNORMALS",
- "vec4 skinnedNormal = skinMatrix * vec4( morphedNormal, 0.0 );",
- "#else",
- "vec4 skinnedNormal = skinMatrix * vec4( normal, 0.0 );",
- "#endif",
- "#endif"
- ].join("\n"),
- defaultnormal_vertex: [
- "vec3 objectNormal;",
- "#ifdef USE_SKINNING",
- "objectNormal = skinnedNormal.xyz;",
- "#endif",
- "#if !defined( USE_SKINNING ) && defined( USE_MORPHNORMALS )",
- "objectNormal = morphedNormal;",
- "#endif",
- "#if !defined( USE_SKINNING ) && ! defined( USE_MORPHNORMALS )",
- "objectNormal = normal;",
- "#endif",
- "#ifdef FLIP_SIDED",
- "objectNormal = -objectNormal;",
- "#endif",
- "vec3 transformedNormal = normalMatrix * objectNormal;"
- ].join("\n"),
- // SHADOW MAP
- // based on SpiderGL shadow map and Fabien Sanglard's GLSL shadow mapping examples
- // http://spidergl.org/example.php?id=6
- // http://fabiensanglard.net/shadowmapping
- shadowmap_pars_fragment: [
- "#ifdef USE_SHADOWMAP",
- "uniform sampler2D shadowMap[ MAX_SHADOWS ];",
- "uniform vec2 shadowMapSize[ MAX_SHADOWS ];",
- "uniform float shadowDarkness[ MAX_SHADOWS ];",
- "uniform float shadowBias[ MAX_SHADOWS ];",
- "varying vec4 vShadowCoord[ MAX_SHADOWS ];",
- "float unpackDepth( const in vec4 rgba_depth ) {",
- "const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );",
- "float depth = dot( rgba_depth, bit_shift );",
- "return depth;",
- "}",
- "#endif"
- ].join("\n"),
- shadowmap_fragment: [
- "#ifdef USE_SHADOWMAP",
- "#ifdef SHADOWMAP_DEBUG",
- "vec3 frustumColors[3];",
- "frustumColors[0] = vec3( 1.0, 0.5, 0.0 );",
- "frustumColors[1] = vec3( 0.0, 1.0, 0.8 );",
- "frustumColors[2] = vec3( 0.0, 0.5, 1.0 );",
- "#endif",
- "#ifdef SHADOWMAP_CASCADE",
- "int inFrustumCount = 0;",
- "#endif",
- "float fDepth;",
- "vec3 shadowColor = vec3( 1.0 );",
- "for( int i = 0; i < MAX_SHADOWS; i ++ ) {",
- "vec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;",
- // "if ( something && something )" breaks ATI OpenGL shader compiler
- // "if ( all( something, something ) )" using this instead
- "bvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );",
- "bool inFrustum = all( inFrustumVec );",
- // don't shadow pixels outside of light frustum
- // use just first frustum (for cascades)
- // don't shadow pixels behind far plane of light frustum
- "#ifdef SHADOWMAP_CASCADE",
- "inFrustumCount += int( inFrustum );",
- "bvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );",
- "#else",
- "bvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );",
- "#endif",
- "bool frustumTest = all( frustumTestVec );",
- "if ( frustumTest ) {",
- "shadowCoord.z += shadowBias[ i ];",
- "#if defined( SHADOWMAP_TYPE_PCF )",
- // Percentage-close filtering
- // (9 pixel kernel)
- // http://fabiensanglard.net/shadowmappingPCF/
- "float shadow = 0.0;",
- /*
- // nested loops breaks shader compiler / validator on some ATI cards when using OpenGL
- // must enroll loop manually
- "for ( float y = -1.25; y <= 1.25; y += 1.25 )",
- "for ( float x = -1.25; x <= 1.25; x += 1.25 ) {",
- "vec4 rgbaDepth = texture2D( shadowMap[ i ], vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy );",
- // doesn't seem to produce any noticeable visual difference compared to simple "texture2D" lookup
- //"vec4 rgbaDepth = texture2DProj( shadowMap[ i ], vec4( vShadowCoord[ i ].w * ( vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy ), 0.05, vShadowCoord[ i ].w ) );",
- "float fDepth = unpackDepth( rgbaDepth );",
- "if ( fDepth < shadowCoord.z )",
- "shadow += 1.0;",
- "}",
- "shadow /= 9.0;",
- */
- "const float shadowDelta = 1.0 / 9.0;",
- "float xPixelOffset = 1.0 / shadowMapSize[ i ].x;",
- "float yPixelOffset = 1.0 / shadowMapSize[ i ].y;",
- "float dx0 = -1.25 * xPixelOffset;",
- "float dy0 = -1.25 * yPixelOffset;",
- "float dx1 = 1.25 * xPixelOffset;",
- "float dy1 = 1.25 * yPixelOffset;",
- "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );",
- "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;",
- "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );",
- "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;",
- "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );",
- "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;",
- "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );",
- "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;",
- "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );",
- "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;",
- "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );",
- "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;",
- "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );",
- "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;",
- "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );",
- "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;",
- "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );",
- "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;",
- "shadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );",
- "#elif defined( SHADOWMAP_TYPE_PCF_SOFT )",
- // Percentage-close filtering
- // (9 pixel kernel)
- // http://fabiensanglard.net/shadowmappingPCF/
- "float shadow = 0.0;",
- "float xPixelOffset = 1.0 / shadowMapSize[ i ].x;",
- "float yPixelOffset = 1.0 / shadowMapSize[ i ].y;",
- "float dx0 = -1.0 * xPixelOffset;",
- "float dy0 = -1.0 * yPixelOffset;",
- "float dx1 = 1.0 * xPixelOffset;",
- "float dy1 = 1.0 * yPixelOffset;",
- "mat3 shadowKernel;",
- "mat3 depthKernel;",
- "depthKernel[0][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );",
- "depthKernel[0][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );",
- "depthKernel[0][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );",
- "depthKernel[1][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );",
- "depthKernel[1][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );",
- "depthKernel[1][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );",
- "depthKernel[2][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );",
- "depthKernel[2][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );",
- "depthKernel[2][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );",
- "vec3 shadowZ = vec3( shadowCoord.z );",
- "shadowKernel[0] = vec3(lessThan(depthKernel[0], shadowZ ));",
- "shadowKernel[0] *= vec3(0.25);",
-
- "shadowKernel[1] = vec3(lessThan(depthKernel[1], shadowZ ));",
- "shadowKernel[1] *= vec3(0.25);",
- "shadowKernel[2] = vec3(lessThan(depthKernel[2], shadowZ ));",
- "shadowKernel[2] *= vec3(0.25);",
- "vec2 fractionalCoord = 1.0 - fract( shadowCoord.xy * shadowMapSize[i].xy );",
- "shadowKernel[0] = mix( shadowKernel[1], shadowKernel[0], fractionalCoord.x );",
- "shadowKernel[1] = mix( shadowKernel[2], shadowKernel[1], fractionalCoord.x );",
- "vec4 shadowValues;",
- "shadowValues.x = mix( shadowKernel[0][1], shadowKernel[0][0], fractionalCoord.y );",
- "shadowValues.y = mix( shadowKernel[0][2], shadowKernel[0][1], fractionalCoord.y );",
- "shadowValues.z = mix( shadowKernel[1][1], shadowKernel[1][0], fractionalCoord.y );",
- "shadowValues.w = mix( shadowKernel[1][2], shadowKernel[1][1], fractionalCoord.y );",
- "shadow = dot( shadowValues, vec4( 1.0 ) );",
- "shadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );",
- "#else",
- "vec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );",
- "float fDepth = unpackDepth( rgbaDepth );",
- "if ( fDepth < shadowCoord.z )",
- // spot with multiple shadows is darker
- "shadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );",
- // spot with multiple shadows has the same color as single shadow spot
- //"shadowColor = min( shadowColor, vec3( shadowDarkness[ i ] ) );",
- "#endif",
- "}",
- "#ifdef SHADOWMAP_DEBUG",
- "#ifdef SHADOWMAP_CASCADE",
- "if ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];",
- "#else",
- "if ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];",
- "#endif",
- "#endif",
- "}",
- "#ifdef GAMMA_OUTPUT",
- "shadowColor *= shadowColor;",
- "#endif",
- "gl_FragColor.xyz = gl_FragColor.xyz * shadowColor;",
- "#endif"
- ].join("\n"),
- shadowmap_pars_vertex: [
- "#ifdef USE_SHADOWMAP",
- "varying vec4 vShadowCoord[ MAX_SHADOWS ];",
- "uniform mat4 shadowMatrix[ MAX_SHADOWS ];",
- "#endif"
- ].join("\n"),
- shadowmap_vertex: [
- "#ifdef USE_SHADOWMAP",
- "for( int i = 0; i < MAX_SHADOWS; i ++ ) {",
- "vShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;",
- "}",
- "#endif"
- ].join("\n"),
- // ALPHATEST
- alphatest_fragment: [
- "#ifdef ALPHATEST",
- "if ( gl_FragColor.a < ALPHATEST ) discard;",
- "#endif"
- ].join("\n"),
- // LINEAR SPACE
- linear_to_gamma_fragment: [
- "#ifdef GAMMA_OUTPUT",
- "gl_FragColor.xyz = sqrt( gl_FragColor.xyz );",
- "#endif"
- ].join("\n")
- };
- THREE.UniformsUtils = {
- merge: function ( uniforms ) {
- var u, p, tmp, merged = {};
- for ( u = 0; u < uniforms.length; u ++ ) {
- tmp = this.clone( uniforms[ u ] );
- for ( p in tmp ) {
- merged[ p ] = tmp[ p ];
- }
- }
- return merged;
- },
- clone: function ( uniforms_src ) {
- var u, p, parameter, parameter_src, uniforms_dst = {};
- for ( u in uniforms_src ) {
- uniforms_dst[ u ] = {};
- for ( p in uniforms_src[ u ] ) {
- parameter_src = uniforms_src[ u ][ p ];
- if ( parameter_src instanceof THREE.Color ||
- parameter_src instanceof THREE.Vector2 ||
- parameter_src instanceof THREE.Vector3 ||
- parameter_src instanceof THREE.Vector4 ||
- parameter_src instanceof THREE.Matrix4 ||
- parameter_src instanceof THREE.Texture ) {
- uniforms_dst[ u ][ p ] = parameter_src.clone();
- } else if ( parameter_src instanceof Array ) {
- uniforms_dst[ u ][ p ] = parameter_src.slice();
- } else {
- uniforms_dst[ u ][ p ] = parameter_src;
- }
- }
- }
- return uniforms_dst;
- }
- };
- THREE.UniformsLib = {
- common: {
- "diffuse" : { type: "c", value: new THREE.Color( 0xeeeeee ) },
- "opacity" : { type: "f", value: 1.0 },
- "map" : { type: "t", value: null },
- "offsetRepeat" : { type: "v4", value: new THREE.Vector4( 0, 0, 1, 1 ) },
- "lightMap" : { type: "t", value: null },
- "specularMap" : { type: "t", value: null },
- "envMap" : { type: "t", value: null },
- "flipEnvMap" : { type: "f", value: -1 },
- "useRefract" : { type: "i", value: 0 },
- "reflectivity" : { type: "f", value: 1.0 },
- "refractionRatio" : { type: "f", value: 0.98 },
- "combine" : { type: "i", value: 0 },
- "morphTargetInfluences" : { type: "f", value: 0 }
- },
- bump: {
- "bumpMap" : { type: "t", value: null },
- "bumpScale" : { type: "f", value: 1 }
- },
- normalmap: {
- "normalMap" : { type: "t", value: null },
- "normalScale" : { type: "v2", value: new THREE.Vector2( 1, 1 ) }
- },
- fog : {
- "fogDensity" : { type: "f", value: 0.00025 },
- "fogNear" : { type: "f", value: 1 },
- "fogFar" : { type: "f", value: 2000 },
- "fogColor" : { type: "c", value: new THREE.Color( 0xffffff ) }
- },
- lights: {
- "ambientLightColor" : { type: "fv", value: [] },
- "directionalLightDirection" : { type: "fv", value: [] },
- "directionalLightColor" : { type: "fv", value: [] },
- "hemisphereLightDirection" : { type: "fv", value: [] },
- "hemisphereLightSkyColor" : { type: "fv", value: [] },
- "hemisphereLightGroundColor" : { type: "fv", value: [] },
- "pointLightColor" : { type: "fv", value: [] },
- "pointLightPosition" : { type: "fv", value: [] },
- "pointLightDistance" : { type: "fv1", value: [] },
- "spotLightColor" : { type: "fv", value: [] },
- "spotLightPosition" : { type: "fv", value: [] },
- "spotLightDirection" : { type: "fv", value: [] },
- "spotLightDistance" : { type: "fv1", value: [] },
- "spotLightAngleCos" : { type: "fv1", value: [] },
- "spotLightExponent" : { type: "fv1", value: [] }
- },
- particle: {
- "psColor" : { type: "c", value: new THREE.Color( 0xeeeeee ) },
- "opacity" : { type: "f", value: 1.0 },
- "size" : { type: "f", value: 1.0 },
- "scale" : { type: "f", value: 1.0 },
- "map" : { type: "t", value: null },
- "fogDensity" : { type: "f", value: 0.00025 },
- "fogNear" : { type: "f", value: 1 },
- "fogFar" : { type: "f", value: 2000 },
- "fogColor" : { type: "c", value: new THREE.Color( 0xffffff ) }
- },
- shadowmap: {
- "shadowMap": { type: "tv", value: [] },
- "shadowMapSize": { type: "v2v", value: [] },
- "shadowBias" : { type: "fv1", value: [] },
- "shadowDarkness": { type: "fv1", value: [] },
- "shadowMatrix" : { type: "m4v", value: [] }
- }
- };
- THREE.ShaderLib = {
- 'basic': {
- uniforms: THREE.UniformsUtils.merge( [
- THREE.UniformsLib[ "common" ],
- THREE.UniformsLib[ "fog" ],
- THREE.UniformsLib[ "shadowmap" ]
- ] ),
- vertexShader: [
- THREE.ShaderChunk[ "map_pars_vertex" ],
- THREE.ShaderChunk[ "lightmap_pars_vertex" ],
- THREE.ShaderChunk[ "envmap_pars_vertex" ],
- THREE.ShaderChunk[ "color_pars_vertex" ],
- THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
- THREE.ShaderChunk[ "skinning_pars_vertex" ],
- THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
- "void main() {",
- THREE.ShaderChunk[ "map_vertex" ],
- THREE.ShaderChunk[ "lightmap_vertex" ],
- THREE.ShaderChunk[ "color_vertex" ],
- THREE.ShaderChunk[ "skinbase_vertex" ],
- "#ifdef USE_ENVMAP",
- THREE.ShaderChunk[ "morphnormal_vertex" ],
- THREE.ShaderChunk[ "skinnormal_vertex" ],
- THREE.ShaderChunk[ "defaultnormal_vertex" ],
- "#endif",
- THREE.ShaderChunk[ "morphtarget_vertex" ],
- THREE.ShaderChunk[ "skinning_vertex" ],
- THREE.ShaderChunk[ "default_vertex" ],
- THREE.ShaderChunk[ "worldpos_vertex" ],
- THREE.ShaderChunk[ "envmap_vertex" ],
- THREE.ShaderChunk[ "shadowmap_vertex" ],
- "}"
- ].join("\n"),
- fragmentShader: [
- "uniform vec3 diffuse;",
- "uniform float opacity;",
- THREE.ShaderChunk[ "color_pars_fragment" ],
- THREE.ShaderChunk[ "map_pars_fragment" ],
- THREE.ShaderChunk[ "lightmap_pars_fragment" ],
- THREE.ShaderChunk[ "envmap_pars_fragment" ],
- THREE.ShaderChunk[ "fog_pars_fragment" ],
- THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
- THREE.ShaderChunk[ "specularmap_pars_fragment" ],
- "void main() {",
- "gl_FragColor = vec4( diffuse, opacity );",
- THREE.ShaderChunk[ "map_fragment" ],
- THREE.ShaderChunk[ "alphatest_fragment" ],
- THREE.ShaderChunk[ "specularmap_fragment" ],
- THREE.ShaderChunk[ "lightmap_fragment" ],
- THREE.ShaderChunk[ "color_fragment" ],
- THREE.ShaderChunk[ "envmap_fragment" ],
- THREE.ShaderChunk[ "shadowmap_fragment" ],
- THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
- THREE.ShaderChunk[ "fog_fragment" ],
- "}"
- ].join("\n")
- },
- 'lambert': {
- uniforms: THREE.UniformsUtils.merge( [
- THREE.UniformsLib[ "common" ],
- THREE.UniformsLib[ "fog" ],
- THREE.UniformsLib[ "lights" ],
- THREE.UniformsLib[ "shadowmap" ],
- {
- "ambient" : { type: "c", value: new THREE.Color( 0xffffff ) },
- "emissive" : { type: "c", value: new THREE.Color( 0x000000 ) },
- "wrapRGB" : { type: "v3", value: new THREE.Vector3( 1, 1, 1 ) }
- }
- ] ),
- vertexShader: [
- "#define LAMBERT",
- "varying vec3 vLightFront;",
- "#ifdef DOUBLE_SIDED",
- "varying vec3 vLightBack;",
- "#endif",
- THREE.ShaderChunk[ "map_pars_vertex" ],
- THREE.ShaderChunk[ "lightmap_pars_vertex" ],
- THREE.ShaderChunk[ "envmap_pars_vertex" ],
- THREE.ShaderChunk[ "lights_lambert_pars_vertex" ],
- THREE.ShaderChunk[ "color_pars_vertex" ],
- THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
- THREE.ShaderChunk[ "skinning_pars_vertex" ],
- THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
- "void main() {",
- THREE.ShaderChunk[ "map_vertex" ],
- THREE.ShaderChunk[ "lightmap_vertex" ],
- THREE.ShaderChunk[ "color_vertex" ],
- THREE.ShaderChunk[ "morphnormal_vertex" ],
- THREE.ShaderChunk[ "skinbase_vertex" ],
- THREE.ShaderChunk[ "skinnormal_vertex" ],
- THREE.ShaderChunk[ "defaultnormal_vertex" ],
- THREE.ShaderChunk[ "morphtarget_vertex" ],
- THREE.ShaderChunk[ "skinning_vertex" ],
- THREE.ShaderChunk[ "default_vertex" ],
- THREE.ShaderChunk[ "worldpos_vertex" ],
- THREE.ShaderChunk[ "envmap_vertex" ],
- THREE.ShaderChunk[ "lights_lambert_vertex" ],
- THREE.ShaderChunk[ "shadowmap_vertex" ],
- "}"
- ].join("\n"),
- fragmentShader: [
- "uniform float opacity;",
- "varying vec3 vLightFront;",
- "#ifdef DOUBLE_SIDED",
- "varying vec3 vLightBack;",
- "#endif",
- THREE.ShaderChunk[ "color_pars_fragment" ],
- THREE.ShaderChunk[ "map_pars_fragment" ],
- THREE.ShaderChunk[ "lightmap_pars_fragment" ],
- THREE.ShaderChunk[ "envmap_pars_fragment" ],
- THREE.ShaderChunk[ "fog_pars_fragment" ],
- THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
- THREE.ShaderChunk[ "specularmap_pars_fragment" ],
- "void main() {",
- "gl_FragColor = vec4( vec3 ( 1.0 ), opacity );",
- THREE.ShaderChunk[ "map_fragment" ],
- THREE.ShaderChunk[ "alphatest_fragment" ],
- THREE.ShaderChunk[ "specularmap_fragment" ],
- "#ifdef DOUBLE_SIDED",
- //"float isFront = float( gl_FrontFacing );",
- //"gl_FragColor.xyz *= isFront * vLightFront + ( 1.0 - isFront ) * vLightBack;",
- "if ( gl_FrontFacing )",
- "gl_FragColor.xyz *= vLightFront;",
- "else",
- "gl_FragColor.xyz *= vLightBack;",
- "#else",
- "gl_FragColor.xyz *= vLightFront;",
- "#endif",
- THREE.ShaderChunk[ "lightmap_fragment" ],
- THREE.ShaderChunk[ "color_fragment" ],
- THREE.ShaderChunk[ "envmap_fragment" ],
- THREE.ShaderChunk[ "shadowmap_fragment" ],
- THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
- THREE.ShaderChunk[ "fog_fragment" ],
- "}"
- ].join("\n")
- },
- 'phong': {
- uniforms: THREE.UniformsUtils.merge( [
- THREE.UniformsLib[ "common" ],
- THREE.UniformsLib[ "bump" ],
- THREE.UniformsLib[ "normalmap" ],
- THREE.UniformsLib[ "fog" ],
- THREE.UniformsLib[ "lights" ],
- THREE.UniformsLib[ "shadowmap" ],
- {
- "ambient" : { type: "c", value: new THREE.Color( 0xffffff ) },
- "emissive" : { type: "c", value: new THREE.Color( 0x000000 ) },
- "specular" : { type: "c", value: new THREE.Color( 0x111111 ) },
- "shininess": { type: "f", value: 30 },
- "wrapRGB" : { type: "v3", value: new THREE.Vector3( 1, 1, 1 ) }
- }
- ] ),
- vertexShader: [
- "#define PHONG",
- "varying vec3 vViewPosition;",
- "varying vec3 vNormal;",
- THREE.ShaderChunk[ "map_pars_vertex" ],
- THREE.ShaderChunk[ "lightmap_pars_vertex" ],
- THREE.ShaderChunk[ "envmap_pars_vertex" ],
- THREE.ShaderChunk[ "lights_phong_pars_vertex" ],
- THREE.ShaderChunk[ "color_pars_vertex" ],
- THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
- THREE.ShaderChunk[ "skinning_pars_vertex" ],
- THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
- "void main() {",
- THREE.ShaderChunk[ "map_vertex" ],
- THREE.ShaderChunk[ "lightmap_vertex" ],
- THREE.ShaderChunk[ "color_vertex" ],
- THREE.ShaderChunk[ "morphnormal_vertex" ],
- THREE.ShaderChunk[ "skinbase_vertex" ],
- THREE.ShaderChunk[ "skinnormal_vertex" ],
- THREE.ShaderChunk[ "defaultnormal_vertex" ],
- "vNormal = normalize( transformedNormal );",
- THREE.ShaderChunk[ "morphtarget_vertex" ],
- THREE.ShaderChunk[ "skinning_vertex" ],
- THREE.ShaderChunk[ "default_vertex" ],
- "vViewPosition = -mvPosition.xyz;",
- THREE.ShaderChunk[ "worldpos_vertex" ],
- THREE.ShaderChunk[ "envmap_vertex" ],
- THREE.ShaderChunk[ "lights_phong_vertex" ],
- THREE.ShaderChunk[ "shadowmap_vertex" ],
- "}"
- ].join("\n"),
- fragmentShader: [
- "uniform vec3 diffuse;",
- "uniform float opacity;",
- "uniform vec3 ambient;",
- "uniform vec3 emissive;",
- "uniform vec3 specular;",
- "uniform float shininess;",
- THREE.ShaderChunk[ "color_pars_fragment" ],
- THREE.ShaderChunk[ "map_pars_fragment" ],
- THREE.ShaderChunk[ "lightmap_pars_fragment" ],
- THREE.ShaderChunk[ "envmap_pars_fragment" ],
- THREE.ShaderChunk[ "fog_pars_fragment" ],
- THREE.ShaderChunk[ "lights_phong_pars_fragment" ],
- THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
- THREE.ShaderChunk[ "bumpmap_pars_fragment" ],
- THREE.ShaderChunk[ "normalmap_pars_fragment" ],
- THREE.ShaderChunk[ "specularmap_pars_fragment" ],
- "void main() {",
- "gl_FragColor = vec4( vec3 ( 1.0 ), opacity );",
- THREE.ShaderChunk[ "map_fragment" ],
- THREE.ShaderChunk[ "alphatest_fragment" ],
- THREE.ShaderChunk[ "specularmap_fragment" ],
- THREE.ShaderChunk[ "lights_phong_fragment" ],
- THREE.ShaderChunk[ "lightmap_fragment" ],
- THREE.ShaderChunk[ "color_fragment" ],
- THREE.ShaderChunk[ "envmap_fragment" ],
- THREE.ShaderChunk[ "shadowmap_fragment" ],
- THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
- THREE.ShaderChunk[ "fog_fragment" ],
- "}"
- ].join("\n")
- },
- 'particle_basic': {
- uniforms: THREE.UniformsUtils.merge( [
- THREE.UniformsLib[ "particle" ],
- THREE.UniformsLib[ "shadowmap" ]
- ] ),
- vertexShader: [
- "uniform float size;",
- "uniform float scale;",
- THREE.ShaderChunk[ "color_pars_vertex" ],
- THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
- "void main() {",
- THREE.ShaderChunk[ "color_vertex" ],
- "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
- "#ifdef USE_SIZEATTENUATION",
- "gl_PointSize = size * ( scale / length( mvPosition.xyz ) );",
- "#else",
- "gl_PointSize = size;",
- "#endif",
- "gl_Position = projectionMatrix * mvPosition;",
- THREE.ShaderChunk[ "worldpos_vertex" ],
- THREE.ShaderChunk[ "shadowmap_vertex" ],
- "}"
- ].join("\n"),
- fragmentShader: [
- "uniform vec3 psColor;",
- "uniform float opacity;",
- THREE.ShaderChunk[ "color_pars_fragment" ],
- THREE.ShaderChunk[ "map_particle_pars_fragment" ],
- THREE.ShaderChunk[ "fog_pars_fragment" ],
- THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
- "void main() {",
- "gl_FragColor = vec4( psColor, opacity );",
- THREE.ShaderChunk[ "map_particle_fragment" ],
- THREE.ShaderChunk[ "alphatest_fragment" ],
- THREE.ShaderChunk[ "color_fragment" ],
- THREE.ShaderChunk[ "shadowmap_fragment" ],
- THREE.ShaderChunk[ "fog_fragment" ],
- "}"
- ].join("\n")
- },
- 'dashed': {
- uniforms: THREE.UniformsUtils.merge( [
- THREE.UniformsLib[ "common" ],
- THREE.UniformsLib[ "fog" ],
- {
- "scale": { type: "f", value: 1 },
- "dashSize": { type: "f", value: 1 },
- "totalSize": { type: "f", value: 2 }
- }
- ] ),
- vertexShader: [
- "uniform float scale;",
- "attribute float lineDistance;",
- "varying float vLineDistance;",
- THREE.ShaderChunk[ "color_pars_vertex" ],
- "void main() {",
- THREE.ShaderChunk[ "color_vertex" ],
- "vLineDistance = scale * lineDistance;",
- "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
- "gl_Position = projectionMatrix * mvPosition;",
- "}"
- ].join("\n"),
- fragmentShader: [
- "uniform vec3 diffuse;",
- "uniform float opacity;",
- "uniform float dashSize;",
- "uniform float totalSize;",
- "varying float vLineDistance;",
- THREE.ShaderChunk[ "color_pars_fragment" ],
- THREE.ShaderChunk[ "fog_pars_fragment" ],
- "void main() {",
- "if ( mod( vLineDistance, totalSize ) > dashSize ) {",
- "discard;",
- "}",
- "gl_FragColor = vec4( diffuse, opacity );",
- THREE.ShaderChunk[ "color_fragment" ],
- THREE.ShaderChunk[ "fog_fragment" ],
- "}"
- ].join("\n")
- },
- 'depth': {
- uniforms: {
- "mNear": { type: "f", value: 1.0 },
- "mFar" : { type: "f", value: 2000.0 },
- "opacity" : { type: "f", value: 1.0 }
- },
- vertexShader: [
- "void main() {",
- "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
- "}"
- ].join("\n"),
- fragmentShader: [
- "uniform float mNear;",
- "uniform float mFar;",
- "uniform float opacity;",
- "void main() {",
- "float depth = gl_FragCoord.z / gl_FragCoord.w;",
- "float color = 1.0 - smoothstep( mNear, mFar, depth );",
- "gl_FragColor = vec4( vec3( color ), opacity );",
- "}"
- ].join("\n")
- },
- 'normal': {
- uniforms: {
- "opacity" : { type: "f", value: 1.0 }
- },
- vertexShader: [
- "varying vec3 vNormal;",
- THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
- "void main() {",
- "vNormal = normalize( normalMatrix * normal );",
- THREE.ShaderChunk[ "morphtarget_vertex" ],
- THREE.ShaderChunk[ "default_vertex" ],
- "}"
- ].join("\n"),
- fragmentShader: [
- "uniform float opacity;",
- "varying vec3 vNormal;",
- "void main() {",
- "gl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );",
- "}"
- ].join("\n")
- },
- /* -------------------------------------------------------------------------
- // Normal map shader
- // - Blinn-Phong
- // - normal + diffuse + specular + AO + displacement + reflection + shadow maps
- // - point and directional lights (use with "lights: true" material option)
- ------------------------------------------------------------------------- */
- 'normalmap' : {
- uniforms: THREE.UniformsUtils.merge( [
- THREE.UniformsLib[ "fog" ],
- THREE.UniformsLib[ "lights" ],
- THREE.UniformsLib[ "shadowmap" ],
- {
- "enableAO" : { type: "i", value: 0 },
- "enableDiffuse" : { type: "i", value: 0 },
- "enableSpecular" : { type: "i", value: 0 },
- "enableReflection": { type: "i", value: 0 },
- "enableDisplacement": { type: "i", value: 0 },
- "tDisplacement": { type: "t", value: null }, // must go first as this is vertex texture
- "tDiffuse" : { type: "t", value: null },
- "tCube" : { type: "t", value: null },
- "tNormal" : { type: "t", value: null },
- "tSpecular" : { type: "t", value: null },
- "tAO" : { type: "t", value: null },
- "uNormalScale": { type: "v2", value: new THREE.Vector2( 1, 1 ) },
- "uDisplacementBias": { type: "f", value: 0.0 },
- "uDisplacementScale": { type: "f", value: 1.0 },
- "uDiffuseColor": { type: "c", value: new THREE.Color( 0xffffff ) },
- "uSpecularColor": { type: "c", value: new THREE.Color( 0x111111 ) },
- "uAmbientColor": { type: "c", value: new THREE.Color( 0xffffff ) },
- "uShininess": { type: "f", value: 30 },
- "uOpacity": { type: "f", value: 1 },
- "useRefract": { type: "i", value: 0 },
- "uRefractionRatio": { type: "f", value: 0.98 },
- "uReflectivity": { type: "f", value: 0.5 },
- "uOffset" : { type: "v2", value: new THREE.Vector2( 0, 0 ) },
- "uRepeat" : { type: "v2", value: new THREE.Vector2( 1, 1 ) },
- "wrapRGB" : { type: "v3", value: new THREE.Vector3( 1, 1, 1 ) }
- }
- ] ),
- fragmentShader: [
- "uniform vec3 uAmbientColor;",
- "uniform vec3 uDiffuseColor;",
- "uniform vec3 uSpecularColor;",
- "uniform float uShininess;",
- "uniform float uOpacity;",
- "uniform bool enableDiffuse;",
- "uniform bool enableSpecular;",
- "uniform bool enableAO;",
- "uniform bool enableReflection;",
- "uniform sampler2D tDiffuse;",
- "uniform sampler2D tNormal;",
- "uniform sampler2D tSpecular;",
- "uniform sampler2D tAO;",
- "uniform samplerCube tCube;",
- "uniform vec2 uNormalScale;",
- "uniform bool useRefract;",
- "uniform float uRefractionRatio;",
- "uniform float uReflectivity;",
- "varying vec3 vTangent;",
- "varying vec3 vBinormal;",
- "varying vec3 vNormal;",
- "varying vec2 vUv;",
- "uniform vec3 ambientLightColor;",
- "#if MAX_DIR_LIGHTS > 0",
- "uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
- "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
- "#endif",
- "#if MAX_HEMI_LIGHTS > 0",
- "uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];",
- "uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];",
- "uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];",
- "#endif",
- "#if MAX_POINT_LIGHTS > 0",
- "uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
- "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
- "uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",
- "#endif",
- "#if MAX_SPOT_LIGHTS > 0",
- "uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];",
- "uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];",
- "uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];",
- "uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];",
- "uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];",
- "uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];",
- "#endif",
- "#ifdef WRAP_AROUND",
- "uniform vec3 wrapRGB;",
- "#endif",
- "varying vec3 vWorldPosition;",
- "varying vec3 vViewPosition;",
- THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
- THREE.ShaderChunk[ "fog_pars_fragment" ],
- "void main() {",
- "gl_FragColor = vec4( vec3( 1.0 ), uOpacity );",
- "vec3 specularTex = vec3( 1.0 );",
- "vec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;",
- "normalTex.xy *= uNormalScale;",
- "normalTex = normalize( normalTex );",
- "if( enableDiffuse ) {",
- "#ifdef GAMMA_INPUT",
- "vec4 texelColor = texture2D( tDiffuse, vUv );",
- "texelColor.xyz *= texelColor.xyz;",
- "gl_FragColor = gl_FragColor * texelColor;",
- "#else",
- "gl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );",
- "#endif",
- "}",
- "if( enableAO ) {",
- "#ifdef GAMMA_INPUT",
- "vec4 aoColor = texture2D( tAO, vUv );",
- "aoColor.xyz *= aoColor.xyz;",
- "gl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;",
- "#else",
- "gl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;",
- "#endif",
- "}",
- "if( enableSpecular )",
- "specularTex = texture2D( tSpecular, vUv ).xyz;",
- "mat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );",
- "vec3 finalNormal = tsb * normalTex;",
- "#ifdef FLIP_SIDED",
- "finalNormal = -finalNormal;",
- "#endif",
- "vec3 normal = normalize( finalNormal );",
- "vec3 viewPosition = normalize( vViewPosition );",
- // point lights
- "#if MAX_POINT_LIGHTS > 0",
- "vec3 pointDiffuse = vec3( 0.0 );",
- "vec3 pointSpecular = vec3( 0.0 );",
- "for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {",
- "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );",
- "vec3 pointVector = lPosition.xyz + vViewPosition.xyz;",
- "float pointDistance = 1.0;",
- "if ( pointLightDistance[ i ] > 0.0 )",
- "pointDistance = 1.0 - min( ( length( pointVector ) / pointLightDistance[ i ] ), 1.0 );",
- "pointVector = normalize( pointVector );",
- // diffuse
- "#ifdef WRAP_AROUND",
- "float pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );",
- "float pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );",
- "vec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );",
- "#else",
- "float pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );",
- "#endif",
- "pointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;",
- // specular
- "vec3 pointHalfVector = normalize( pointVector + viewPosition );",
- "float pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );",
- "float pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );",
- "#ifdef PHYSICALLY_BASED_SHADING",
- // 2.0 => 2.0001 is hack to work around ANGLE bug
- "float specularNormalization = ( uShininess + 2.0001 ) / 8.0;",
- "vec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );",
- "pointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;",
- "#else",
- "pointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;",
- "#endif",
- "}",
- "#endif",
- // spot lights
- "#if MAX_SPOT_LIGHTS > 0",
- "vec3 spotDiffuse = vec3( 0.0 );",
- "vec3 spotSpecular = vec3( 0.0 );",
- "for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {",
- "vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );",
- "vec3 spotVector = lPosition.xyz + vViewPosition.xyz;",
- "float spotDistance = 1.0;",
- "if ( spotLightDistance[ i ] > 0.0 )",
- "spotDistance = 1.0 - min( ( length( spotVector ) / spotLightDistance[ i ] ), 1.0 );",
- "spotVector = normalize( spotVector );",
- "float spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );",
- "if ( spotEffect > spotLightAngleCos[ i ] ) {",
- "spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );",
- // diffuse
- "#ifdef WRAP_AROUND",
- "float spotDiffuseWeightFull = max( dot( normal, spotVector ), 0.0 );",
- "float spotDiffuseWeightHalf = max( 0.5 * dot( normal, spotVector ) + 0.5, 0.0 );",
- "vec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );",
- "#else",
- "float spotDiffuseWeight = max( dot( normal, spotVector ), 0.0 );",
- "#endif",
- "spotDiffuse += spotDistance * spotLightColor[ i ] * uDiffuseColor * spotDiffuseWeight * spotEffect;",
- // specular
- "vec3 spotHalfVector = normalize( spotVector + viewPosition );",
- "float spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );",
- "float spotSpecularWeight = specularTex.r * max( pow( spotDotNormalHalf, uShininess ), 0.0 );",
- "#ifdef PHYSICALLY_BASED_SHADING",
- // 2.0 => 2.0001 is hack to work around ANGLE bug
- "float specularNormalization = ( uShininess + 2.0001 ) / 8.0;",
- "vec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( spotVector, spotHalfVector ), 5.0 );",
- "spotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * spotDistance * specularNormalization * spotEffect;",
- "#else",
- "spotSpecular += spotDistance * spotLightColor[ i ] * uSpecularColor * spotSpecularWeight * spotDiffuseWeight * spotEffect;",
- "#endif",
- "}",
- "}",
- "#endif",
- // directional lights
- "#if MAX_DIR_LIGHTS > 0",
- "vec3 dirDiffuse = vec3( 0.0 );",
- "vec3 dirSpecular = vec3( 0.0 );",
- "for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {",
- "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );",
- "vec3 dirVector = normalize( lDirection.xyz );",
- // diffuse
- "#ifdef WRAP_AROUND",
- "float directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );",
- "float directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );",
- "vec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );",
- "#else",
- "float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );",
- "#endif",
- "dirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;",
- // specular
- "vec3 dirHalfVector = normalize( dirVector + viewPosition );",
- "float dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );",
- "float dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );",
- "#ifdef PHYSICALLY_BASED_SHADING",
- // 2.0 => 2.0001 is hack to work around ANGLE bug
- "float specularNormalization = ( uShininess + 2.0001 ) / 8.0;",
- "vec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );",
- "dirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;",
- "#else",
- "dirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;",
- "#endif",
- "}",
- "#endif",
- // hemisphere lights
- "#if MAX_HEMI_LIGHTS > 0",
- "vec3 hemiDiffuse = vec3( 0.0 );",
- "vec3 hemiSpecular = vec3( 0.0 );" ,
- "for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {",
- "vec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );",
- "vec3 lVector = normalize( lDirection.xyz );",
- // diffuse
- "float dotProduct = dot( normal, lVector );",
- "float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;",
- "vec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );",
- "hemiDiffuse += uDiffuseColor * hemiColor;",
- // specular (sky light)
- "vec3 hemiHalfVectorSky = normalize( lVector + viewPosition );",
- "float hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;",
- "float hemiSpecularWeightSky = specularTex.r * max( pow( hemiDotNormalHalfSky, uShininess ), 0.0 );",
- // specular (ground light)
- "vec3 lVectorGround = -lVector;",
- "vec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );",
- "float hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;",
- "float hemiSpecularWeightGround = specularTex.r * max( pow( hemiDotNormalHalfGround, uShininess ), 0.0 );",
- "#ifdef PHYSICALLY_BASED_SHADING",
- "float dotProductGround = dot( normal, lVectorGround );",
- // 2.0 => 2.0001 is hack to work around ANGLE bug
- "float specularNormalization = ( uShininess + 2.0001 ) / 8.0;",
- "vec3 schlickSky = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );",
- "vec3 schlickGround = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );",
- "hemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );",
- "#else",
- "hemiSpecular += uSpecularColor * hemiColor * ( hemiSpecularWeightSky + hemiSpecularWeightGround ) * hemiDiffuseWeight;",
- "#endif",
- "}",
- "#endif",
- // all lights contribution summation
- "vec3 totalDiffuse = vec3( 0.0 );",
- "vec3 totalSpecular = vec3( 0.0 );",
- "#if MAX_DIR_LIGHTS > 0",
- "totalDiffuse += dirDiffuse;",
- "totalSpecular += dirSpecular;",
- "#endif",
- "#if MAX_HEMI_LIGHTS > 0",
- "totalDiffuse += hemiDiffuse;",
- "totalSpecular += hemiSpecular;",
- "#endif",
- "#if MAX_POINT_LIGHTS > 0",
- "totalDiffuse += pointDiffuse;",
- "totalSpecular += pointSpecular;",
- "#endif",
- "#if MAX_SPOT_LIGHTS > 0",
- "totalDiffuse += spotDiffuse;",
- "totalSpecular += spotSpecular;",
- "#endif",
- "#ifdef METAL",
- "gl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor + totalSpecular );",
- "#else",
- "gl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor ) + totalSpecular;",
- "#endif",
- "if ( enableReflection ) {",
- "vec3 vReflect;",
- "vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );",
- "if ( useRefract ) {",
- "vReflect = refract( cameraToVertex, normal, uRefractionRatio );",
- "} else {",
- "vReflect = reflect( cameraToVertex, normal );",
- "}",
- "vec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );",
- "#ifdef GAMMA_INPUT",
- "cubeColor.xyz *= cubeColor.xyz;",
- "#endif",
- "gl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );",
- "}",
- THREE.ShaderChunk[ "shadowmap_fragment" ],
- THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
- THREE.ShaderChunk[ "fog_fragment" ],
- "}"
- ].join("\n"),
- vertexShader: [
- "attribute vec4 tangent;",
- "uniform vec2 uOffset;",
- "uniform vec2 uRepeat;",
- "uniform bool enableDisplacement;",
- "#ifdef VERTEX_TEXTURES",
- "uniform sampler2D tDisplacement;",
- "uniform float uDisplacementScale;",
- "uniform float uDisplacementBias;",
- "#endif",
- "varying vec3 vTangent;",
- "varying vec3 vBinormal;",
- "varying vec3 vNormal;",
- "varying vec2 vUv;",
- "varying vec3 vWorldPosition;",
- "varying vec3 vViewPosition;",
- THREE.ShaderChunk[ "skinning_pars_vertex" ],
- THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
- "void main() {",
- THREE.ShaderChunk[ "skinbase_vertex" ],
- THREE.ShaderChunk[ "skinnormal_vertex" ],
- // normal, tangent and binormal vectors
- "#ifdef USE_SKINNING",
- "vNormal = normalize( normalMatrix * skinnedNormal.xyz );",
- "vec4 skinnedTangent = skinMatrix * vec4( tangent.xyz, 0.0 );",
- "vTangent = normalize( normalMatrix * skinnedTangent.xyz );",
- "#else",
- "vNormal = normalize( normalMatrix * normal );",
- "vTangent = normalize( normalMatrix * tangent.xyz );",
- "#endif",
- "vBinormal = normalize( cross( vNormal, vTangent ) * tangent.w );",
- "vUv = uv * uRepeat + uOffset;",
- // displacement mapping
- "vec3 displacedPosition;",
- "#ifdef VERTEX_TEXTURES",
- "if ( enableDisplacement ) {",
- "vec3 dv = texture2D( tDisplacement, uv ).xyz;",
- "float df = uDisplacementScale * dv.x + uDisplacementBias;",
- "displacedPosition = position + normalize( normal ) * df;",
- "} else {",
- "#ifdef USE_SKINNING",
- "vec4 skinVertex = vec4( position, 1.0 );",
- "vec4 skinned = boneMatX * skinVertex * skinWeight.x;",
- "skinned += boneMatY * skinVertex * skinWeight.y;",
- "displacedPosition = skinned.xyz;",
- "#else",
- "displacedPosition = position;",
- "#endif",
- "}",
- "#else",
- "#ifdef USE_SKINNING",
- "vec4 skinVertex = vec4( position, 1.0 );",
- "vec4 skinned = boneMatX * skinVertex * skinWeight.x;",
- "skinned += boneMatY * skinVertex * skinWeight.y;",
- "displacedPosition = skinned.xyz;",
- "#else",
- "displacedPosition = position;",
- "#endif",
- "#endif",
- //
- "vec4 mvPosition = modelViewMatrix * vec4( displacedPosition, 1.0 );",
- "vec4 worldPosition = modelMatrix * vec4( displacedPosition, 1.0 );",
- "gl_Position = projectionMatrix * mvPosition;",
- //
- "vWorldPosition = worldPosition.xyz;",
- "vViewPosition = -mvPosition.xyz;",
- // shadows
- "#ifdef USE_SHADOWMAP",
- "for( int i = 0; i < MAX_SHADOWS; i ++ ) {",
- "vShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;",
- "}",
- "#endif",
- "}"
- ].join("\n")
- },
- /* -------------------------------------------------------------------------
- // Cube map shader
- ------------------------------------------------------------------------- */
- 'cube': {
- uniforms: { "tCube": { type: "t", value: null },
- "tFlip": { type: "f", value: -1 } },
- vertexShader: [
- "varying vec3 vWorldPosition;",
- "void main() {",
- "vec4 worldPosition = modelMatrix * vec4( position, 1.0 );",
- "vWorldPosition = worldPosition.xyz;",
- "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
- "}"
- ].join("\n"),
- fragmentShader: [
- "uniform samplerCube tCube;",
- "uniform float tFlip;",
- "varying vec3 vWorldPosition;",
- "void main() {",
- "gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );",
- "}"
- ].join("\n")
- },
- // Depth encoding into RGBA texture
- // based on SpiderGL shadow map example
- // http://spidergl.org/example.php?id=6
- // originally from
- // http://www.gamedev.net/topic/442138-packing-a-float-into-a-a8r8g8b8-texture-shader/page__whichpage__1%25EF%25BF%25BD
- // see also here:
- // http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/
- 'depthRGBA': {
- uniforms: {},
- vertexShader: [
- THREE.ShaderChunk[ "morphtarget_pars_vertex" ],
- THREE.ShaderChunk[ "skinning_pars_vertex" ],
- "void main() {",
- THREE.ShaderChunk[ "skinbase_vertex" ],
- THREE.ShaderChunk[ "morphtarget_vertex" ],
- THREE.ShaderChunk[ "skinning_vertex" ],
- THREE.ShaderChunk[ "default_vertex" ],
- "}"
- ].join("\n"),
- fragmentShader: [
- "vec4 pack_depth( const in float depth ) {",
- "const vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );",
- "const vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );",
- "vec4 res = fract( depth * bit_shift );",
- "res -= res.xxyz * bit_mask;",
- "return res;",
- "}",
- "void main() {",
- "gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );",
- //"gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z / gl_FragCoord.w );",
- //"float z = ( ( gl_FragCoord.z / gl_FragCoord.w ) - 3.0 ) / ( 4000.0 - 3.0 );",
- //"gl_FragData[ 0 ] = pack_depth( z );",
- //"gl_FragData[ 0 ] = vec4( z, z, z, 1.0 );",
- "}"
- ].join("\n")
- }
- };
|