Advertisement
Guest User

FaceShader2.0

a guest
Feb 13th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.89 KB | None | 0 0
  1. #---FRAGMENT---#
  2. #include "shaders/template_perframe.glinc"
  3. #include "shaders/template_matrixhelpers.glinc"
  4. #include "shaders/template_noise.glinc" #only:TERRAIN
  5. #include "shaders/template_lighting_fs.glinc" #only:LIT
  6.  
  7. uniform sampler2D tex0; // name: texDiffuse
  8. uniform sampler2D tex1; // name: texTangentNormal #only:HAS_TNORMALMAP
  9. uniform sampler2D tex1; // name: texWorldNormal #only:HAS_WNORMALMAP
  10. uniform sampler2D tex2; // name: texEmissive
  11. uniform sampler2D tex3; // name: texSpecular #only:HAS_SPECULAR
  12. uniform sampler2D tex4; // name: texColourSet
  13. uniform samplerCube tex8; // name: texCube0 #only:HAS_ENVIRONMENTMAP
  14. uniform sampler2DArray tex6; #only:TERRAIN
  15.  
  16. uniform mat4 world; #only:HAS_WNORMALMAP
  17.  
  18. in vec4 VSOutTEXCOORD0; // name: OutTexCoord0
  19. in vec3 VSOutTEXCOORD1; // name: OutWorldPosition
  20. in vec3 VSOutTEXCOORD2; // name: OutNormal #only:~HAS_WNORMALMAP
  21. in vec3 VSOutTEXCOORD3; // name: OutTangent #only:HAS_TNORMALMAP
  22. in vec3 VSOutTEXCOORD4; // name: OutBitangent #only:HAS_TNORMALMAP
  23.  
  24. out vec4 FragmentColor0; // name: FragmentColor
  25. out vec4 FragmentColor1; // name: FragmentColor1 #only:DEFERRED
  26. out vec4 FragmentColor2; // name: FragmentColor2 #only:DEFERRED
  27.  
  28. uniform vec4 specularSettings;
  29. uniform vec4 fillColor; #only:FILLCOLOR
  30. uniform vec4 alphaSettings; #only:ALPHATEST
  31. uniform vec4 environmentSettings; #only:HAS_ENVIRONMENTMAP
  32. uniform vec4 albedoColor; #only:COLOR_ALBEDO
  33.  
  34. uniform vec4 color1;
  35. uniform vec4 color2;
  36. uniform vec4 color3;
  37. uniform vec4 color4;
  38. uniform vec4 color5;
  39. uniform vec4 color6;
  40.  
  41. float halfLambert(in vec3 vect1, in vec3 vect2)
  42. {
  43. float product = dot(vect1,vect2);
  44. return product * 0.5 + 0.5;
  45. }
  46.  
  47. float blinnPhongSpecular(in vec3 normalVec, in vec3 lightVec, in float specPower)
  48. {
  49. vec3 halfAngle = normalize(normalVec + lightVec);
  50. return pow(clamp(0.0,1.0,dot(normalVec,halfAngle)),specPower);
  51. }
  52.  
  53. void main()
  54. {
  55.  
  56. #ifdef HAS_TNORMALMAP
  57. vec4 normalSample = texture(tex1, VSOutTEXCOORD0.xy);
  58. vec3 tangentSpaceNormal = ( normalSample.xyz - 0.5) * 2.0;
  59.  
  60. // HLSL: mat3 tangentToWorldMatrix = {VSOutTEXCOORD3, VSOutTEXCOORD4, VSOutTEXCOORD2};
  61. // HLSL: vec3 normal = mul( tangentSpaceNormal, tangentToWorldMatrix);
  62. mat3 tangentToWorldMatrix = mat3(VSOutTEXCOORD3, VSOutTEXCOORD4, VSOutTEXCOORD2);
  63. vec3 normal = ( tangentToWorldMatrix* tangentSpaceNormal);
  64. #else
  65. vec3 normal = (world * vec4(texture(tex1, VSOutTEXCOORD0.xy).xyz * 2.0 - 1.0, 0.0)).xyz; #only:HAS_WNORMALMAP
  66. vec3 normal = VSOutTEXCOORD2; #only:~HAS_WNORMALMAP
  67. #endif
  68.  
  69. vec4 albedo=texture(tex0, VSOutTEXCOORD0.xy);
  70. albedo *= albedoColor; #only:COLOR_ALBEDO
  71.  
  72. // specular factor
  73. float specular = specularSettings.z;
  74. specular=texture(tex3, VSOutTEXCOORD0.xy).r*specularSettings.z; #only:HAS_SPECULAR
  75. specular=albedo.w*specularSettings.z; albedo.w = 1.0; #only:HAS_SPECULAR_IN_DIFFUSE_ALPHA
  76.  
  77. #ifdef LIT
  78. FragmentColor0 = vec4(CalculateForwardLighting(albedo, normal, VSOutTEXCOORD1, specularSettings.x, specular), albedo.w);
  79. #else
  80. FragmentColor0 = texture(tex0, VSOutTEXCOORD0.xy); #only:~FILLCOLOR
  81. #endif
  82. FragmentColor0 = fillColor; #only:FILLCOLOR
  83.  
  84.  
  85. #ifdef HAS_ENVIRONMENTMAP
  86. vec3 viewDir = normalize(GetTranslation(inverseView)-VSOutTEXCOORD1);
  87. FragmentColor0.xyz += texture(tex8, -reflect(viewDir,normal).xzy).xyz * environmentSettings.x * saturate(1.0-abs(dot(viewDir,normal))*environmentSettings.y);
  88. #endif
  89.  
  90. if(FragmentColor0.a < alphaSettings.x) { discard; } else { FragmentColor0.a = 1.0; } #only:ALPHATEST
  91.  
  92. #ifdef TEST_MIPMAP
  93. vec3 colors[] = vec3[](vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(0.0, 0.0, 1.0), vec3(1.0, 0.0, 1.0), vec3(1.0, 1.0, 0.0), vec3(0.0, 1.0, 1.0), vec3(1.0, 0.5, 0.0), vec3(0.0, 0.5, 1.0) );
  94. vec2 lod=textureQueryLod(tex0, VSOutTEXCOORD0.xy);
  95. int lodlevel = int(floor(lod.x));
  96. FragmentColor0.xyz *= mix(colors[lodlevel], colors[lodlevel+1], fract(lod.x));
  97. #endif
  98.  
  99. #ifdef DEFERRED
  100. FragmentColor1.xyz = (normal.xyz + 1.0) * 0.5;
  101. FragmentColor1.w = 0.0;
  102. FragmentColor2.x = specularSettings.x;
  103. FragmentColor2.y = specular;
  104.  
  105. FragmentColor0.a = 1.0;
  106. //return;
  107. #endif
  108.  
  109. //FragmentColor0 += texture(tex2, VSOutTEXCOORD0.xy);
  110.  
  111. vec4 colorValue = texture(tex2, VSOutTEXCOORD0.xy);
  112.  
  113. if (colorValue.x > 0.7 && colorValue.x <= 1.0 && colorValue.y > 0.7 && colorValue.y <= 1.0 && colorValue.z > 0.7 && colorValue.z <= 1.0)
  114. FragmentColor0.xyz *= color6.xyz * pow(2.3, 2.3);
  115. else if (colorValue.r > 0.5 && colorValue.r <= 1.0 && colorValue.g < 0.5 && colorValue.b < 0.5) {
  116. FragmentColor0.xyz *= color1.xyz;}
  117. else if (colorValue.g > 0.5 && colorValue.g <= 1.0 && colorValue.r < 0.5 && colorValue.b < 0.5) {
  118. FragmentColor0.xyz *= color2.xyz;}
  119. else if (colorValue.b > 0.5 && colorValue.b <= 1.0 && colorValue.r < 0.5 && colorValue.g < 0.5) {
  120. FragmentColor0.xyz *= color3.xyz;}
  121. else if (colorValue.r > 0.5 && colorValue.r <= 1.0 && colorValue.g > 0.5 && colorValue.g <= 1.0 && colorValue.b < 0.5) {
  122. FragmentColor0.xyz *= color4.xyz;}
  123. else if (colorValue.r > 0.5 && colorValue.r <= 1.0 && colorValue.g < 0.5 && colorValue.b > 0.5 && colorValue.b <= 1.0 ) {
  124. FragmentColor0.xyz *= color5.xyz;}
  125. else { FragmentColor0.xyz *= vec3(0.1, 0.1, 0.1);}
  126.  
  127. vec3 viewDir = normalize(GetTranslation(inverseView)-VSOutTEXCOORD1);
  128.  
  129. float attenuation = 10.0 * (1.0 / distance(1.0,0.25));
  130. float thickness = 0.1;
  131.  
  132. vec3 indirectLightComponent = vec3(thickness * max(0.0,dot(-normal.xyz,viewDir)));
  133. indirectLightComponent += thickness * halfLambert(-viewDir.xyz,normal.xyz);
  134. indirectLightComponent *= attenuation;
  135. indirectLightComponent.r *= 0.2;
  136. indirectLightComponent.g *= 0.2;
  137. indirectLightComponent.b *= 0.2;
  138.  
  139.  
  140. vec3 rim = vec3(1.0 - max(0.0,dot(normal,viewDir)));
  141. rim *= rim;
  142. rim *= max(0.1,dot(normal,VSOutTEXCOORD1.xyz)) * specularSettings.rgb;
  143.  
  144. vec4 dotLN = vec4(halfLambert(viewDir.xyz,normal.xyz) * attenuation * 0.1);
  145.  
  146. dotLN *= albedo;
  147.  
  148. vec4 finalColour = dotLN + vec4(indirectLightComponent, 1.0);
  149. finalColour.rgb += (rim * finalColour.a * 0.05);
  150. finalColour.rgb += vec3(blinnPhongSpecular(normal, VSOutTEXCOORD1, specularSettings.z) * attenuation * specular * finalColour.a * 0.05);
  151. finalColour.rgb *= FragmentColor0.rgb;
  152.  
  153. FragmentColor0 *= finalColour;
  154. };
  155.  
  156. #---VERTEX---#
  157. #include "shaders/template_perframe.glinc"
  158.  
  159. uniform mat4 world;
  160. uniform mat4 skinmatrix[100]; #only:SKINNING
  161. uniform mat4 instworld[32]; #only:INSTANCED_UBO
  162. #define worldSkin (worldSkinMat) #only:SKINNING
  163. #define worldSkin (world) #only:~SKINNING
  164. #define worldMatrix (worldSkin) #only:~INSTANCED
  165. #define skinMatrix skinmatrix
  166.  
  167. // in variables
  168. in vec3 POSITION; // name: Pos
  169. in vec4 TEXCOORD0; // name: TexCoord0
  170. in vec3 NORMAL; // name: Normal #only:~HAS_WNORMALMAP
  171. in vec3 TANGENT; // name: Tangent #only:HAS_TNORMALMAP
  172. in vec3 BITANGENT; // name: Bitangent #only:HAS_TNORMALMAP
  173. in vec4 BLENDINDICES; // name: BlendIndices #only:SKINNING
  174. in vec4 BLENDWEIGHT; // name: BlendWeight #only:SKINNING
  175. in mat4 RESERVED1; // name: InstanceWorld #only:INSTANCED_VB
  176.  
  177. // out variables
  178. out vec4 VSOutTEXCOORD0; // name: OutTexCoord0
  179. out vec3 VSOutTEXCOORD1; // name: OutWorldPosition
  180. out vec3 VSOutTEXCOORD2; // name: OutNormal #only:~HAS_WNORMALMAP
  181. out vec3 VSOutTEXCOORD3; // name: OutTangent #only:HAS_TNORMALMAP
  182. out vec3 VSOutTEXCOORD4; // name: OutBitangent #only:HAS_TNORMALMAP
  183.  
  184. void main()
  185. {
  186. VSOutTEXCOORD0 = TEXCOORD0;
  187.  
  188. mat4 skinMat = (skinMatrix[int(BLENDINDICES.x)] * BLENDWEIGHT.x) + (skinMatrix[int(BLENDINDICES.y)] * BLENDWEIGHT.y) + #only:SKINNING
  189. (skinMatrix[int(BLENDINDICES.z)] * BLENDWEIGHT.z) + (skinMatrix[int(BLENDINDICES.w)] * BLENDWEIGHT.w); #only:SKINNING
  190. mat4 worldSkinMat = world * skinMat; #only:SKINNING
  191.  
  192. mat4 worldMatrix = (RESERVED1 * worldSkin); #only:INSTANCED_VB
  193. mat4 worldMatrix = (instworld[gl_InstanceID] * worldSkin); #only:INSTANCED_UBO
  194.  
  195. gl_Position = projectionView * (worldMatrix * vec4(POSITION, 1.0)); #only:~SKYBOX
  196. #ifdef SKYBOX
  197. mat4 viewNoTranslation = view; viewNoTranslation[3] = vec4(0.0, 0.0, 0.0, 1.0);
  198. gl_Position = projection * viewNoTranslation * worldMatrix * vec4(POSITION, 1.0);
  199. #endif
  200.  
  201. VSOutTEXCOORD1 = (worldMatrix * vec4(POSITION, 1.0)).xyz;
  202. VSOutTEXCOORD2 = normalize((worldMatrix * vec4(NORMAL, 0.0)).xyz); #only:~HAS_WNORMALMAP
  203. VSOutTEXCOORD3 = normalize((worldMatrix * vec4(TANGENT,0.0)).xyz); #only:HAS_TNORMALMAP
  204. VSOutTEXCOORD4 = normalize((worldMatrix * vec4(BITANGENT,0.0)).xyz); #only:HAS_TNORMALMAP
  205. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement