code wiki / _hdl_build / nx_gx_sss_skin_gate.nx

nx_gx_sss_skin_gate.nx source

↩ module page · 107 lines · 6453 B

1// nx_gx_sss_skin_gate.nx -- Gx/FIDELITY: subsurface-scattering (SSS) skin shading -- the #1 clay->flesh lever. 2// Two spheres, same skin albedo + same light, side by side: LEFT = clay (hard Lambert, plastic terminator), 3// RIGHT = SSS (spectral wrap diffusion: red light penetrates deepest so it wraps furthest past the terminator and 4// glows red there -- the flesh signature -- while blue stays shallow). Per-pixel, integer Q12, sovereign. HONEST: 5// this is the SSS SHADING MODEL (wrap + spectral reddening), a real fidelity rung; a single untextured sphere is 6// still NOT photoreal (no pores/texture/hair) -- the photoreal critic must still rank it below a real photo. 7// license_tier: ORIGINAL expect_exit: 0 8import "nx_png_write.nx" 9 10func ss_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 11func ss_pn(v: i64) -> i64 { let b: *u8=sys_mmap(32) as *u8; var x: i64=v; var ng: i64=0; if x<0{ng=1;x=0-x} var i: i64=31; if x==0{b[i]=48 as u8;i=i-1} while x>0{b[i]=(48+x%10) as u8;x=x/10;i=i-1} if ng==1{b[i]=45 as u8;i=i-1} sys_write(1,(b as i64+i+1) as *u8,31-i); return 0 } 12func ss_isqrt(n: i64) -> i64 { if n<=0 { return 0 } var x: i64=n; var y: i64=(x+n/x)/2; var it: i64=0; while it<64 { if y>=x { it=64 } else { x=y; y=(x+n/x)/2; it=it+1 } } return x } 13// wrapped diffusion for one channel: clamp((NdotL + W)*Q/(Q+W), 0, Q) (bigger W = wraps further past terminator) 14func ss_wrap(ndl: i64, w: i64, Q: i64) -> i64 { var v: i64=((ndl+w)*Q)/(Q+w); if v<0{v=0} if v>Q{v=Q} return v } 15 16func main() -> i64 { 17 ss_puts("=== nx_gx_sss_skin_gate -- subsurface-scattering skin vs clay (the flesh lever) ===\n" as *u8) 18 var fails: i64=0 19 let Q: i64=4096 20 let W: i64=460; let H: i64=240 21 let rgb: *u8=sys_mmap(W*H*3+16) 22 var i: i64=0 23 while i<W*H { let o: i64=i*3; rgb[o]=14 as u8; rgb[o+1]=15 as u8; rgb[o+2]=20 as u8; i=i+1 } 24 // light unit + half vector (Q12) 25 let L2: i64=2*2+3*3+6*6 26 let llen: i64=ss_isqrt(L2*Q*Q) 27 let lx: i64=(2*Q*Q)/llen; let ly: i64=(3*Q*Q)/llen; let lz: i64=(6*Q*Q)/llen 28 let hxr: i64=lx; let hyr: i64=ly; let hzr: i64=lz+Q 29 let hlen: i64=ss_isqrt(hxr*hxr+hyr*hyr+hzr*hzr) 30 let hx: i64=(hxr*Q)/hlen; let hy: i64=(hyr*Q)/hlen; let hz: i64=(hzr*Q)/hlen 31 // warm skin albedo 32 let ar: i64=232; let ag: i64=176; let ab: i64=150 33 let R: i64=92 34 // wrap widths per channel (red penetrates deepest) 35 let WR: i64=2048; let WG: i64=900; let WB: i64=256 36 var claylit: i64=0; var ssslit: i64=0; var claywarm: i64=0; var ssswarm: i64=0 37 var mode: i64=0 38 while mode<2 { 39 let cx: i64=110 + mode*240 40 let cy: i64=H/2 41 var py: i64=cy-R 42 while py<=cy+R { 43 var px: i64=cx-R 44 while px<=cx+R { 45 let dx: i64=px-cx; let dy: i64=py-cy 46 let r2: i64=dx*dx+dy*dy 47 if r2<=R*R { 48 let dz: i64=ss_isqrt(R*R-r2) 49 let nx: i64=(dx*Q)/R; let ny: i64=(0-dy*Q)/R; let nz: i64=(dz*Q)/R 50 let ndl: i64=(nx*lx+ny*ly+nz*lz)/Q 51 let ndh0: i64=(nx*hx+ny*hy+nz*hz)/Q 52 var ndh: i64=ndh0; if ndh<0 {ndh=0} 53 // shared soft skin specular (broad) 54 let n2: i64=(ndh*ndh)/Q; let n4: i64=(n2*n2)/Q; let n6: i64=(n4*n2)/Q 55 let spec: i64=(n6*70)/Q 56 var rr: i64=0; var gg: i64=0; var bb: i64=0 57 if mode==0 { 58 // CLAY: hard Lambert 59 var d: i64=ndl; if d<0 {d=0} 60 rr=(ar*d)/Q + (ar*18)/255; gg=(ag*d)/Q + (ag*18)/255; bb=(ab*d)/Q + (ab*18)/255 61 } else { 62 // SSS: spectral wrapped diffusion 63 let wr: i64=ss_wrap(ndl,WR,Q); let wg: i64=ss_wrap(ndl,WG,Q); let wb: i64=ss_wrap(ndl,WB,Q) 64 rr=(ar*wr)/Q + (ar*18)/255; gg=(ag*wg)/Q + (ag*18)/255; bb=(ab*wb)/Q + (ab*18)/255 65 } 66 rr=rr+spec; gg=gg+spec; bb=bb+spec 67 if rr>255{rr=255} if gg>255{gg=255} if bb>255{bb=255} 68 let o: i64=(py*W+px)*3 69 rgb[o]=rr as u8; rgb[o+1]=gg as u8; rgb[o+2]=bb as u8 70 // metrics 71 if rr>50 { if mode==0 {claylit=claylit+1} else {ssslit=ssslit+1} } 72 let warm: i64=rr-bb 73 if mode==0 {claywarm=claywarm+warm} else {ssswarm=ssswarm+warm} 74 } 75 px=px+1 76 } 77 py=py+1 78 } 79 mode=mode+1 80 } 81 nx_png_write_rgb("knowledge/nx_gx_sss_skin.png\x00" as *u8, rgb, W, H) 82 ss_puts(" wrote knowledge/nx_gx_sss_skin.png\n" as *u8) 83 ss_puts(" clay: lit="); ss_pn(claylit); ss_puts(" warm(sumR-B)="); ss_pn(claywarm); ss_puts("\n" as *u8) 84 ss_puts(" sss : lit="); ss_pn(ssslit); ss_puts(" warm(sumR-B)="); ss_pn(ssswarm); ss_puts("\n" as *u8) 85 // T1 rendered 86 var t1: i64=0 87 if claylit>500 { if ssslit>500 { t1=1 } } 88 if t1==1 { ss_puts("T1 PASS both skin spheres rendered\n" as *u8) } else { fails=fails+1; ss_puts("T1 FAIL\n" as *u8) } 89 // T2 SSS WRAPS light past the terminator (bigger lit area than clay) 90 var t2: i64=0 91 if ssslit>claylit+300 { t2=1 } 92 if t2==1 { ss_puts("T2 PASS SSS wraps light past the terminator (softer, larger lit area than hard clay)\n" as *u8) } else { fails=fails+1; ss_puts("T2 FAIL no wrap\n" as *u8) } 93 // T3 SSS REDDENS at the terminator (higher total R-B warmth than clay) 94 var t3: i64=0 95 if ssswarm>claywarm+20000 { t3=1 } 96 if t3==1 { ss_puts("T3 PASS SSS reddens the terminator (red scatters deepest -- the flesh signature, measured)\n" as *u8) } else { fails=fails+1; ss_puts("T3 FAIL no reddening\n" as *u8) } 97 // T4 png 98 let szp: *i64=sys_mmap(16) as *i64 99 let rb: *u8=sys_read_file("knowledge/nx_gx_sss_skin.png\x00" as *u8, szp) 100 var t4: i64=0 101 if (rb as i64)!=0 { if szp[0]>1000 { t4=1 } } 102 if t4==1 { ss_puts("T4 PASS PNG ("); ss_pn(szp[0]); ss_puts(" bytes)\n" as *u8) } else { fails=fails+1; ss_puts("T4 FAIL png\n" as *u8) } 103 if fails==0 { ss_puts("GX-SSS-SKIN verdict=GREEN -- subsurface-scattering skin shading (wrap + spectral reddening) measurably beats clay, sovereign integer\n" as *u8); sys_exit(0); return 0 } 104 ss_puts("GX-SSS-SKIN verdict=RED fails="); ss_pn(fails); ss_puts("\n" as *u8) 105 sys_exit(1) 106 return 1 107}