metal-examples-tutorials/particles/particle3.playground/Resources/Shaders.metal

36 lines
1.2 KiB
Metal

#include <metal_stdlib>
using namespace metal;
struct Particle {
float2 position;
float2 velocity;
};
kernel void firstPass(texture2d<half, access::write> output [[texture(0)]],
uint2 id [[thread_position_in_grid]]) {
output.write(half4(0., 0., 0., 1.), id);
}
kernel void secondPass(texture2d<half, access::write> output [[texture(0)]],
device Particle *particles [[buffer(0)]],
uint id [[thread_position_in_grid]]) {
Particle particle = particles[id];
float2 position = particle.position;
float2 velocity = particle.velocity;
int width = output.get_width();
int height = output.get_height();
if (position.x < 0 || position.x > width) { velocity.x *= -1; }
if (position.y < 0 || position.y > height) { velocity.y *= -1; }
position += velocity;
particle.position = position;
particle.velocity = velocity;
particles[id] = particle;
uint2 pos = uint2(position.x, position.y);
output.write(half4(1.), pos);
output.write(half4(1.), pos + uint2( 1, 0));
output.write(half4(1.), pos + uint2( 0, 1));
output.write(half4(1.), pos - uint2( 1, 0));
output.write(half4(1.), pos - uint2( 0, 1));
}