Files
2026-07-13 13:13:17 +08:00

122 lines
2.7 KiB
HLSL

static const float3 Quad[] =
{
// xy front
float3(-1, -1, 1),
float3( 1, -1, 1),
float3( 1, 1, 1),
float3( 1, 1, 1),
float3(-1, 1, 1),
float3(-1, -1, 1),
// yz right
float3(1, -1, 1),
float3(1, -1, -1),
float3(1, 1, -1),
float3(1, 1, -1),
float3(1, 1, 1),
float3(1, -1, 1),
// xz top
float3(-1, 1, 1),
float3( 1, 1, 1),
float3( 1, 1, -1),
float3( 1, 1, -1),
float3(-1, 1, -1),
float3(-1, 1, 1),
// xy back
float3( 1, -1, -1),
float3(-1, -1, -1),
float3(-1, 1, -1),
float3(-1, 1, -1),
float3( 1, 1, -1),
float3( 1, -1, -1),
// yz left
float3(-1, -1, -1),
float3(-1, -1, 1),
float3(-1, 1, 1),
float3(-1, 1, 1),
float3(-1, 1, -1),
float3(-1, -1, -1),
// xz bottom
float3( 1, -1, -1),
float3( 1, -1, 1),
float3(-1, -1, 1),
float3(-1, -1, 1),
float3(-1, -1, -1),
float3( 1, -1, -1),
};
cbuffer Transforms : register(b0)
{
float4x4 CameraToClipSpace;
float4x4 ClipSpaceToCamera;
float4x4 WorldToCamera;
float4x4 CameraToWorld;
float4x4 WorldToClipSpace;
float4x4 ClipSpaceToWorld;
float4x4 ObjectToWorld;
float4x4 WorldToObject;
float4x4 ObjectToCamera;
float4x4 ObjectToClipSpace;
};
cbuffer Params : register(b1)
{
float4 Color;
float3 Size;
};
Texture3D<float4> VolumeTexture : register(t0);
sampler texSampler : register(s0);
struct vsOutput
{
float4 position : SV_POSITION;
float3 posInWorld : POSITION0;
float3 texCoord : TEXCOORD;
};
vsOutput vsMain(uint vertexId: SV_VertexID)
{
vsOutput output;
float3 quadVertex = Quad[vertexId].xyz;
float3 quadVertexInObject = quadVertex * Size * 0.5;
output.position = mul(float4(quadVertexInObject, 1), ObjectToClipSpace);
output.texCoord = Quad[vertexId]*float3(0.5, 0.5, 0.5) + 0.5;
output.posInWorld = mul(float4(quadVertexInObject, 1), ObjectToWorld);
return output;
}
float4 psMainOnlyColor(vsOutput input) : SV_TARGET
{
float3 uvw = input.texCoord;
const int NUM_SAMPLES = 25;
float4 vDir = float4(input.posInWorld - CameraToWorld[3].xyz, 0);
float3 viewDirInObject = mul(vDir, WorldToObject );
float3 sampleStep = normalize(viewDirInObject)/float(NUM_SAMPLES);
float3 c = 0.0;
float alpha = 0.0;
for (int i = 0; i < NUM_SAMPLES; i++) {
float3 s = VolumeTexture.Sample(texSampler, uvw);
float a = s*(1.0 - alpha);
c += s*a;
alpha += a;
if (alpha > 0.99)
break;
uvw += sampleStep;
if (max(max(uvw.x, uvw.y), uvw.z) > 1.0)
break;
if (min(min(uvw.x, uvw.y), uvw.z) < 0.0)
break;
}
// c = vDir;
// c = viewDirInObject;
c *= input.texCoord;
return float4(c , alpha);
return float4(c , 1);
}