146 lines
3.6 KiB
HLSL
146 lines
3.6 KiB
HLSL
#include "shared/hash-functions.hlsl"
|
|
#include "shared/point.hlsl"
|
|
#include "shared/quat-functions.hlsl"
|
|
#include "shared/pbr.hlsl"
|
|
#include "shared/bias-functions.hlsl"
|
|
|
|
/*{ADDITIONAL_INCLUDES}*/
|
|
|
|
cbuffer Params : register(b0)
|
|
{
|
|
/*{FLOAT_PARAMS}*/
|
|
}
|
|
|
|
cbuffer FloatParams : register(b1)
|
|
{
|
|
float Amount;
|
|
float NormalSamplingDistance;
|
|
float SpeedFactor;
|
|
float A;
|
|
|
|
float3 Offset;
|
|
float B;
|
|
|
|
float C;
|
|
float D;
|
|
float2 GainAndBias;
|
|
|
|
float4 Color;
|
|
|
|
float TimeInSec;
|
|
}
|
|
|
|
cbuffer IntParams : register(b2)
|
|
{
|
|
uint ParticleCount;
|
|
int EnableBounce;
|
|
int ApplyColorOnCollision;
|
|
}
|
|
|
|
|
|
cbuffer Transforms : register(b3)
|
|
{
|
|
float4x4 CameraToClipSpace;
|
|
float4x4 ClipSpaceToCamera;
|
|
float4x4 WorldToCamera;
|
|
float4x4 CameraToWorld;
|
|
float4x4 WorldToClipSpace;
|
|
float4x4 ClipSpaceToWorld;
|
|
float4x4 ObjectToWorld;
|
|
float4x4 WorldToObject;
|
|
float4x4 ObjectToCamera;
|
|
float4x4 ObjectToClipSpace;
|
|
};
|
|
|
|
Texture2D<float4> Gradient : register(t0);
|
|
Texture2D<float4> Image : register(t1);
|
|
RWStructuredBuffer<Particle> Particles : register(u0);
|
|
|
|
sampler ClampedSampler : s0;
|
|
sampler WrappedSampler : s1;
|
|
|
|
//=== Additional Resources ==========================================
|
|
/*{RESOURCES(t2)}*/
|
|
|
|
//=== Global functions ==============================================
|
|
/*{GLOBALS}*/
|
|
|
|
//=== Field functions ===============================================
|
|
/*{FIELD_FUNCTIONS}*/
|
|
//-------------------------------------------------------------------
|
|
|
|
float4 GetField(float4 p)
|
|
{
|
|
float4 f = 1;
|
|
/*{FIELD_CALL}*/
|
|
return f;
|
|
}
|
|
|
|
inline float GetDistance(float3 p3)
|
|
{
|
|
return GetField(float4(p3.xyz, 0)).w;
|
|
}
|
|
|
|
//===================================================================
|
|
|
|
//- DEFINES ------------------------------------
|
|
/*{defines}*/
|
|
//----------------------------------------------
|
|
|
|
float3 GetNormal(float3 p, float offset=0.001)
|
|
{
|
|
return normalize(
|
|
GetDistance(p + float3(offset, -offset, -offset)) * float3(1, -1, -1) +
|
|
GetDistance(p + float3(-offset, offset, -offset)) * float3(-1, 1, -1) +
|
|
GetDistance(p + float3(-offset, -offset, offset)) * float3(-1, -1, 1) +
|
|
GetDistance(p + float3(offset, offset, offset)) * float3(1, 1, 1));
|
|
}
|
|
|
|
float4 q_from_tangentAndNormal(float3 dx, float3 dz)
|
|
{
|
|
dx = normalize(dx);
|
|
dz = normalize(dz);
|
|
float3 dy = -cross(dx, dz);
|
|
|
|
float3x3 orientationDest = float3x3(
|
|
dx,
|
|
dy,
|
|
dz);
|
|
|
|
return normalize(qFromMatrix3Precise(transpose(orientationDest)));
|
|
}
|
|
|
|
float Biased(float f){return ApplyGainAndBias(f, GainAndBias);}
|
|
float4 SampleGradient(float f){return Gradient.SampleLevel(ClampedSampler, float2(f, 0.5), 0);}
|
|
|
|
inline float2 PositionToScreenSpaceUv(float3 p){
|
|
float4 vp=mul(float4(p.xyz,1),WorldToClipSpace);
|
|
return 0.5+0.5*float2(1,-1)*vp.xy/vp.w;
|
|
}
|
|
|
|
[numthreads(64, 1, 1)] void main(uint3 i : SV_DispatchThreadID)
|
|
{
|
|
uint maxParticleCount, _;
|
|
Particles.GetDimensions(maxParticleCount, _);
|
|
uint idx = i.x;
|
|
if (idx >= maxParticleCount)
|
|
return;
|
|
|
|
Particle p = Particles[idx];
|
|
float3 vel=p.Velocity;
|
|
float3 pos=p.Position; // Warning: avoid setting this, because it without applying SpeedFactor
|
|
float4 col=p.Color;
|
|
float age= TimeInSec - p.BirthTime;
|
|
float2 uv = PositionToScreenSpaceUv(pos);
|
|
|
|
{
|
|
//- METHOD -------------------------------------
|
|
/*{method}*/
|
|
//----------------------------------------------
|
|
}
|
|
|
|
Particles[idx].Velocity = lerp(Particles[idx].Velocity, vel, Amount);
|
|
Particles[idx].Color = lerp(Particles[idx].Color, col, Amount);
|
|
Particles[idx].Position = lerp(Particles[idx].Position, pos, Amount);
|
|
}
|