载入中...
搜索中...
未找到
StylizeWgsl.h
浏览该文件的文档.
1#pragma once
2
4inline constexpr const char *kCommon = R"wgsl(
5struct In{@location(0) color:vec4f,@location(1) uv:vec2f};struct Params{data:array<vec4f,8>};
6@group(0) @binding(0)var mainTex:texture_2d<f32>;@group(0) @binding(2)var samp:sampler;@group(0) @binding(4)var<uniform> params:Params;
7fn p(i:u32)->f32{return params.data[i/4u][i%4u];}fn sampleTex(uv:vec2f)->vec4f{return textureSampleLevel(mainTex,samp,clamp(uv,vec2f(0),vec2f(1)),0);}fn lum(c:vec3f)->f32{return dot(c,vec3f(.2126,.7152,.0722));}
8fn objectMask(c:vec3f)->f32{let y=lum(c);let sat=length(c-vec3f(y));let bg=(1-smoothstep(.10,.26,y))*(1-smoothstep(.025,.09,sat));return clamp(1-bg,0,1);}
9)wgsl";
10inline constexpr const char *kCartoon = R"wgsl(
11@fragment fn fs_main(i:In)->@location(0) vec4f{let src=sampleTex(i.uv)*i.color;let bands=max(p(0),2);let obj=objectMask(src.rgb);var c=src.rgb;if(obj>.05){let mapped=clamp(c/(c+vec3f(.55))*1.45,vec3f(0),vec3f(1));let y=max(lum(mapped),.0001);let band=min(max(floor(y*bands+.0001)/max(bands-1,1),.5/bands),.88);c=mapped*(band/y);let q=max(p(3),2);c=floor(c*q+.5)/q;c=mix(src.rgb,c,obj);}let t=vec2f(max(p(4),.00001),max(p(5),.00001))*max(p(8),1);let m=objectMask(src.rgb);var n=m;for(var y=-1;y<=1;y++){for(var x=-1;x<=1;x++){n=min(n,objectMask(sampleTex(i.uv+vec2f(f32(x),f32(y))*t).rgb));}}let edge=smoothstep(.15,.55,m)*(1-smoothstep(.05,.45,n));let line=clamp(smoothstep(max(p(2),.01),max(p(2),.01)+max(p(7),.001),edge)*p(1),0,1);return vec4f(clamp(mix(c,vec3f(.05,.04,.07),line*obj),vec3f(0),vec3f(1)),src.a);}
12)wgsl";
13inline constexpr const char *kWatercolor = R"wgsl(
14fn hash(q:vec2f)->f32{return fract(sin(dot(q,vec2f(12.9898,78.233)))*43758.5453);}@fragment fn fs_main(i:In)->@location(0) vec4f{let t=vec2f(max(p(6),.00001),max(p(7),.00001));let warp=(vec2f(hash(i.uv*313+p(8)),hash(i.uv*271-p(8)))-.5)*p(3)*t*5;let uv=i.uv+warp;let c=sampleTex(uv);var blur=c.rgb;blur+=sampleTex(uv+vec2f(t.x,0)*p(0)).rgb;blur+=sampleTex(uv-vec2f(t.x,0)*p(0)).rgb;blur+=sampleTex(uv+vec2f(0,t.y)*p(0)).rgb;blur+=sampleTex(uv-vec2f(0,t.y)*p(0)).rgb;blur/=5;let gx=abs(lum(sampleTex(uv+vec2f(t.x,0)).rgb)-lum(sampleTex(uv-vec2f(t.x,0)).rgb));let gy=abs(lum(sampleTex(uv+vec2f(0,t.y)).rgb)-lum(sampleTex(uv-vec2f(0,t.y)).rgb));var col=mix(c.rgb,blur,clamp(p(4),0,1));let y=lum(col);col=mix(vec3f(y),col,p(5));col*=1-clamp((gx+gy)*p(1),0,.7);let paper=(hash(i.uv*vec2f(997,991))-.5)*p(2)*.12+(hash(i.uv*vec2f(173,181))-.5)*p(9)*.08;col=clamp(col+vec3f(paper),vec3f(0),vec3f(1));return vec4f(col*i.color.rgb,c.a*i.color.a);}
15)wgsl";
16inline constexpr const char *kInk = R"wgsl(
17@fragment fn fs_main(i:In)->@location(0) vec4f{let t=vec2f(max(p(8),.00001),max(p(9),.00001));let c=sampleTex(i.uv);let y=lum(c.rgb);let levels=max(p(1),2);let wash=floor(pow(clamp(y,0,1),max(p(0),.1))*levels)/max(levels-1,1);let gx=abs(lum(sampleTex(i.uv+vec2f(t.x,0)*p(3)).rgb)-lum(sampleTex(i.uv-vec2f(t.x,0)*p(3)).rgb));let gy=abs(lum(sampleTex(i.uv+vec2f(0,t.y)*p(3)).rgb)-lum(sampleTex(i.uv-vec2f(0,t.y)*p(3)).rgb));let edge=smoothstep(p(2),p(2)+.12,(gx+gy)*p(11));let paper=vec3f(p(4),p(5),p(6));let ink=paper*(1-wash*p(7));return vec4f(mix(ink,vec3f(.025,.02,.018),edge)*i.color.rgb,c.a*i.color.a);}
18)wgsl";
19inline constexpr const char *kPixel = R"wgsl(
20fn bayer(q:vec2u)->f32{let m=array<f32,16>(0,8,2,10,12,4,14,6,3,11,1,9,15,7,13,5);return m[(q.x%4u)+(q.y%4u)*4u]/16-.5;}@fragment fn fs_main(i:In)->@location(0) vec4f{let size=max(p(0),1);let res=vec2f(max(p(8),1),max(p(9),1))/size;let cell=floor(i.uv*res);let snapped=(cell+.5)/res;let uv=mix(i.uv,snapped,clamp(p(4),0,1));let src=sampleTex(uv);let obj=objectMask(src.rgb);var c=src.rgb;if(obj>.05){let mapped=clamp(c/(c+vec3f(.7))*1.35,vec3f(0),vec3f(1));let y=max(lum(mapped),.0001);let bands=max(p(3),1);let cel=(floor(y*bands)+.5)/bands;c=mapped*(cel/y);let steps=max(p(1),2);let d=bayer(vec2u(cell))*p(2)/steps;c=floor(clamp(c+vec3f(d),vec3f(0),vec3f(1))*steps+.0001)/max(steps-1,1);}return vec4f(clamp(c,vec3f(0),vec3f(1))*i.color.rgb,sampleTex(i.uv).a*i.color.a);}
21)wgsl";
22inline constexpr const char *kMeshCommon = R"wgsl(
23struct Light{posRadius:vec4f,color:vec4f};struct Frame{mvp:mat4x4f,model:mat4x4f,lightDir:vec4f,lightColor:vec4f,tint:vec4f,cameraPos:vec4f,ambient:vec4f,lights:array<Light,8>,texBomb:vec4f,parallax:vec4f,surface:vec4f,view:mat4x4f,clipInfo:vec4f,cloud:vec4f,cloudWind:vec4f};struct Params{data:array<vec4f,8>};struct MeshIn{@location(0) normal:vec3f,@location(1) uv:vec2f,@location(2) tint:vec4f,@location(3) world:vec3f,@location(4) camera:vec3f,@location(5) view:vec3f};@group(0) @binding(0)var<uniform> frame:Frame;@group(0) @binding(1)var albedo:texture_2d<f32>;@group(0) @binding(7)var meshSamp:sampler;@group(0) @binding(15)var<uniform> meshParams:Params;fn mp(i:u32)->f32{return meshParams.data[i/4u][i%4u];}
24)wgsl";
25inline constexpr const char *kCartoonMesh = R"wgsl(
26@fragment fn fs_main(i:MeshIn)->@location(0) vec4f{let base=textureSample(albedo,meshSamp,i.uv)*i.tint;let n=normalize(i.normal);let l=normalize(frame.lightDir.xyz);let ndl=max(dot(n,l),0);let bands=max(mp(0),2);let raw=ndl*bands;var cel=floor(raw+.0001)/max(bands-1,1);cel=mix(cel,min(cel+1/max(bands-1,1),1),smoothstep(0,.12,fract(raw))*.15);var ramp=mix(vec3f(.42,.38,.58),vec3f(.9,.86,.8),smoothstep(0,.5,cel));ramp=mix(ramp,vec3f(1.02,.96,.88),smoothstep(.65,1,cel));let poster=max(mp(3),2);let alb=floor(base.rgb*poster+.5)/poster;let v=normalize(frame.cameraPos.xyz-i.world);let rim=pow(clamp(1-max(dot(n,v),0),0,1),max(mp(1),.5));let lit=alb*(.3+ramp*min(frame.lightColor.rgb,vec3f(1))*.55)+vec3f(.35,.65,.95)*rim*mp(2)*alb*.22;return vec4f(clamp(lit,vec3f(0),vec3f(.96)),base.a);}
27)wgsl";
28inline constexpr const char *kInkMesh = R"wgsl(
29@fragment fn fs_main(i:MeshIn)->@location(0) vec4f{let base=textureSample(albedo,meshSamp,i.uv)*i.tint;let n=normalize(i.normal);let v=normalize(frame.cameraPos.xyz-i.world);let ndl=max(dot(n,normalize(frame.lightDir.xyz)),0);let fresnel=1-max(dot(n,v),0);let levels=max(mp(0),2);var shade=pow(clamp(ndl*.75+.25,0,1),max(mp(3),.1));shade*=mix(.55,1,dot(base.rgb,vec3f(.299,.587,.114)));shade=floor(shade*levels+.0001)/max(levels-1,1);let threshold=max(mp(1),.05);let silhouette=1-smoothstep(threshold,threshold+.25,fresnel);let ink=clamp((1-shade)*mp(2)+(1-silhouette)+pow(clamp(fresnel,0,1),2)*mp(7),0,1);var c=mix(vec3f(mp(4),mp(5),mp(6)),vec3f(.04,.04,.06),ink);c=mix(c,c*mix(vec3f(1),base.rgb,.25),shade);return vec4f(c*mix(vec3f(1),frame.lightColor.rgb,.15),base.a);}
30)wgsl";
31} // namespace eve::stylize::shaders
constexpr const char * kPixel
Definition StylizeWgsl.h:19
constexpr const char * kWatercolor
Definition StylizeWgsl.h:13
constexpr const char * kCommon
Definition StylizeWgsl.h:4
constexpr const char * kInk
Definition StylizeWgsl.h:16
constexpr const char * kMeshCommon
Definition StylizeWgsl.h:22
constexpr const char * kCartoon
Definition StylizeWgsl.h:10
constexpr const char * kInkMesh
Definition StylizeWgsl.h:28
constexpr const char * kCartoonMesh
Definition StylizeWgsl.h:25