shader.rs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. use miniquad::*;
  2. pub const GL_VERTEX: &str = r#"#version 100
  3. attribute vec2 in_pos;
  4. attribute vec4 in_color;
  5. attribute vec2 in_uv;
  6. varying lowp vec4 color;
  7. varying lowp vec2 uv;
  8. uniform mat4 Projection;
  9. uniform mat4 Model;
  10. void main() {
  11. gl_Position = Projection * Model * vec4(in_pos, 0, 1);
  12. color = in_color;
  13. uv = in_uv;
  14. }"#;
  15. pub const GL_FRAGMENT: &str = r#"#version 100
  16. varying lowp vec4 color;
  17. varying lowp vec2 uv;
  18. uniform sampler2D tex;
  19. void main() {
  20. gl_FragColor = color * texture2D(tex, uv);
  21. }"#;
  22. pub const METAL: &str = r#"
  23. #include <metal_stdlib>
  24. using namespace metal;
  25. struct Uniforms
  26. {
  27. float4x4 Projection;
  28. float4x4 Model;
  29. };
  30. struct Vertex
  31. {
  32. float2 in_pos [[attribute(0)]];
  33. float4 in_color [[attribute(1)]];
  34. float2 in_uv [[attribute(2)]];
  35. };
  36. struct RasterizerData
  37. {
  38. float4 position [[position]];
  39. float4 color [[user(locn0)]];
  40. float2 uv [[user(locn1)]];
  41. };
  42. vertex RasterizerData vertexShader(Vertex v [[stage_in]])
  43. {
  44. RasterizerData out;
  45. out.position = uniforms.Model * uniforms.Projection * float4(v.in_pos.xy, 0.0, 1.0);
  46. out.color = v.in_color;
  47. out.uv = v.texcoord;
  48. return out;
  49. }
  50. fragment float4 fragmentShader(RasterizerData in [[stage_in]], texture2d<float> tex [[texture(0)]], sampler texSmplr [[sampler(0)]])
  51. {
  52. return in.color * tex.sample(texSmplr, in.uv);
  53. }
  54. "#;
  55. pub fn meta() -> ShaderMeta {
  56. ShaderMeta {
  57. images: vec!["tex".to_string()],
  58. uniforms: UniformBlockLayout { uniforms: vec![] },
  59. }
  60. }