39 lines
1.3 KiB
HLSL
39 lines
1.3 KiB
HLSL
#include "bindless_structs.hlsli"
|
|
|
|
/*
|
|
The Goal is simply to convert from a (0,0,0) to (CubeSide, CubeSide, FaceCount) Invocation ID space to a
|
|
(-1,-1,-1) to (1, 1, 1) space.
|
|
|
|
| Axis | Layer | Up |
|
|
|:----:|:-----:|:--:|
|
|
| +x | 0 | -y |
|
|
| -x | 1 | -y |
|
|
| +y | 2 | +z |
|
|
| -y | 3 | -z |
|
|
| -z | 4 | -y |
|
|
| +z | 5 | -y |
|
|
*/
|
|
float3 GetCubeDir(uint3 GlobalInvocationID, float SideLength)
|
|
{
|
|
float2 FaceUV = float2(GlobalInvocationID.xy) / SideLength; // (0, SideLength) -> (0, 1)
|
|
FaceUV = 2.0f * FaceUV - 1.0f; // (0, 1) -> (-1, 1)
|
|
|
|
switch (GlobalInvocationID.z)
|
|
{
|
|
case 0:
|
|
return normalize(float3(1.0f, -FaceUV.y, -FaceUV.x)); // Face +X; x = 1, y = -v, z = -u
|
|
case 1:
|
|
return normalize(float3(-1.0f, -FaceUV.y, FaceUV.x)); // Face -X; x = -1, y = -v, z = u
|
|
case 2:
|
|
return normalize(float3(FaceUV.x, 1.0f, FaceUV.y)); // Face +Y; x = u, y = 1, z = v
|
|
case 3:
|
|
return normalize(float3(FaceUV.x, -1.0f, -FaceUV.y)); // Face -Y; x=u, y=-1, z=-v
|
|
case 4:
|
|
return normalize(float3(FaceUV.x, -FaceUV.y, 1.0f)); // Face +Z; x=u,y=-v, z=1
|
|
case 5:
|
|
return normalize(float3(-FaceUV.x, -FaceUV.y, -1.0f)); // Face -Z; x=u,y=-v, z=-1
|
|
default:
|
|
// Never reach here.
|
|
return 0.0f.xxx;
|
|
}
|
|
} |