UnityGame/Library/PackageCache/com.unity.rendering.light-transport/Runtime/UnifiedRayTracing/FetchGeometry.hlsl

124 lines
4.3 KiB
HLSL
Raw Normal View History

2024-10-27 10:53:47 +03:00
#ifndef _UNIFIEDRAYTRACING_FETCHGEOMETRY_HLSL_
#define _UNIFIEDRAYTRACING_FETCHGEOMETRY_HLSL_
#include "Packages/com.unity.rendering.light-transport/Runtime/UnifiedRayTracing/Common/GeometryPool/GeometryPoolDefs.cs.hlsl"
#include "Packages/com.unity.rendering.light-transport/Runtime/UnifiedRayTracing/Common/GeometryPool/GeometryPool.hlsl"
#include "Packages/com.unity.rendering.light-transport/Runtime/UnifiedRayTracing/Bindings.hlsl"
#define INTERPOLATE_ATTRIBUTE(attr, barCoords) v.attr = v0.attr * (1.0 - barCoords.x - barCoords.y) + v1.attr * barCoords.x + v2.attr * barCoords.y
StructuredBuffer<UnifiedRT::InstanceData> g_AccelStructInstanceList;
StructuredBuffer<uint> g_globalIndexBuffer;
StructuredBuffer<uint> g_globalVertexBuffer;
int g_globalVertexBufferStride;
StructuredBuffer<GeoPoolMeshChunk> g_MeshList;
namespace UnifiedRT {
namespace Internal {
GeoPoolVertex InterpolateVertices(GeoPoolVertex v0, GeoPoolVertex v1, GeoPoolVertex v2, float2 barycentricCoords)
{
GeoPoolVertex v;
INTERPOLATE_ATTRIBUTE(pos, barycentricCoords);
INTERPOLATE_ATTRIBUTE(N, barycentricCoords);
INTERPOLATE_ATTRIBUTE(uv0, barycentricCoords);
INTERPOLATE_ATTRIBUTE(uv1, barycentricCoords);
return v;
}
uint3 FetchTriangleIndices(GeoPoolMeshChunk meshInfo, uint triangleID)
{
return uint3(
g_globalIndexBuffer[meshInfo.indexOffset + 3 * triangleID],
g_globalIndexBuffer[meshInfo.indexOffset + 3 * triangleID + 1],
g_globalIndexBuffer[meshInfo.indexOffset + 3 * triangleID + 2]);
}
GeoPoolVertex FetchVertex(GeoPoolMeshChunk meshInfo, uint vertexIndex)
{
GeoPoolVertex v;
GeometryPool::LoadVertex(meshInfo.vertexOffset + (int)vertexIndex, 0, g_globalVertexBuffer, v);
return v;
}
}
static const uint kGeomAttribPosition = 1 << 0;
static const uint kGeomAttribNormal = 1 << 1;
static const uint kGeomAttribTexCoord0 = 1 << 4;
static const uint kGeomAttribTexCoord1 = 1 << 8;
static const uint kGeomAttribFaceNormal = 1 << 16;
static const uint kGeomAttribAll = 0xFFFFFFFF;
struct HitGeomAttributes
{
float3 position;
float3 normal;
float3 faceNormal;
float2 uv0;
float2 uv1;
};
HitGeomAttributes FetchHitGeomAttributes(int geometryIndex, int primitiveIndex, float2 uvBarycentrics, uint attributesToFetch = kGeomAttribAll)
{
HitGeomAttributes result = (HitGeomAttributes)0;
GeoPoolMeshChunk meshInfo = g_MeshList[geometryIndex];
uint3 triangleVertexIndices = Internal::FetchTriangleIndices(meshInfo, primitiveIndex);
GeoPoolVertex v0, v1, v2;
v0 = Internal::FetchVertex(meshInfo, triangleVertexIndices.x);
v1 = Internal::FetchVertex(meshInfo, triangleVertexIndices.y);
v2 = Internal::FetchVertex(meshInfo, triangleVertexIndices.z);
GeoPoolVertex v = Internal::InterpolateVertices(v0, v1, v2, uvBarycentrics);
if (attributesToFetch & kGeomAttribFaceNormal)
result.faceNormal = cross(v1.pos - v0.pos, v2.pos - v0.pos);
if (attributesToFetch & kGeomAttribPosition)
result.position = v.pos;
if (attributesToFetch & kGeomAttribNormal)
result.normal = v.N;
if (attributesToFetch & kGeomAttribTexCoord0)
result.uv0 = v.uv0;
if (attributesToFetch & kGeomAttribTexCoord1)
result.uv1 = v.uv1;
return result;
}
HitGeomAttributes FetchHitGeomAttributes(Hit hit, uint attributesToFetch = kGeomAttribAll)
{
int geometryIndex = g_AccelStructInstanceList[hit.instanceID].geometryIndex;
return FetchHitGeomAttributes(geometryIndex, hit.primitiveIndex, hit.uvBarycentrics, attributesToFetch);
}
HitGeomAttributes FetchHitGeomAttributesInWorldSpace(UnifiedRT::InstanceData instanceInfo, UnifiedRT::Hit hit)
{
UnifiedRT::HitGeomAttributes res = UnifiedRT::FetchHitGeomAttributes(hit);
HitGeomAttributes wsRes = res;
wsRes.position = mul(instanceInfo.localToWorld, float4(res.position, 1)).xyz;
wsRes.normal = normalize(mul((float3x3)instanceInfo.localToWorldNormals, res.normal));
wsRes.faceNormal = normalize(mul((float3x3)instanceInfo.localToWorldNormals, res.faceNormal));
return wsRes;
}
InstanceData GetInstance(uint instanceID)
{
return g_AccelStructInstanceList[instanceID];
}
} // namespace UnifiedRT
#endif // UNIFIEDRAYTRACING_FETCH_GEOMETRY_HLSL