SpineShaders.metal 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include <metal_stdlib>
  2. #include <simd/simd.h>
  3. using namespace metal;
  4. #if __has_include("spine-ios/Sources/SpineShadersStructs/SpineShadersStructs.h")
  5. // Cocoapods Target
  6. #include "spine-ios/Sources/SpineShadersStructs/SpineShadersStructs.h"
  7. #elif __has_include("../../SpineShadersStructs/SpineShadersStructs.h")
  8. // Swift Package target
  9. #include "../../SpineShadersStructs/SpineShadersStructs.h"
  10. #else
  11. #error "Header not found. Please correct Header search path"
  12. #endif
  13. struct RasterizerData {
  14. simd_float4 position [[position]];
  15. simd_float4 color;
  16. simd_float2 textureCoordinate;
  17. };
  18. vertex RasterizerData
  19. vertexShader(uint vertexID [[vertex_id]],
  20. constant SpineVertex *vertices [[buffer(SpineVertexInputIndexVertices)]],
  21. constant SpineTransform *transform [[buffer(SpineVertexInputIndexTransform)]],
  22. constant vector_uint2 *viewportSizePointer [[buffer(SpineVertexInputIndexViewportSize)]])
  23. {
  24. RasterizerData out;
  25. simd_float2 pixelSpacePosition = vertices[vertexID].position.xy;
  26. simd_float2 viewportSize = simd_float2(*viewportSizePointer);
  27. out.position = simd_float4(0.0, 0.0, 0.0, 1.0);
  28. out.position.xy = pixelSpacePosition;
  29. out.position.xy *= transform->scale;
  30. out.position.xy += transform->translation * transform->scale + transform->offset;
  31. out.position.xy /= viewportSize / 2;
  32. out.position.y *= -1;
  33. out.color = vertices[vertexID].color;
  34. out.textureCoordinate = vertices[vertexID].uv;
  35. return out;
  36. }
  37. fragment simd_float4
  38. fragmentShader(RasterizerData in [[stage_in]],
  39. texture2d<half> colorTexture [[ texture(SpineTextureIndexBaseColor) ]])
  40. {
  41. constexpr sampler textureSampler (mag_filter::nearest,
  42. min_filter::nearest);
  43. const half4 colorSample = colorTexture.sample(textureSampler, in.textureCoordinate);
  44. return simd_float4(colorSample) * in.color;
  45. }