Parallax.hx 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package h3d.shader;
  2. class Parallax extends hxsl.Shader {
  3. static var SRC = {
  4. @param var amount : Float;
  5. @param var heightMap : Channel;
  6. @:import BaseMesh;
  7. @const var minLayers : Int = 6;
  8. @const var maxLayers : Int = 24;
  9. var vertexTransformedNormal : Vec3;
  10. var transformedTangent : Vec4;
  11. var calculatedUV : Vec2;
  12. function vertex() {
  13. vertexTransformedNormal = transformedNormal;
  14. }
  15. function fragment() {
  16. var viewWS = (camera.position - transformedPosition).normalize();
  17. var viewNS : Vec3;
  18. {
  19. var n = vertexTransformedNormal.normalize();
  20. var tanX = transformedTangent.xyz.normalize();
  21. var tanY = n.cross(tanX);
  22. viewNS = vec3(viewWS.dot(tanX), viewWS.dot(tanY), viewWS.dot(n)).normalize();
  23. }
  24. if( maxLayers == 0 )
  25. calculatedUV += viewNS.xy * heightMap.get(calculatedUV) * amount;
  26. else {
  27. var numLayers = mix(float(maxLayers), float(minLayers), abs(viewNS.z));
  28. var layerDepth = 1 / numLayers;
  29. var curLayerDepth = 0.;
  30. var delta = (viewNS.xy / viewNS.z) * amount / numLayers;
  31. var curUV = calculatedUV;
  32. var curDepth = heightMap.getLod(curUV,0.);
  33. while( curLayerDepth < curDepth ) {
  34. curUV += delta;
  35. curDepth = heightMap.getLod(curUV,0.);
  36. curLayerDepth += layerDepth;
  37. }
  38. var prevUV = curUV - delta;
  39. var after = curDepth - curLayerDepth;
  40. var before = heightMap.get(prevUV) - curLayerDepth + layerDepth;
  41. calculatedUV = mix(curUV, prevUV, after / (after - before));
  42. }
  43. }
  44. }
  45. }