From 8c73632f5bff7fa339e237c1aa6a4cd93457068f Mon Sep 17 00:00:00 2001 From: Peter Li Date: Mon, 21 Apr 2025 01:05:59 -0700 Subject: [PATCH] Phong Blinn Lighting :3 --- engine/rend/shaders/lit_mesh.frag.hlsl | 67 ++++++++++++++++-- engine/rend/shaders/lit_mesh.frag.json | 16 ++++- engine/rend/shaders/meshes.vert.hlsl | 2 + engine/rend/shaders/meshes.vert.json | 22 ++++-- engine/rend/src/camera/CameraComponent.zig | 3 + engine/rend/src/sgpu/renderer.zig | 14 ++++ .../content/_shaders/dxil/lit_mesh.frag.dxil | Bin 4420 -> 5200 bytes .../content/_shaders/dxil/meshes.vert.dxil | Bin 5368 -> 5684 bytes .../content/_shaders/msl/lit_mesh.frag.msl | 30 ++++++-- projects/content/_shaders/msl/meshes.vert.msl | 9 ++- .../content/_shaders/spv/lit_mesh.frag.spv | Bin 1592 -> 2496 bytes projects/content/_shaders/spv/meshes.vert.spv | Bin 1616 -> 1772 bytes projects/sampleGame/main.zig | 17 ++++- 13 files changed, 157 insertions(+), 23 deletions(-) diff --git a/engine/rend/shaders/lit_mesh.frag.hlsl b/engine/rend/shaders/lit_mesh.frag.hlsl index 7407a59..fdcc1e2 100644 --- a/engine/rend/shaders/lit_mesh.frag.hlsl +++ b/engine/rend/shaders/lit_mesh.frag.hlsl @@ -4,17 +4,72 @@ SamplerState Sampler : register(s0, space2); cbuffer Uniforms : register(b0, space3) { float time; + float3 viewPos; }; -float4 main(float2 UV : TEXCOORD0, float3 WorldPos: TEXCOORD1) : SV_Target0 +// from learnopengl.com +float3 BlinnPhong(float3 normal, float3 fragPos, float3 lightPos, float3 lightColor) { - float4 col = pow(Texture.Sample(Sampler, UV), 0.4545); + // diffuse parameter + float3 lightDir = normalize(lightPos - fragPos); + float diff = max(dot(lightDir, normal), 0.0); + float3 diffuse = diff * lightColor; - float SPEEEEEEEEEEEEEED = 0.0001 * time; - float strength = 0.00001; + // specular parameter + float3 viewDir = normalize(fragPos - viewPos); + float3 reflectDir = reflect(-lightDir, normal); + float spec = 0.0; + float3 halfwayDir = normalize(lightDir + viewDir); + spec = pow(max(dot(normal, halfwayDir), 0.0), 30.0); + float3 specular = spec * lightColor * 2; - col.r = col.r + strength * sin(time * SPEEEEEEEEEEEEEED) * WorldPos.x + strength * cos(time * SPEEEEEEEEEEEEEED) * WorldPos.y; + // attenuation + float maxDist = 5; + float cutoff1 = 2; + float cutoff2 = 4; + float cutoffFactor = 0.5; + float dist = length(lightPos - fragPos); + float attenuation = 1.0 / (dist * 2); + if (dist > cutoff1) + { + attenuation *= cutoffFactor; + } + if (dist > cutoff2) + { + attenuation *= cutoffFactor; + } + if (dist > maxDist) + { + attenuation = 0; + } + - return col; + diffuse *= attenuation; + specular *= attenuation; + + return diffuse + specular; + + //return lightColor * 100 * attenuation; + +} + +float4 main( + float2 UV : TEXCOORD0, + float3 WorldPos: TEXCOORD1, + float3 Normal: TEXCOORD2 +) : SV_Target0 +{ + float3 lightPos = float3(0, 20 + -4, -5); + float3 lightColor = float3(0.8, 0.8, 0.5); + float3 ambient = float3(0.01, 0.01, 0.003) * 0.2; + + float4 s = Texture.Sample(Sampler, UV); + float alpha = s.w; + + float3 col = s.xyz; + float3 c2 = col * ambient + col * BlinnPhong(Normal, WorldPos, lightPos, lightColor); + + float4 rv = float4(pow(c2, 1.0 / 2.2), alpha); + return rv; } diff --git a/engine/rend/shaders/lit_mesh.frag.json b/engine/rend/shaders/lit_mesh.frag.json index dc0a6a1..0becd0f 100644 --- a/engine/rend/shaders/lit_mesh.frag.json +++ b/engine/rend/shaders/lit_mesh.frag.json @@ -6,13 +6,18 @@ } ], "types" : { - "_10" : { + "_11" : { "name" : "type.Uniforms", "members" : [ { "name" : "time", "type" : "float", "offset" : 0 + }, + { + "name" : "viewPos", + "type" : "vec3", + "offset" : 4 } ] } @@ -27,6 +32,11 @@ "type" : "vec3", "name" : "in.var.TEXCOORD1", "location" : 1 + }, + { + "type" : "vec3", + "name" : "in.var.TEXCOORD2", + "location" : 2 } ], "outputs" : [ @@ -54,9 +64,9 @@ ], "ubos" : [ { - "type" : "_10", + "type" : "_11", "name" : "type.Uniforms", - "block_size" : 4, + "block_size" : 16, "set" : 3, "binding" : 0 } diff --git a/engine/rend/shaders/meshes.vert.hlsl b/engine/rend/shaders/meshes.vert.hlsl index 59046e0..6fb84fc 100644 --- a/engine/rend/shaders/meshes.vert.hlsl +++ b/engine/rend/shaders/meshes.vert.hlsl @@ -14,6 +14,7 @@ struct Output { float2 TexCoord : TEXCOORD0; float3 WorldPos : TEXCOORD1; + float3 Normal: TEXCOORD2; float4 Position : SV_Position; }; @@ -43,6 +44,7 @@ Output main(Input input) output.Position = mul(ViewProjection, mul(scene[input.Instance].Model, pos)); output.WorldPos = pos.xyz; + output.Normal = input.Normal; return output; } diff --git a/engine/rend/shaders/meshes.vert.json b/engine/rend/shaders/meshes.vert.json index 9abb29a..223906d 100644 --- a/engine/rend/shaders/meshes.vert.json +++ b/engine/rend/shaders/meshes.vert.json @@ -6,7 +6,7 @@ } ], "types" : { - "_9" : { + "_11" : { "name" : "Scene", "members" : [ { @@ -18,12 +18,12 @@ } ] }, - "_8" : { + "_10" : { "name" : "type.StructuredBuffer.Scene", "members" : [ { "name" : "_m0", - "type" : "_9", + "type" : "_11", "array" : [ 0 ], @@ -35,7 +35,7 @@ } ] }, - "_11" : { + "_13" : { "name" : "type.Uniforms", "members" : [ { @@ -59,6 +59,11 @@ "name" : "in.var.TEXCOORD0", "location" : 0 }, + { + "type" : "vec3", + "name" : "in.var.TEXCOORD1", + "location" : 1 + }, { "type" : "vec2", "name" : "in.var.TEXCOORD3", @@ -75,11 +80,16 @@ "type" : "vec3", "name" : "out.var.TEXCOORD1", "location" : 1 + }, + { + "type" : "vec3", + "name" : "out.var.TEXCOORD2", + "location" : 2 } ], "ssbos" : [ { - "type" : "_8", + "type" : "_10", "name" : "scene", "readonly" : true, "block_size" : 0, @@ -89,7 +99,7 @@ ], "ubos" : [ { - "type" : "_11", + "type" : "_13", "name" : "type.Uniforms", "block_size" : 68, "set" : 1, diff --git a/engine/rend/src/camera/CameraComponent.zig b/engine/rend/src/camera/CameraComponent.zig index 1bb8319..b29a911 100644 --- a/engine/rend/src/camera/CameraComponent.zig +++ b/engine/rend/src/camera/CameraComponent.zig @@ -23,6 +23,7 @@ yaw: f32 = 0, pitch: f32 = 0, roll: f32 = 0, +finalPos: core.Vectorf = .{}, final: Mat = zm.identity(), finalAlt: Mat = zm.identity(), @@ -46,6 +47,8 @@ pub fn resolve(self: *@This()) void { self.updateProjections(); var position = scene.getPosition(); + self.finalPos = position; + position.z = -position.z; position.y = -position.y; { diff --git a/engine/rend/src/sgpu/renderer.zig b/engine/rend/src/sgpu/renderer.zig index 536fd33..15afa91 100644 --- a/engine/rend/src/sgpu/renderer.zig +++ b/engine/rend/src/sgpu/renderer.zig @@ -96,6 +96,14 @@ pub const Renderer = struct { ), ); + try assets.load( + assets.MakeImportRefOptions( + "Mesh", + "m_default_cube", + .{ .path = "meshes/primitive_box.obj" }, + ), + ); + var defaultTextureName = core.MakeName("t_default"); self.defaultTexture = getTexture(&defaultTextureName).?; } @@ -369,6 +377,12 @@ pub const Renderer = struct { const ptr: *lit_mesh_frag.Uniforms = @ptrCast(@alignCast(&data)); ptr.time = @floatCast(self.totalTime); + var position: core.Vectorf = .{}; + if (self.activeCamera) |cam| { + position = cam.finalPos; + } + + ptr.viewPos = @bitCast(position); cmd.pushGPUFragmentUniformData(0, &data, @sizeOf(lit_mesh_frag.Uniforms)); } } diff --git a/projects/content/_shaders/dxil/lit_mesh.frag.dxil b/projects/content/_shaders/dxil/lit_mesh.frag.dxil index c742c374de50e9a24e6cbdab799a573ce22f4215..f2b005bf88625bc3ed61e432f2bccf6f26279807 100644 GIT binary patch literal 5200 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 delta 2610 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 delta 2313 zcmaJ>3rrhV7M-!jGd9@7#9)kV!Vo@z{5mFyN%PTqjO&&LN)V)&#!<(PN!^5BLXwsx zTiY1CkYy{-IExBRHHLPBwk8 z?USzGd*_~e?|XC4^M#GS7Fi4?eW~LS&%*r^Ngu9yY3$A~;pi0@f}mg1AP58VE@0)r zrh%D(W0VI$>Ldu-4y@W(MhF3(7-iLuYn))i2bRF?{g!NvJr05?=41=-Syp@;jn8Zl z>*MuLtxI)+#Y357v>Fz}_I_6yy&FzWO@zhLv0-!@ybdMhhnG)R@&v2660DOg1=IDs9EU!(W-)faJd(#2ki~ZF`GBAO2w)E;2!=~z`?wqM z4SYTVK~j(#2c`qYj@Z4pCHEW06Hs*xS%F5X&DPYt9hrTp8mm`Lt zYw&qx@(~y|(;hKR?-Lw><#b3;#5-L@FAB00`4;LF^fNq-;UI7lyKxAD+7u8pM&Fcd zqpj#Y#|4qz*C^fE7%ujcsz68`263?zcRJTeiK1N~feoM{_BZDno{cH3KJ?KQbB*ZvJuc$jdJa4`j|| zMD{CY5trXI{l=xKD~(i*CEespH^Xg$6uFg@TYX8Yp#wvEly$E-R9}1XQN8E3wYH#y zJy||J*mv{NOxO7AnNKT3r+3(1+}vun*y@i}G~4PMs(G)AGhh3gc{aNLY}7Ox^-}*b zcy8+luv+=8Z14*?ylr1keK$UQ*0?phnC*Q4yf6v~U<|12 zk6K^=p3uS@=QEQVI4S%ameF03?doS%qn9xvTlW_T$X0iXX+&cRV>QqWH1L*V4)Kj@ zg|A(-WEMBd+>HviCD$$D!Q-#I``eSphDMTGRU7uK9mLbFBffxEIOn%$+*@>R&HQ^g zk}s%gx1?0z4JjK;-Q|&hMse9W^GU4rp7KbP5__6vg3iyqUuH~4%*q2dh9ZbBSRgc9 zAeU}YVJq6goG?4o;-eHAQ8y@Vu;K{^(GyU)bOMjy(ii-`0I`!=qX zv#BK)6#}H?3aQE?O9rLTHrr0Clg&4f6@+EZkX;XX$A9dG*@|XI8-Z04=!gj3TXr!X z`I9T_30G!s0ix5?`{USsa!n1XWU<}W1lGgLreGC|mDv*5nThO%Pz>95D1rGp3SV@o zS)S!w0()Cu)Jg8eMjW7UM7bD0&6qRECY_I+@GCTa>e`KOO=KeN1h`2$+MI}=>ew(! z&SUJkZBi^w{c6*sUWNEr>It+pLH&-mDM;#)SnA=u32N;l(Frwjj&K0(m*@)#uFJi7 zhGbZ7OB1m;9`c_HxY5ZRyjrxvI0az~afXBFzLTS7syWK~70OFE zW=~Hf`Q4{x_Hm32D~vuJwy?r5tj%I-S;iJ?3)||-GA6vqISE?bTObVCC-B|^X}CKC zgO=}FKb7(UwHjQJ7{n3Th{#P0>cqJy21K*;LFcZ{F#T+r+)*m~g-Thk0iS0?q$dUm z;fQFGs#dI&e--NaIN2zcLP!X|*3)NtkBVRath9%p{Kb0yy zrML5E0jDYH{m!yNGgYTt$?4bid?w~D4Zh3d+WcXSFkV8Le8wKci80BoEnKFmIzRGH zG{gzVaA<1vbS4tdd$wzj&L-{U-pR0hGby+EWcLW}8J&J6fYkMMRm_LEH&=N0=IVM< zzT@aB?j`LZG8}M2dSGe6t5HjZoyM&|K+}A Ia6;Vp572kX2LJ#7 diff --git a/projects/content/_shaders/msl/lit_mesh.frag.msl b/projects/content/_shaders/msl/lit_mesh.frag.msl index a49c3e9..e8c494d 100644 --- a/projects/content/_shaders/msl/lit_mesh.frag.msl +++ b/projects/content/_shaders/msl/lit_mesh.frag.msl @@ -6,6 +6,7 @@ using namespace metal; struct type_Uniforms { float time; + packed_float3 viewPos; }; struct main0_out @@ -17,15 +18,36 @@ struct main0_in { float2 in_var_TEXCOORD0 [[user(locn0)]]; float3 in_var_TEXCOORD1 [[user(locn1)]]; + float3 in_var_TEXCOORD2 [[user(locn2)]]; }; fragment main0_out main0(main0_in in [[stage_in]], constant type_Uniforms& Uniforms [[buffer(0)]], texture2d Texture [[texture(0)]], sampler Sampler [[sampler(0)]]) { main0_out out = {}; - float4 _40 = powr(Texture.sample(Sampler, in.in_var_TEXCOORD0), float4(0.4544999897480010986328125)); - float _45 = Uniforms.time * (9.9999997473787516355514526367188e-05 * Uniforms.time); - _40.x = (_40.x + ((9.9999997473787516355514526367188e-06 * sin(_45)) * in.in_var_TEXCOORD1.x)) + ((9.9999997473787516355514526367188e-06 * cos(_45)) * in.in_var_TEXCOORD1.y); - out.out_var_SV_Target0 = _40; + float4 _54 = Texture.sample(Sampler, in.in_var_TEXCOORD0); + float3 _57 = float3(0.0, 16.0, -5.0) - in.in_var_TEXCOORD1; + float3 _58 = fast::normalize(_57); + float _73 = length(_57); + float _79; + if (_73 > 2.0) + { + _79 = 0.25 / _73; + } + else + { + _79 = 0.5 / _73; + } + float _84; + if (_73 > 4.0) + { + _84 = _79 * 0.5; + } + else + { + _84 = _79; + } + float _86 = (_73 > 5.0) ? 0.0 : _84; + out.out_var_SV_Target0 = float4(powr(_54.xyz * (float3(0.00200000009499490261077880859375, 0.00200000009499490261077880859375, 0.000600000028498470783233642578125) + (((float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5) * precise::max(dot(_58, in.in_var_TEXCOORD2), 0.0)) * _86) + (((float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5) * powr(precise::max(dot(in.in_var_TEXCOORD2, fast::normalize(_58 + fast::normalize(in.in_var_TEXCOORD1 - float3(Uniforms.viewPos)))), 0.0), 30.0)) * 2.0) * _86))), float3(0.4545454680919647216796875)), _54.w); return out; } diff --git a/projects/content/_shaders/msl/meshes.vert.msl b/projects/content/_shaders/msl/meshes.vert.msl index 068f8c4..d9c90e1 100644 --- a/projects/content/_shaders/msl/meshes.vert.msl +++ b/projects/content/_shaders/msl/meshes.vert.msl @@ -23,22 +23,25 @@ struct main0_out { float2 out_var_TEXCOORD0 [[user(locn0)]]; float3 out_var_TEXCOORD1 [[user(locn1)]]; + float3 out_var_TEXCOORD2 [[user(locn2)]]; float4 gl_Position [[position]]; }; struct main0_in { float3 in_var_TEXCOORD0 [[attribute(0)]]; + float3 in_var_TEXCOORD1 [[attribute(1)]]; float2 in_var_TEXCOORD3 [[attribute(3)]]; }; vertex main0_out main0(main0_in in [[stage_in]], constant type_Uniforms& Uniforms [[buffer(0)]], const device type_StructuredBuffer_Scene& scene [[buffer(1)]], uint gl_InstanceIndex [[instance_id]]) { main0_out out = {}; - float4 _41 = float4(in.in_var_TEXCOORD0, 1.0); + float4 _44 = float4(in.in_var_TEXCOORD0, 1.0); out.out_var_TEXCOORD0 = in.in_var_TEXCOORD3; - out.out_var_TEXCOORD1 = _41.xyz; - out.gl_Position = Uniforms.ViewProjection * (scene._m0[gl_InstanceIndex].Model * _41); + out.out_var_TEXCOORD1 = _44.xyz; + out.out_var_TEXCOORD2 = in.in_var_TEXCOORD1; + out.gl_Position = Uniforms.ViewProjection * (scene._m0[gl_InstanceIndex].Model * _44); return out; } diff --git a/projects/content/_shaders/spv/lit_mesh.frag.spv b/projects/content/_shaders/spv/lit_mesh.frag.spv index a67a8284c55353d4d9aa910573079333e6b61444..57d6a4f1262da89ca6441e5f08b62eed05d993c0 100644 GIT binary patch literal 2496 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 F^bb+^ZM*;g literal 1616 zcmZXUTTc^F6h;s20A4{v0WUxc-qDINF(yU@FM$_R6g9k(GEK(V)|6J`n?J#y>x+qN z&CG!YPqJs9Z|`qkd(vuUbuxsp5W-Y=#Md(uDy5~GW4+Vi?9simpLGQlL`H&)BNGV8 zuvK%s2Vp#%4yUjUett_EyMz9)H5m5OgIB|LJMA}iTWL3ilfVk0K;|*3IPZD~=~u3D z&Y%zT2=PSTQJ(ixH*5F$okRQ+bWn5}!sjggvD5E;Nn3-gN5|&X=RAX~lcKPUhjZwW z6j&zn*|Kiq`+mRi@$KI0X7j_F^@2Z{&wRr7IQrZ}Z#eib(46k)q|co@n?1$7Zh_sY zy{;i*_ZsICyZa@?BldR?tHt&)>bJJoI{Mw^3gU^lUcel?6aA4dj{a@3$KPkQj2X4r z>jh++I+5o*);W*1mkq=i--hQnPjX~iz`n&qa-2(k+`%#b*fv@>@~j)