procedural-3d-engine/shaders/hlsl/particlesystem/particle.frag

52 lines
1.4 KiB
GLSL
Raw Normal View History

// Copyright 2020 Google LLC
Texture2D textureSmoke : register(t1);
SamplerState samplerSmoke : register(s1);
Texture2D textureFire : register(t2);
SamplerState samplerFire : register(s2);
struct VSOutput
{
float4 Pos : SV_POSITION;
[[vk::location(0)]] float4 Color : COLOR0;
[[vk::location(1)]] float Alpha : TEXCOODR0;
[[vk::location(2)]] int Type : TEXCOODR1;
[[vk::location(3)]] float Rotation : TEXCOODR2;
[[vk::location(4)]] float2 CenterPos : POSITION1;
[[vk::location(5)]] float PointSize : TEXCOORD3;
};
float4 main (VSOutput input) : SV_TARGET
{
float4 color;
float alpha = (input.Alpha <= 1.0) ? input.Alpha : 2.0 - input.Alpha;
// Rotate texture coordinates
// Rotate UV
float rotCenter = 0.5;
float rotCos = cos(input.Rotation);
float rotSin = sin(input.Rotation);
float2 PointCoord = (input.Pos.xy - input.CenterPos.xy) / input.PointSize + 0.5;
float2 rotUV = float2(
rotCos * (PointCoord.x - rotCenter) + rotSin * (PointCoord.y - rotCenter) + rotCenter,
rotCos * (PointCoord.y - rotCenter) - rotSin * (PointCoord.x - rotCenter) + rotCenter);
float4 outFragColor;
if (input.Type == 0)
{
// Flame
color = textureFire.Sample(samplerFire, rotUV);
outFragColor.a = 0.0;
}
else
{
// Smoke
color = textureSmoke.Sample(samplerSmoke, rotUV);
outFragColor.a = color.a * alpha;
}
outFragColor.rgb = color.rgb * input.Color.rgb * alpha;
return outFragColor;
}