You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
3.5 KiB
91 lines
3.5 KiB
#include "Packages/com.unity.visualeffectgraph/Shaders/VFXRayTracingCommon.hlsl"
|
|
|
|
void GetVFXInstancingIndices(out uint index, out uint instanceIndex, out uint instanceActiveIndex)
|
|
{
|
|
#ifdef VFX_RT_DECIMATION_FACTOR
|
|
int rayTracingDecimationFactor = VFX_RT_DECIMATION_FACTOR;
|
|
#else
|
|
int rayTracingDecimationFactor = 1;
|
|
#endif
|
|
index = PrimitiveIndex() * rayTracingDecimationFactor;
|
|
instanceIndex = asuint(UNITY_ACCESS_INSTANCED_PROP(PerInstance, _InstanceIndex));
|
|
instanceActiveIndex = asuint(UNITY_ACCESS_INSTANCED_PROP(PerInstance, _InstanceActiveIndex));
|
|
VFXGetInstanceCurrentIndex(index);
|
|
}
|
|
|
|
float GetVFXVertexDisplacement(int index, float3 currentWS, float3 inputVertexPosition, uint currentFrameIndex)
|
|
{
|
|
float displacement = 0.0;
|
|
#if VFX_FEATURE_MOTION_VECTORS
|
|
uint elementToVFXBaseIndex = index * 13;
|
|
uint previousFrameIndex = elementToVFXBufferPrevious.Load(elementToVFXBaseIndex++ << 2);
|
|
if (currentFrameIndex - previousFrameIndex == 1u) //if (dot(previousElementToVFX[0], 1) != 0)
|
|
{
|
|
float4x4 previousElementToVFX = (float4x4)0;
|
|
previousElementToVFX[3] = float4(0,0,0,1);
|
|
UNITY_UNROLL
|
|
for (int itIndexMatrixRow = 0; itIndexMatrixRow < 3; ++itIndexMatrixRow)
|
|
{
|
|
uint4 read = elementToVFXBufferPrevious.Load4((elementToVFXBaseIndex + itIndexMatrixRow * 4) << 2);
|
|
previousElementToVFX[itIndexMatrixRow] = asfloat(read);
|
|
}
|
|
float3 previousWS = TransformPreviousVFXPositionToWorld(mul(previousElementToVFX, float4(inputVertexPosition, 1.0f)).xyz);
|
|
displacement = length(currentWS - previousWS);
|
|
}
|
|
#endif
|
|
return displacement;
|
|
}
|
|
|
|
void BuildFragInputsFromVFXIntersection(AttributeData attributeData, out FragInputs output, out uint outCurrentFrameIndex)
|
|
{
|
|
uint index, instanceIndex, instanceActiveIndex;
|
|
GetVFXInstancingIndices(index, instanceIndex, instanceActiveIndex);
|
|
#if VFX_USE_GRAPH_VALUES
|
|
$splice(VFXLoadGraphValues)
|
|
#endif
|
|
|
|
InternalAttributesElement attributes;
|
|
ZERO_INITIALIZE(InternalAttributesElement, attributes);
|
|
$splice(VFXLoadAttribute)
|
|
$splice(VFXProcessBlocks)
|
|
|
|
float3 size3 = GetElementSizeRT(attributes
|
|
#if VFX_USE_GRAPH_VALUES
|
|
, graphValues
|
|
#endif
|
|
);
|
|
|
|
float3 rayDirection = WorldRayDirection();
|
|
output.positionSS = float4(0.0, 0.0, 0.0, 0.0);
|
|
output.positionRWS = WorldRayOrigin() + rayDirection * RayTCurrent();
|
|
output.texCoord0 = float4(attributeData.barycentrics,0,0);
|
|
output.texCoord1 = float4(attributeData.barycentrics,0,0);
|
|
output.texCoord2 = float4(attributeData.barycentrics,0,0);
|
|
output.texCoord3 = float4(attributeData.barycentrics,0,0);
|
|
|
|
#if VFX_USE_COLOR_CURRENT
|
|
float3 color = attributes.color;
|
|
#else
|
|
float3 color = float3(1,1,1);
|
|
#endif
|
|
#if VFX_USE_ALPHA_CURRENT
|
|
float alpha = attributes.alpha;
|
|
#else
|
|
float alpha = 1;
|
|
#endif
|
|
output.color = float4(color, alpha);
|
|
|
|
// Compute the world space normal
|
|
float3 normalWS = normalize(-WorldToPrimitive(attributes, size3)[2].xyz);
|
|
float3 tangentWS = normalize(WorldToPrimitive(attributes, size3)[0].xyz);
|
|
output.tangentToWorld = CreateTangentToWorld(normalWS, tangentWS, /*sign(currentVertex.tangentOS.w)*/1);
|
|
|
|
output.isFrontFace = dot(rayDirection, output.tangentToWorld[2]) < 0.0f;
|
|
|
|
$splice(VFXSetFragInputsRT)
|
|
|
|
#if VFX_FEATURE_MOTION_VECTORS
|
|
$splice(VFXLoadCurrentFrameIndexParameter)
|
|
outCurrentFrameIndex = currentFrameIndex;
|
|
#endif
|
|
}
|