avatarV.glsl
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:4k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file avatarV.glsl
  3.  *
  4.  * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
  5.  * $License$
  6.  */
  7. vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
  8. mat4 getSkinnedTransform();
  9. void calcAtmospherics(vec3 inPositionEye);
  10. attribute vec4 clothing; //4
  11. attribute vec4 gWindDir; //7
  12. attribute vec4 gSinWaveParams; //3
  13. attribute vec4 gGravity; //5
  14. const vec4 gMinMaxConstants = vec4(1.0, 0.166666, 0.0083143, .00018542);  // #minimax-generated coefficients
  15. const vec4 gPiConstants = vec4(0.159154943, 6.28318530, 3.141592653, 1.5707963); // # {1/2PI, 2PI, PI, PI/2}
  16. void main()
  17. {
  18. gl_TexCoord[0] = gl_MultiTexCoord0;
  19. vec4 pos;
  20. mat4 trans = getSkinnedTransform();
  21. vec3 norm;
  22. norm.x = dot(trans[0].xyz, gl_Normal);
  23. norm.y = dot(trans[1].xyz, gl_Normal);
  24. norm.z = dot(trans[2].xyz, gl_Normal);
  25. norm = normalize(norm);
  26. //wind
  27. vec4 windEffect;
  28. windEffect = vec4(dot(norm, gWindDir.xyz));
  29. pos.x = dot(trans[2].xyz, gl_Vertex.xyz);
  30. windEffect.xyz = pos.x * vec3(0.015, 0.015, 0.015)
  31. + windEffect.xyz;
  32. windEffect.w = windEffect.w * 2.0 + 1.0; // move wind offset value to [-1, 3]
  33. windEffect.w = windEffect.w*gWindDir.w; // modulate wind strength 
  34. windEffect.xyz = windEffect.xyz*gSinWaveParams.xyz
  35. +vec3(gSinWaveParams.w); // use sin wave params to scale and offset input
  36. //reduce to period of 2 PI
  37. vec4 temp1, temp0, temp2, offsetPos;
  38. temp1.xyz = windEffect.xyz * gPiConstants.x; // change input as multiple of [0-2PI] to [0-1]
  39. temp0.y = mod(temp1.x,1.0);
  40. windEffect.x = temp0.y * gPiConstants.y; // scale from [0,1] to [0, 2PI]
  41. temp1.z = temp1.z - gPiConstants.w; // shift normal oscillation by PI/2
  42. temp0.y = mod(temp1.z,1.0);
  43. windEffect.z = temp0.y * gPiConstants.y; // scale from [0,1] to [0, 2PI]
  44. windEffect.xyz = windEffect.xyz + vec3(-3.141592); // offset to [-PI, PI]
  45. //calculate sinusoid
  46. vec4 sinWave;
  47. temp1 = windEffect*windEffect;
  48. sinWave = -temp1 * gMinMaxConstants.w 
  49. + vec4(gMinMaxConstants.z); // y = -(x^2)/7! + 1/5!
  50. sinWave = sinWave * -temp1 + vec4(gMinMaxConstants.y); // y = -(x^2) * (-(x^2)/7! + 1/5!) + 1/3!
  51. sinWave = sinWave * -temp1 + vec4(gMinMaxConstants.x); // y = -(x^2) * (-(x^2) * (-(x^2)/7! + 1/5!) + 1/3!) + 1
  52. sinWave = sinWave * windEffect; // y = x * (-(x^2) * (-(x^2) * (-(x^2)/7! + 1/5!) + 1/3!) + 1)
  53. // sinWave.x holds sin(norm . wind_direction) with primary frequency
  54. // sinWave.y holds sin(norm . wind_direction) with secondary frequency
  55. // sinWave.z hold cos(norm . wind_direction) with primary frequency
  56. sinWave.xyz = sinWave.xyz * gWindDir.w 
  57. + vec3(windEffect.w); // multiply by wind strength in gWindDir.w [-wind, wind]
  58. // add normal facing bias offset [-wind,wind] -> [-wind - .25, wind + 1]
  59. temp1 = vec4(dot(norm, gGravity.xyz)); // how much is this normal facing in direction of gGravity?
  60. temp1 = min(temp1, vec4(0.2,0.0,0.0,0.0)); // clamp [-1, 1] to [-1, 0.2]
  61. temp1 = temp1*vec4(1.5,0.0,0.0,0.0); // scale from [-1,0.2] to [-1.5, 0.3]
  62. sinWave.x = sinWave.x + temp1.x; // add gGravity effect to sinwave (only primary frequency)
  63. sinWave.xyz = sinWave.xyz * clothing.w; // modulate by clothing coverage
  64. sinWave.xyz = max(sinWave.xyz, vec3(-1.0, -1.0, -1.0)); // clamp to underlying body shape
  65. offsetPos = clothing * sinWave.x; // multiply wind effect times clothing displacement
  66. temp2 = gWindDir*sinWave.z + vec4(norm,0); // calculate normal offset due to wind oscillation
  67. offsetPos = vec4(1.0,1.0,1.0,0.0)*offsetPos+gl_Vertex; // add to offset vertex position, and zero out effect from w
  68. norm += temp2.xyz*2.0; // add sin wave effect on normals (exaggerated)
  69. //add "backlighting" effect
  70. float colorAcc;
  71. colorAcc = 1.0 - clothing.w;
  72. norm.z -= colorAcc * 0.2;
  73. //renormalize normal (again)
  74. norm = normalize(norm);
  75. pos.x = dot(trans[0], offsetPos);
  76. pos.y = dot(trans[1], offsetPos);
  77. pos.z = dot(trans[2], offsetPos);
  78. pos.w = 1.0;
  79. calcAtmospherics(pos.xyz);
  80. vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.0));
  81. gl_FrontColor = color; 
  82. gl_Position = gl_ProjectionMatrix * pos;
  83. gl_TexCoord[2] = vec4(pos.xyz, 1.0);
  84. }