From e2fd0809a55e555fa0f9ec4869b78b0f2f4ac68a Mon Sep 17 00:00:00 2001 From: alcoholicgirl <2680813175@qq.com> Date: Tue, 28 Apr 2026 01:09:17 +0800 Subject: [PATCH 1/2] PBR --- konabot/plugins/marchtoy/shaders/frag.glsl | 74 ++++++++++++++++++++-- 1 file changed, 67 insertions(+), 7 deletions(-) diff --git a/konabot/plugins/marchtoy/shaders/frag.glsl b/konabot/plugins/marchtoy/shaders/frag.glsl index 951c29e..7a0cbdb 100644 --- a/konabot/plugins/marchtoy/shaders/frag.glsl +++ b/konabot/plugins/marchtoy/shaders/frag.glsl @@ -2,6 +2,7 @@ const float EPS = 0.001; const int MAX_ITER = 128; const float INF = 1e10; +const float PI = 3.14159; uniform vec2 u_resolution; out vec4 fragColor; @@ -68,17 +69,76 @@ vec3 nrm(vec3 p) { )); } +float saturate(float x) { + return clamp(x, 0.0, 1.0); +} + +float ggx_distribution(vec3 n, vec3 h, float roughness) { + float alpha = roughness * roughness; + float alpha2 = alpha * alpha; + float NdotH = saturate(dot(n, h)); + float denom = NdotH * NdotH * (alpha2 - 1.0) + 1.0; + return alpha2 / max(PI * denom * denom, EPS); +} + +float geometry_schlick_ggx(float NdotX, float roughness) { + float r = roughness + 1.0; + float k = r * r / 8.0; + return NdotX / max(NdotX * (1.0 - k) + k, EPS); +} + +float geometry_smith(vec3 n, vec3 v, vec3 l, float roughness) { + float NdotV = saturate(dot(n, v)); + float NdotL = saturate(dot(n, l)); + return geometry_schlick_ggx(NdotV, roughness) * geometry_schlick_ggx(NdotL, roughness); +} + +vec3 fresnel_schlick(vec3 f0, float cos_theta) { + return f0 + (1.0 - f0) * pow(1.0 - saturate(cos_theta), 5.0); +} + +vec3 tonemap_aces(vec3 c) { + const float a = 2.51; + const float b = 0.03; + const float c1 = 2.43; + const float d = 0.59; + const float e = 0.14; + return clamp((c * (a * c + b)) / (c * (c1 * c + d) + e), 0.0, 1.0); +} + vec4 materialColor(int obj_id) { return vec4(1.0); } -vec4 color(vec3 p, int obj_id) { - vec3 normal = nrm(p); - vec3 light_dir = normalize(vec3(0.5, 0.8, -0.6)); - float light = 0.2 + 0.8 * max(dot(normal, light_dir), 0.0); - vec4 base = materialColor(obj_id); - return vec4(base.rgb * light, base.a); +vec4 color(vec3 p, vec3 r, int obj_id) { + vec3 light_col = vec3(1.0); + vec4 albedo = materialColor(obj_id); + vec3 N = nrm(p); + vec3 V = normalize(-r); + vec3 L = normalize(vec3(0.5, 0.8, -0.6)); + vec3 H = normalize(V + L); + float roughness = 0.45; + float metallic = 0.02; + float NdotL = saturate(dot(N, L)); + float NdotV = saturate(dot(N, V)); + float D = ggx_distribution(N, H, roughness); + float G = geometry_smith(N, V, L, roughness); + vec3 F0 = mix(vec3(0.04), albedo.rgb, metallic); + vec3 F = fresnel_schlick(F0, dot(V, H)); + vec3 kD = (1.0 - F) * (1.0 - metallic); + vec3 diffuse = kD * albedo.rgb / PI; + vec3 specular = D * G * F / max(4.0 * NdotL * NdotV, EPS); + + float hemi = N.y * 0.5 + 0.5; + vec3 sky_ambient = vec3(0.60, 0.72, 0.92); + vec3 ground_ambient = vec3(0.18, 0.16, 0.14); + vec3 ambient = mix(ground_ambient, sky_ambient, hemi) * (diffuse + 0.25 * F0) * 0.35; + + vec3 col = ambient + (diffuse + specular) * light_col * NdotL; + col = tonemap_aces(col); + col = pow(col, vec3(1.0 / 2.2)); + return vec4(col, 1.0); } vec4 march(vec3 p, vec3 r) { @@ -87,7 +147,7 @@ vec4 march(vec3 p, vec3 r) { for(int i = 0; i < MAX_ITER; ++i) { qry = sd(p); if(qry.value < EPS){ - col = color(p, qry.obj_id); + col = color(p, r, qry.obj_id); break; } p += qry.value * r; From d748e242dba163f5f36e8076a98ac34026cdc42a Mon Sep 17 00:00:00 2001 From: alcoholicgirl <2680813175@qq.com> Date: Tue, 28 Apr 2026 14:09:45 +0800 Subject: [PATCH 2/2] manual fix --- konabot/docs/user/march.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/konabot/docs/user/march.txt b/konabot/docs/user/march.txt index e9a8a82..e42c443 100644 --- a/konabot/docs/user/march.txt +++ b/konabot/docs/user/march.txt @@ -1,16 +1,16 @@ # 指令介绍 简易 Raymarch 小玩具 -用法:march `` +用法:march `[scene]` 例:march torus(1.0, 0.2).color(1.0, 0.2, 0.2) torus(1.0, 0.2).rot(90, 0, 0).color(0.2, 0.2, 1.0) camera(4.0).pos(4, 0, 0).lookat(0) # 主要语法 -`` ::= `` "." `` |`` +`[scene]` ::= `[scene]` "." `[op]` |`[obj]` -`` ::= `` | `` "(" ")" +`[obj]` ::= `[obj_ty]` | `[obj_ty]` "(" [args] ")" -`` ::= `` | `` "(" `` ")" +`[op]` ::= `[op_ty]` | `[op_ty]` "(" `[args]` ")" -`` ::= `` "," `` | `` +`[args]` ::= `[args]` "," `[arg]` | `[arg]` 其中 `obj_ty`、`op_ty` 分别为物体类型(如 `cube`、`sphere`、`torus` 等)与变换类型(如 `pos`、`rot`)。 @@ -37,4 +37,4 @@ `rounded`:圆角 # 特殊说明 -`` 不包含 scale。非正交的变换会破坏 SDF 的性质。 \ No newline at end of file +`[op_ty]` 不包含 scale。非正交的变换会破坏 SDF 的性质。 \ No newline at end of file