daily pastebin goal
90%
SHARE
TWEET

FaceShader2.0

a guest Feb 13th, 2018 63 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. };
RAW Paste Data
Top