载入中...
搜索中...
未找到
VolumetricWgsl.h
浏览该文件的文档.
1#pragma once
2
4inline constexpr const char *kVolCommon=R"wgsl(
5struct FSIn{@location(0) color:vec4f,@location(1) uv:vec2f};struct U{data:array<vec4f,8>};
6@group(0) @binding(0)var mainTex:texture_2d<f32>;@group(0) @binding(1)var depthTex:texture_2d<f32>;@group(0) @binding(2)var samp:sampler;@group(0) @binding(4)var<uniform>u:U;
7fn p(i:u32)->f32{return u.data[i/4u][i%4u];}fn tex(uv:vec2f)->vec4f{return textureSampleLevel(mainTex,samp,clamp(uv,vec2f(0),vec2f(1)),0);}
8)wgsl";
9inline constexpr const char *kVolScreen=R"wgsl(
10fn spotAtten(uv:vec2f,light:vec2f,beam:vec2f,cosO:f32,cosI:f32)->f32{if cosO<=-1.5{return 1.0;}let fromL=uv-light;let fl=length(fromL);if fl<=1e-4{return 1.0;}let bl=length(beam);if bl<=1e-6{return 0.0;}return smoothstep(cosO,cosI,dot(fromL/fl,beam/bl));}
11@fragment fn fs_main(i:FSIn)->@location(0)vec4f{let light=vec2f(p(0),p(1));let count=i32(clamp(p(6),1,96));let delta=(i.uv-light)*p(4)/f32(count);var uv=i.uv;var illum=vec3f(0);var decay=1.0;
12for(var q=0;q<96;q++){if q>=count{break;}uv-=delta;illum+=tex(uv).rgb*decay*p(5);decay*=p(3);}let fog=vec3f(p(9),p(10),p(11))*max(p(8),0);let shaft=vec3f(p(12),p(13),p(14));var rgb=(illum*shaft*p(2)+fog)*max(p(17),0);rgb*=spotAtten(i.uv,light,vec2f(p(18),p(19)),p(20),p(21));return vec4f(rgb,clamp(max(rgb.r,max(rgb.g,rgb.b)),0,1))*i.color;}
13)wgsl";
14inline constexpr const char *kVolRay=R"wgsl(
15fn hg(c:f32,g:f32)->f32{let g2=g*g;return (1-g2)/(12.566*pow(max(1e-4,1+g2-2*g*c),1.5));}
16@fragment fn fs_main(i:FSIn)->@location(0)vec4f{let z=tex(i.uv).r;if z>=.999{return vec4f(0);}let d=max(p(19),0);let c=vec3f(p(20),p(21),p(22));let light=normalize(vec3f(p(16),p(17),p(18)));let pack=p(29);var g=select(0.6,clamp(fract(pack)*1.98-0.99,-0.99,0.99),fract(pack)>1e-5);let phase=mix(hg(light.y,g*-0.5),hg(light.y,g),0.75);let a=clamp((1-z)*d*max(p(23),0)*(1+max(p(28),0))*phase*.55,0,.9);return vec4f(c*phase,a)*i.color;}
17)wgsl";
18inline constexpr const char *kVolFog=R"wgsl(
19@fragment fn fs_main(i:FSIn)->@location(0)vec4f{let z=tex(i.uv).r;if z>=.999{return vec4f(0);}let start=max(p(29),0);let end=max(p(30),start+.001);let dist=mix(max(p(24),.001),max(p(25),1),z);let range=smoothstep(start,end,dist);let height=mix(.65,1.0,clamp(i.uv.y,0,1));let a=clamp(range*max(p(19),0)*max(p(23),0)*height,0,.95);return vec4f(vec3f(p(20),p(21),p(22)),a)*i.color;}
20)wgsl";
21inline constexpr const char *kVolCloud=R"wgsl(
22fn hash(q:vec2f)->f32{return fract(sin(dot(q,vec2f(12.9898,78.233)))*43758.5453);}
23@fragment fn fs_main(i:FSIn)->@location(0)vec4f{let uv=i.uv+vec2f(p(25),p(26))*p(19)*.0002;let n=hash(floor(uv*max(p(24),1)));let cov=clamp(p(22),0,1);let density=max(p(23),0);let a=smoothstep(1-cov,1,n)*density*.7;let light=vec3f(p(29),p(30),p(31));return vec4f(light,a)*i.color;}
24)wgsl";
25inline constexpr const char *kVolFroxel=R"wgsl(
26@fragment fn fs_main(i:FSIn)->@location(0)vec4f{let cols=max(p(0),1);let rows=max(p(1),1);let slices=max(p(2),1);let tile=vec2f(1/cols,1/rows);var acc=vec4f(0);let count=i32(clamp(slices,1,64));for(var q=0;q<64;q++){if q>=count{break;}let f=f32(q);let cell=vec2f(f-floor(f/cols)*cols,floor(f/cols));let s=tex(cell*tile+i.uv*tile);acc.rgb+=s.rgb*(1-acc.a);acc.a+=s.a*(1-acc.a);}return acc*i.color;}
27)wgsl";
28inline constexpr char kVolDirectionalCookie[]=R"wgsl(
29fn world(m:mat4x4f,uv:vec2f,z:f32)->vec3f{let h=m*vec4f(uv*2-1,z,1);return h.xyz/max(h.w,.000001);}
30@fragment fn fs_main(i:FSIn)->@location(0)vec4f{let z=textureSampleLevel(depthTex,samp,i.uv,0).r;if z<=.00001||z>=.99999{return vec4f(0);}let m=mat4x4f(u.data[0],u.data[1],u.data[2],u.data[3]);let w=world(m,i.uv,z);let l=normalize(vec3f(p(18),p(19),p(20))+vec3f(.000001));let h=select(vec3f(1,0,0),vec3f(0,1,0),abs(l.y)<.99);let a=normalize(cross(h,l));let b=normalize(cross(l,a));let uv=fract(vec2f(dot(w,a),dot(w,b))/max(p(16),.001)+.5);let ra=1-abs(sin((uv.x+.28*sin(uv.y*12))*19));let rb=1-abs(sin((uv.y+.24*sin(uv.x*15))*23));let proc=.12+.88*pow(max(ra,rb),5);let c=max(tex(uv).rgb,vec3f(proc));let alpha=clamp(max(c.r,max(c.g,c.b))*max(p(17),0),0,1);return vec4f(c*i.color.rgb,alpha*i.color.a);}
31)wgsl";
32} // namespace eve::graphics::shaders
constexpr const char * kVolScreen
constexpr const char * kVolCommon
constexpr const char * kVolRay
constexpr const char * kVolCloud
constexpr char kVolDirectionalCookie[]
constexpr const char * kVolFroxel
constexpr const char * kVolFog