31 lines
872 B
Plaintext
31 lines
872 B
Plaintext
import bindless;
|
|
import ibl_common;
|
|
|
|
float2 SampleSphericalMap(float3 v)
|
|
{
|
|
const float2 InvTan = float2(0.1591f, 0.3183f); // (1/2PI, 1/PI)
|
|
float2 UV = float2(atan2(-v.x, v.z), asin(-v.y)); // (-PI, -PI/2) to (PI, PI/2)
|
|
UV *= InvTan; // (-1/2, -1/2) to (1/2, 1/2)
|
|
UV += 0.5f.xx; // (0, 0) to (1, 1)
|
|
return UV;
|
|
}
|
|
|
|
struct Block {
|
|
Sampler2D<float4>.Handle hdrEnv;
|
|
RWTexture2DArray<float4>.Handle outputTexture;
|
|
uint cubeSide;
|
|
};
|
|
|
|
[shader("compute")]
|
|
[numthreads(16, 16, 1)]
|
|
void main(
|
|
uint3 GlobalInvocationID: SV_DispatchThreadID,
|
|
uniform Block pcb
|
|
)
|
|
{
|
|
float3 LocalDir = GetCubeDir(GlobalInvocationID, pcb.cubeSide);
|
|
|
|
float2 UV = SampleSphericalMap(LocalDir);
|
|
|
|
pcb.outputTexture[GlobalInvocationID.xyz] = pcb.hdrEnv.SampleLevel(UV, 0);
|
|
} |