crowdVp.glsl
上传用户:xhbjoy
上传日期:2014-10-07
资源大小:38068k
文件大小:1k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. uniform mat4 viewProjectionMatrix;
  2. uniform float numBones;
  3. uniform vec4 worldMatrix3x4Array[240];
  4. uniform vec4 lightDiffuseColour;
  5. uniform vec4 ambient;
  6. uniform vec4 lightPos;
  7. attribute vec4 blendIndices;
  8. attribute vec4 blendWeights;
  9. void main()
  10. {
  11. vec3 blendPos = vec3(0,0,0);
  12. vec3 blendNorm = vec3(0,0,0);
  13. vec3 tmpPos = vec3(0,0,0);
  14. vec3 tmpNorm = vec3(0,0,0);
  15. int instanceOffset = int(gl_MultiTexCoord1.x) * 3 * int(numBones);
  16. for (int bone = 0; bone < 2; ++bone)
  17. {
  18. // perform matrix multiplication manually since no 3x4 matrices
  19. for (int row = 0; row < 3; ++row)
  20. {
  21.     int idx = instanceOffset + int(blendIndices[bone]) * 3 + row;
  22. vec4 blendMatrixRow = worldMatrix3x4Array[idx];
  23. tmpPos[row] = dot(blendMatrixRow, gl_Vertex);
  24. #if SHADOW_CASTER
  25. #else
  26. tmpNorm[row] = dot(blendMatrixRow.xyz, gl_Normal);
  27. #endif
  28. }
  29. // now weight this into final 
  30. blendPos += tmpPos * blendWeights[bone];
  31. #if SHADOW_CASTER
  32. #else
  33. blendNorm += tmpNorm * blendWeights[bone];
  34. #endif
  35. }
  36. // apply view / projection to position
  37. gl_Position = viewProjectionMatrix * vec4(blendPos, 1);
  38. #if SHADOW_CASTER
  39. gl_FrontColor = ambient;
  40. #else
  41. // simple lighting model
  42. vec3 lightDir = normalize(
  43. lightPos.xyz -  (blendPos.xyz * lightPos.w));
  44. gl_FrontColor = ambient 
  45. + clamp(dot(lightDir, blendNorm), 0.0, 1.0) * lightDiffuseColour;
  46. #endif
  47.     gl_FrontSecondaryColor = vec4(0);
  48. gl_TexCoord[0] = gl_MultiTexCoord0;
  49. }