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

游戏引擎

开发平台:

Visual C++

  1. // Example GLSL program for skinning with two bone weights per vertex
  2. attribute vec4 blendIndices;
  3. attribute vec4 blendWeights;
  4. // 3x4 matrix, passed as vec4's for compatibility with GL 2.0
  5. // GL 2.0 supports 3x4 matrices
  6. // Support 24 bones ie 24*3, but use 72 since our parser can pick that out for sizing
  7. uniform vec4 worldMatrix3x4Array[72];
  8. uniform mat4 viewProjectionMatrix;
  9. uniform vec4 lightPos[2];
  10. uniform vec4 lightDiffuseColour[2];
  11. void main()
  12. {
  13. vec3 blendPos = vec3(0,0,0);
  14. vec3 blendNorm = vec3(0,0,0);
  15. for (int bone = 0; bone < 2; ++bone)
  16. {
  17. // perform matrix multiplication manually since no 3x4 matrices
  18.         // ATI GLSL compiler can't handle indexing an array within an array so calculate the inner index first
  19.     int idx = int(blendIndices[bone]) * 3;
  20.         // ATI GLSL compiler can't handle unrolling the loop so do it manually
  21.         // ATI GLSL has better performance when mat4 is used rather than using individual dot product
  22.         // There is a bug in ATI mat4 constructor (Cat 7.2) when indexed uniform array elements are used as vec4 parameter so manually assign
  23. mat4 worldMatrix;
  24. worldMatrix[0] = worldMatrix3x4Array[idx];
  25. worldMatrix[1] = worldMatrix3x4Array[idx + 1];
  26. worldMatrix[2] = worldMatrix3x4Array[idx + 2];
  27. worldMatrix[3] = vec4(0);
  28. // now weight this into final 
  29.     float weight = blendWeights[bone];
  30. blendPos += (gl_Vertex * worldMatrix).xyz * weight;
  31. mat3 worldRotMatrix = mat3(worldMatrix[0].xyz, worldMatrix[1].xyz, worldMatrix[2].xyz);
  32. blendNorm += (gl_Normal * worldRotMatrix) * weight;
  33. }
  34. // apply view / projection to position
  35. gl_Position = viewProjectionMatrix * vec4(blendPos, 1);
  36. // simple vertex lighting model
  37. vec3 lightDir0 = normalize(
  38. lightPos[0].xyz -  (blendPos.xyz * lightPos[0].w));
  39. vec3 lightDir1 = normalize(
  40. lightPos[1].xyz -  (blendPos.xyz * lightPos[1].w));
  41. gl_FrontSecondaryColor = vec4(0);
  42. gl_FrontColor = vec4(0.5, 0.5, 0.5, 1.0) 
  43. + clamp(dot(lightDir0, blendNorm), 0.0, 1.0) * lightDiffuseColour[0]
  44. + clamp(dot(lightDir1, blendNorm), 0.0, 1.0) * lightDiffuseColour[1];
  45. gl_TexCoord[0] = gl_MultiTexCoord0;
  46. }