9b4defe202
Support flattening StorageOutput & StorageInput matrices and arrays. No longer move matrix & array inputs to separate buffer. Add separate SPIRFunction::fixup_statements_in & SPIRFunction::fixup_statements_out instead of just SPIRFunction::fixup_statements. Emit SPIRFunction::fixup_statements at beginning of functions. CompilerMSL track vars_needing_early_declaration. Pass global output variables as variables to functions that access them. Sort input structs by location, same as output structs. Emit struct declarations in order output, input, uniforms. Regenerate reference shaders to new formats defined by above.
55 lines
1.0 KiB
GLSL
55 lines
1.0 KiB
GLSL
#include <metal_stdlib>
|
|
#include <simd/simd.h>
|
|
|
|
using namespace metal;
|
|
|
|
struct Light
|
|
{
|
|
packed_float3 Position;
|
|
float Radius;
|
|
float4 Color;
|
|
};
|
|
|
|
struct UBO
|
|
{
|
|
float4x4 uMVP;
|
|
Light lights[4];
|
|
};
|
|
|
|
struct Light_1
|
|
{
|
|
float3 Position;
|
|
float Radius;
|
|
float4 Color;
|
|
};
|
|
|
|
struct main0_out
|
|
{
|
|
float4 vColor [[user(locn0)]];
|
|
float4 gl_Position [[position]];
|
|
};
|
|
|
|
struct main0_in
|
|
{
|
|
float4 aVertex [[attribute(0)]];
|
|
float3 aNormal [[attribute(1)]];
|
|
};
|
|
|
|
vertex main0_out main0(main0_in in [[stage_in]], constant UBO& _21 [[buffer(0)]])
|
|
{
|
|
main0_out out = {};
|
|
out.gl_Position = _21.uMVP * in.aVertex;
|
|
out.vColor = float4(0.0);
|
|
for (int i = 0; i < 4; i++)
|
|
{
|
|
Light_1 light;
|
|
light.Position = _21.lights[i].Position;
|
|
light.Radius = _21.lights[i].Radius;
|
|
light.Color = _21.lights[i].Color;
|
|
float3 L = in.aVertex.xyz - light.Position;
|
|
out.vColor += ((_21.lights[i].Color * clamp(1.0 - (length(L) / light.Radius), 0.0, 1.0)) * dot(in.aNormal, normalize(L)));
|
|
}
|
|
return out;
|
|
}
|
|
|