Guest User

OpenGL Fixed Terrain Shader

a guest
Jun 17th, 2015
335
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Corrected vertex shader
  2. #version 120
  3.  
  4. attribute vec3 aVertexPos;
  5. attribute vec2 aVertexTex;
  6. attribute vec3 aVertexNorm;
  7.  
  8. uniform mat4 uVMatrix;
  9. uniform mat4 uTMatrix;
  10. uniform mat4 uPMatrix;
  11. uniform vec3 uLightColor[4];
  12. uniform vec3 uLightPos[4];
  13. uniform vec3 uLightAtt[4];
  14.  
  15. varying vec3 vSurfaceNorm;
  16. varying vec3 vLightVector[4];
  17. varying vec3 vLightColor[4];
  18. varying vec3 vLightAtt[4];
  19. varying vec2 vVertexTex;
  20.  
  21. void main(){
  22.     vec4 lWorldPos = uTMatrix * vec4(aVertexPos, 1.0);
  23.     gl_Position = uPMatrix * uVMatrix * lWorldPos;
  24.    
  25.     for(int i = 0; i < 4; i++){
  26.         vLightVector[i] = uLightPos[i] - lWorldPos.xyz;
  27.         vLightColor[i] = uLightColor[i];
  28.         vLightAtt[i] = uLightAtt[i];
  29.     }
  30.  
  31.     vSurfaceNorm = (uTMatrix * vec4(aVertexNorm, 0.0)).xyz;
  32.     vVertexTex = aVertexTex * 128.0;
  33. }
  34. // Corrected Fragment shader
  35. #version 120
  36.  
  37. uniform sampler2D diffuseTexs[4];
  38. uniform sampler2D blendTex;
  39.  
  40. varying vec3 vSurfaceNorm;
  41. varying vec3 vLightVector[4];
  42. varying vec3 vLightColor[4];
  43. varying vec3 vLightAtt[4];
  44. varying vec2 vVertexTex;
  45.  
  46. void main(){
  47.     vec4 texelDiffuse0 = texture2D(diffuseTexs[0], vVertexTex);
  48.     vec4 texelDiffuse1 = texture2D(diffuseTexs[1], vVertexTex);
  49.     vec4 texelDiffuse2 = texture2D(diffuseTexs[2], vVertexTex);
  50.     vec4 texelDiffuse3 = texture2D(diffuseTexs[3], vVertexTex);
  51.  
  52.     vec3 lTotalDiffuse = vec3(0.0);
  53.     for(int i = 0; i < 5; i++){
  54.         float lDist = length(vLightVector[i]);
  55.         float attFactor = 1.0 + (0.01 * lDist) + (0.002 * lDist * lDist);
  56.         vec3 lUnitNormal = normalize(vSurfaceNorm);
  57.         vec3 lUnitLightVector = normalize(vLightVector[i]);
  58.         float lNDotl = dot(lUnitNormal, lUnitLightVector);
  59.         float lBrightness = max(lNDotl, 0.0);
  60.         lTotalDiffuse = lTotalDiffuse + (vec3(lBrightness) * vLightColor[i] / vec3(attFactor));
  61.     }
  62.     lTotalDiffuse = max(lTotalDiffuse, 0.3);
  63.    
  64.     gl_FragColor = vec4(lTotalDiffuse, 1.0) * texelDiffuse0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment