From 58d6184085c1eecb6eaa065fcf33ab3b2dddc831 Mon Sep 17 00:00:00 2001 From: ternaryop8479 Date: Sat, 28 Mar 2026 10:10:11 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84shaders=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E7=BB=93=E6=9E=84=EF=BC=8C=E6=89=8B=E5=8A=A8=E7=BC=96?= =?UTF-8?q?=E5=86=99include=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TODO-List | 2 +- examples/normal_map_cornell_box | Bin 835800 -> 849624 bytes include/resource/shader.h | 8 + shaders/{ => gbuffer}/gbuffer.frag | 0 shaders/{ => gbuffer}/gbuffer.vert | 0 shaders/include/bvh.glsl | 190 ++++++ shaders/include/common.glsl | 32 + shaders/include/lighting.glsl | 50 ++ shaders/include/material.glsl | 158 +++++ shaders/include/math.glsl | 24 + shaders/include/rng.glsl | 21 + shaders/include/sampling.glsl | 18 + shaders/include/structs.glsl | 69 ++ shaders/{ => postprocess}/denoiser.comp | 0 shaders/{ => postprocess}/screen_blit.frag | 0 shaders/{ => postprocess}/screen_blit.vert | 0 shaders/raytracing.comp | 759 --------------------- shaders/raytracing/raytracing.comp | 171 +++++ src/core/shader_manager.cpp | 178 ++--- src/resource/shader.cpp | 371 +++++----- 20 files changed, 1047 insertions(+), 1004 deletions(-) rename shaders/{ => gbuffer}/gbuffer.frag (100%) rename shaders/{ => gbuffer}/gbuffer.vert (100%) create mode 100644 shaders/include/bvh.glsl create mode 100644 shaders/include/common.glsl create mode 100644 shaders/include/lighting.glsl create mode 100644 shaders/include/material.glsl create mode 100644 shaders/include/math.glsl create mode 100644 shaders/include/rng.glsl create mode 100644 shaders/include/sampling.glsl create mode 100644 shaders/include/structs.glsl rename shaders/{ => postprocess}/denoiser.comp (100%) rename shaders/{ => postprocess}/screen_blit.frag (100%) rename shaders/{ => postprocess}/screen_blit.vert (100%) delete mode 100644 shaders/raytracing.comp create mode 100644 shaders/raytracing/raytracing.comp diff --git a/TODO-List b/TODO-List index 3ce1c29..22fa7ce 100644 --- a/TODO-List +++ b/TODO-List @@ -1,7 +1,7 @@ * 1. 修复全局光照导致的采样问题 * 2. 重构代码,统一化结构、加入ResourceManager * 2.1. 优化cpu-gpu交互效率 -2.2 修改shader文件结构 +* 2.2 修改shader文件结构 3. 支持更多材质及pbr参数 4. 添加HDRI支持 5. 支持glTF 2.0模型加载 diff --git a/examples/normal_map_cornell_box b/examples/normal_map_cornell_box index a12afc5b50246deee2553b334a595e3fe98aa6e7..97f066d94065b5dc5d031464b2640f11aa691ead 100644 GIT binary patch delta 223194 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%0APEo0s|aZ`>+epJ|iKA9wfIM|R&z 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

ZTWYKgRL`u2 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 delta 212126 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 z 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 X>2hSqKXR2WA$D(}?h^mLAn*SHhyEEc diff --git a/include/resource/shader.h b/include/resource/shader.h index 877b443..a09a6c0 100644 --- a/include/resource/shader.h +++ b/include/resource/shader.h @@ -170,6 +170,14 @@ private: * @return File content */ std::string read_file_(const std::string &path); + + /* + * @brief Process #include directives in shader source + * @param source Shader source code + * @param base_dir Base directory for relative includes + * @return Processed source with includes resolved + */ + std::string process_includes_(const std::string &source, const std::string &base_dir); }; } // namespace are diff --git a/shaders/gbuffer.frag b/shaders/gbuffer/gbuffer.frag similarity index 100% rename from shaders/gbuffer.frag rename to shaders/gbuffer/gbuffer.frag diff --git a/shaders/gbuffer.vert b/shaders/gbuffer/gbuffer.vert similarity index 100% rename from shaders/gbuffer.vert rename to shaders/gbuffer/gbuffer.vert diff --git a/shaders/include/bvh.glsl b/shaders/include/bvh.glsl new file mode 100644 index 0000000..58855b8 --- /dev/null +++ b/shaders/include/bvh.glsl @@ -0,0 +1,190 @@ +// BVH traversal and ray-triangle intersection + +#ifndef BVH_GLSL +#define BVH_GLSL + +// Ray-AABB intersection +bool intersect_aabb(Ray ray, vec3 aabb_min, vec3 aabb_max, float t_max) { + vec3 inv_d = 1.0 / ray.direction; + vec3 t0 = (aabb_min - ray.origin) * inv_d; + vec3 t1 = (aabb_max - ray.origin) * inv_d; + + vec3 tmin3 = min(t0, t1); + vec3 tmax3 = max(t0, t1); + + float tmin = max(max(tmin3.x, tmin3.y), tmin3.z); + float tmax2 = min(min(tmax3.x, tmax3.y), tmax3.z); + + return (tmax2 >= max(tmin, 0.0)) && (tmin <= t_max); +} + +// Moller-Trumbore triangle intersection +bool intersect_triangle(Ray ray, TriangleGpu tri, inout HitInfo hit) { + vec3 v0 = tri.v0_material.xyz; + vec3 v1 = tri.v1.xyz; + vec3 v2 = tri.v2.xyz; + + vec3 e1 = v1 - v0; + vec3 e2 = v2 - v0; + vec3 pvec = cross(ray.direction, e2); + float det = dot(e1, pvec); + + if (abs(det) < EPSILON) return false; + float inv_det = 1.0 / det; + + vec3 tvec = ray.origin - v0; + float u = dot(tvec, pvec) * inv_det; + if (u < 0.0 || u > 1.0) return false; + + vec3 qvec = cross(tvec, e1); + float v = dot(ray.direction, qvec) * inv_det; + if (v < 0.0 || u + v > 1.0) return false; + + float t = dot(e2, qvec) * inv_det; + if (t < EPSILON || t >= hit.t) return false; + + float w = 1.0 - u - v; + vec3 n0 = tri.n0.xyz; + vec3 n1 = tri.n1.xyz; + vec3 n2 = tri.n2.xyz; + + vec2 uv0 = tri.uv0_uv1.xy; + vec2 uv1 = tri.uv0_uv1.zw; + vec2 uv2 = tri.uv2.xy; + + vec3 t0 = tri.t0.xyz; + vec3 t1 = tri.t1.xyz; + vec3 t2 = normalize(cross(n0, t0)); + + hit.hit = true; + hit.t = t; + hit.position = ray.origin + t * ray.direction; + hit.normal = normalize(n0 * w + n1 * u + n2 * v); + hit.texcoord = uv0 * w + uv1 * u + uv2 * v; + hit.tangent = normalize(t0 * w + t1 * u + t2 * v); + hit.material_id = as_uint(tri.v0_material.w); + return true; +} + +// BVH traversal (closest hit) +HitInfo trace_ray_bvh(Ray ray) { + HitInfo hit; + hit.hit = false; + hit.t = MAX_FLOAT; + + if (!u_use_bvh || u_bvh_node_count == 0u) { + return hit; + } + + uint stack[64]; + int sp = 0; + stack[sp++] = 0u; + + while (sp > 0) { + uint node_idx = stack[--sp]; + if (node_idx >= u_bvh_node_count) continue; + + BVHNodeGpu node = bvh_nodes[node_idx]; + vec3 bmin = node.aabb_min_left_first.xyz; + vec3 bmax = node.aabb_max_count.xyz; + uint left_first = as_uint(node.aabb_min_left_first.w); + uint count = as_uint(node.aabb_max_count.w); + + if (!intersect_aabb(ray, bmin, bmax, hit.t)) continue; + + if (count > 0u) { + for (uint i = 0u; i < count; ++i) { + TriangleGpu tri = bvh_tris[left_first + i]; + intersect_triangle(ray, tri, hit); + } + } else { + uint left = left_first; + uint right = left_first + 1u; + if (sp < 63) stack[sp++] = right; + if (sp < 63) stack[sp++] = left; + } + } + + return hit; +} + +// Any-hit BVH for shadow ray +bool trace_any_bvh(Ray ray, float t_max) { + if (!u_use_bvh || u_bvh_node_count == 0u) return false; + + uint stack[64]; + int sp = 0; + stack[sp++] = 0u; + + HitInfo hit; + hit.hit = false; + hit.t = t_max; + + while (sp > 0) { + uint node_idx = stack[--sp]; + if (node_idx >= u_bvh_node_count) continue; + + BVHNodeGpu node = bvh_nodes[node_idx]; + vec3 bmin = node.aabb_min_left_first.xyz; + vec3 bmax = node.aabb_max_count.xyz; + uint left_first = as_uint(node.aabb_min_left_first.w); + uint count = as_uint(node.aabb_max_count.w); + + if (!intersect_aabb(ray, bmin, bmax, hit.t)) continue; + + if (count > 0u) { + for (uint i = 0u; i < count; ++i) { + TriangleGpu tri = bvh_tris[left_first + i]; + if (intersect_triangle(ray, tri, hit)) return true; + } + } else { + uint left = left_first; + uint right = left_first + 1u; + if (sp < 63) stack[sp++] = right; + if (sp < 63) stack[sp++] = left; + } + } + + return false; +} + +// Read primary hit from G-Buffer +HitInfo trace_primary_gbuffer(Ray ray, ivec2 pixel_coords) { + HitInfo hit; + hit.hit = false; + hit.t = MAX_FLOAT; + hit.position = vec3(0.0); + hit.normal = vec3(0.0, 1.0, 0.0); + hit.texcoord = vec2(0.0); + hit.tangent = vec3(0.0); + hit.material_id = 0u; + hit.material_type = 0; + + vec4 pos = imageLoad(g_position, pixel_coords); + if (pos.w <= 0.5) { + return hit; + } + + vec3 p = pos.xyz; + vec3 n = normalize(imageLoad(g_normal, pixel_coords).xyz); + uint mid = imageLoad(g_material_id, pixel_coords).r; + vec4 mat = imageLoad(g_material, pixel_coords); + int mtype = int(mat.w); + vec4 texcoord_tangent = imageLoad(g_texcoord, pixel_coords); + vec2 texcoord = texcoord_tangent.xy; + vec4 tangent_data = imageLoad(g_tangent, pixel_coords); + vec3 tangent = tangent_data.xyz; + + hit.hit = true; + hit.position = p; + hit.normal = n; + hit.texcoord = texcoord; + hit.tangent = tangent; + hit.material_id = mid; + hit.material_type = mtype; + hit.t = length(p - ray.origin); + + return hit; +} + +#endif // BVH_GLSL diff --git a/shaders/include/common.glsl b/shaders/include/common.glsl new file mode 100644 index 0000000..c90642f --- /dev/null +++ b/shaders/include/common.glsl @@ -0,0 +1,32 @@ +// Common constants and definitions for ray tracing + +#ifndef COMMON_GLSL +#define COMMON_GLSL + +// Mathematical constants +#define PI 3.14159265359 +#define INV_PI 0.31830988618 +#define EPSILON 1e-4 +#define MAX_FLOAT 3.402823466e38 +#define RR_THRESHOLD 0.1 + +// Material types +#define MATERIAL_DIFFUSE 0 +#define MATERIAL_METAL 1 +#define MATERIAL_DIELECTRIC 2 +#define MATERIAL_EMISSIVE 3 + +// Light types +#define LIGHT_DIRECTIONAL 0 +#define LIGHT_POINT 1 +#define LIGHT_SPOT 2 + +// Texture slots +#define TEXTURE_SLOT_ALBEDO 0 +#define TEXTURE_SLOT_NORMAL 1 +#define TEXTURE_SLOT_METALLIC 2 +#define TEXTURE_SLOT_ROUGHNESS 3 +#define TEXTURE_SLOT_AO 4 +#define TEXTURE_SLOT_EMISSION 5 + +#endif // COMMON_GLSL diff --git a/shaders/include/lighting.glsl b/shaders/include/lighting.glsl new file mode 100644 index 0000000..887d5b8 --- /dev/null +++ b/shaders/include/lighting.glsl @@ -0,0 +1,50 @@ +// Direct lighting with shadow rays + +#ifndef LIGHTING_GLSL +#define LIGHTING_GLSL + +vec3 eval_direct_lighting(inout HitInfo hit, Material mat, inout uint seed) { + if (u_light_count == 0u) return vec3(0.0); + + uint light_idx = uint(random_float(seed) * float(u_light_count)) % u_light_count; + Light light = lights[light_idx]; + + vec3 L; + float dist = MAX_FLOAT; + vec3 radiance = vec3(0.0); + + if (light.type == LIGHT_POINT) { + vec3 to_light = light.position - hit.position; + dist = length(to_light); + if (dist > light.range) return vec3(0.0); + L = to_light / dist; + + float atten = 1.0 / max(dist * dist, 0.01); + radiance = light.color * light.intensity * atten; + } else if (light.type == LIGHT_DIRECTIONAL) { + L = normalize(-light.direction); + radiance = light.color * light.intensity; + } else { + return vec3(0.0); + } + + float n_dot_l = max(dot(hit.normal, L), 0.0); + if (n_dot_l <= 0.0) return vec3(0.0); + + Ray shadow_ray; + shadow_ray.origin = hit.position + hit.normal * EPSILON; + shadow_ray.direction = L; + + float t_max = (light.type == LIGHT_POINT) ? (dist - EPSILON) : MAX_FLOAT; + if (trace_any_bvh(shadow_ray, t_max)) return vec3(0.0); + + float pdf_light = 1.0 / float(u_light_count); + vec3 brdf = mat.albedo * INV_PI; + return brdf * radiance * n_dot_l * mat.ao / max(pdf_light, EPSILON); +} + +vec3 environment_color(vec3 dir) { + return vec3(0.1, 0.1, 0.15); +} + +#endif // LIGHTING_GLSL diff --git a/shaders/include/material.glsl b/shaders/include/material.glsl new file mode 100644 index 0000000..9da1afb --- /dev/null +++ b/shaders/include/material.glsl @@ -0,0 +1,158 @@ +// Material handling and PBR scattering + +#ifndef MATERIAL_GLSL +#define MATERIAL_GLSL + +// Helper function to sample texture from array by index +vec4 sample_texture_array(int slot, int index, vec2 uv) { + if (index <= 0) return vec4(1.0); + + if (slot == 0) return texture(u_texture_albedo_array, vec3(uv, float(index - 1))); + if (slot == 1) return texture(u_texture_normal_array, vec3(uv, float(index - 1))); + if (slot == 2) return texture(u_texture_metallic_array, vec3(uv, float(index - 1))); + if (slot == 3) return texture(u_texture_roughness_array, vec3(uv, float(index - 1))); + if (slot == 4) return texture(u_texture_ao_array, vec3(uv, float(index - 1))); + if (slot == 5) return texture(u_texture_emission_array, vec3(uv, float(index - 1))); + + return vec4(1.0); +} + +// Apply normal map in world space +vec3 apply_normal_map(vec3 normal, vec2 texcoord, vec3 tangent, uint normal_handle) { + if (normal_handle == 0 || !u_enable_textures) return normal; + + vec3 T = normalize(tangent - normal * dot(tangent, normal)); + vec3 B = cross(normal, T); + mat3 TBN = mat3(T, B, normal); + + vec3 map_n = sample_texture_array(1, int(normal_handle), texcoord).xyz * 2.0 - 1.0; + return normalize(TBN * map_n); +} + +// Apply material textures to get final PBR values +void apply_material_textures(inout Material mat, inout vec3 normal, vec2 texcoord, vec3 tangent) { + if (!u_enable_textures) return; + + if (mat.texture_handles[0] != 0) { + mat.albedo = sample_texture_array(0, int(mat.texture_handles[0]), texcoord).rgb; + } + + if (mat.texture_handles[1] != 0) { + normal = apply_normal_map(normal, texcoord, tangent, mat.texture_handles[1]); + } + + if (mat.texture_handles[2] != 0) { + mat.metallic = sample_texture_array(2, int(mat.texture_handles[2]), texcoord).r; + } + + if (mat.texture_handles[3] != 0) { + mat.roughness = sample_texture_array(3, int(mat.texture_handles[3]), texcoord).r; + } + + if (mat.texture_handles[4] != 0) { + mat.ao = sample_texture_array(4, int(mat.texture_handles[4]), texcoord).r; + } + + if (mat.texture_handles[5] != 0) { + mat.emission = sample_texture_array(5, int(mat.texture_handles[5]), texcoord).rgb; + } +} + +// Fresnel functions +vec3 fresnel_schlick(float cos_theta, vec3 f0) { + return f0 + (1.0 - f0) * pow(1.0 - cos_theta, 5.0); +} + +float fresnel_dielectric(float cos_theta, float ior) { + float r0 = (1.0 - ior) / (1.0 + ior); + r0 = r0 * r0; + return r0 + (1.0 - r0) * pow(1.0 - cos_theta, 5.0); +} + +// Scatter functions +ScatterResult scatter_diffuse(Ray ray_in, HitInfo hit, Material mat, inout uint seed) { + ScatterResult r; + r.scattered = true; + r.attenuation = mat.albedo; + + vec3 dir = hit.normal + random_unit_vector(seed); + if (near_zero(dir)) dir = hit.normal; + + r.scattered_ray.origin = hit.position + hit.normal * EPSILON; + r.scattered_ray.direction = normalize(dir); + return r; +} + +ScatterResult scatter_metal(Ray ray_in, HitInfo hit, Material mat, inout uint seed) { + ScatterResult r; + + vec3 reflected = reflect_vector(normalize(ray_in.direction), hit.normal); + vec3 fuzz = mat.roughness * random_in_unit_sphere(seed); + vec3 dir = reflected + fuzz; + + r.scattered = dot(dir, hit.normal) > 0.0; + r.attenuation = mat.albedo; + r.scattered_ray.origin = hit.position + hit.normal * EPSILON; + r.scattered_ray.direction = normalize(dir); + return r; +} + +ScatterResult scatter_dielectric(Ray ray_in, HitInfo hit, Material mat, inout uint seed) { + ScatterResult r; + r.scattered = true; + r.attenuation = vec3(1.0); + + vec3 unit_dir = normalize(ray_in.direction); + float cos_theta = dot(-unit_dir, hit.normal); + float sin_theta = sqrt(max(0.0, 1.0 - cos_theta * cos_theta)); + + bool entering = cos_theta > 0.0; + float eta = entering ? (1.0 / mat.ior) : mat.ior; + vec3 normal = entering ? hit.normal : -hit.normal; + + float sin_theta_t = eta * sin_theta; + bool total_internal_reflection = sin_theta_t >= 1.0; + + float f0 = pow((1.0 - mat.ior) / (1.0 + mat.ior), 2.0); + float f = f0 + (1.0 - f0) * pow(1.0 - abs(cos_theta), 5.0); + + vec3 dir; + if (total_internal_reflection || random_float(seed) < f) { + dir = reflect_vector(unit_dir, normal); + } else { + dir = refract_vector(unit_dir, normal, eta); + } + + r.scattered_ray.origin = hit.position + dir * EPSILON; + r.scattered_ray.direction = normalize(dir); + return r; +} + +ScatterResult scatter_ray(Ray ray_in, HitInfo hit, Material mat, inout uint seed) { + if (mat.type == MATERIAL_DIFFUSE) return scatter_diffuse(ray_in, hit, mat, seed); + if (mat.type == MATERIAL_METAL) return scatter_metal(ray_in, hit, mat, seed); + if (mat.type == MATERIAL_DIELECTRIC) return scatter_dielectric(ray_in, hit, mat, seed); + + ScatterResult r; + r.scattered = false; + r.attenuation = vec3(0.0); + return r; +} + +// Fetch material with fallback +Material fetch_material(uint material_id) { + uint cnt = uint(materials.length()); + if (material_id < cnt) return materials[material_id]; + + Material m; + m.albedo = vec3(0.5); + m.metallic = 0.0; + m.emission = vec3(0.0); + m.roughness = 0.5; + m.type = MATERIAL_DIFFUSE; + m.ior = 1.5; + m.ao = 1.0; + return m; +} + +#endif // MATERIAL_GLSL diff --git a/shaders/include/math.glsl b/shaders/include/math.glsl new file mode 100644 index 0000000..9262127 --- /dev/null +++ b/shaders/include/math.glsl @@ -0,0 +1,24 @@ +// Math utility functions + +#ifndef MATH_GLSL +#define MATH_GLSL + +bool near_zero(vec3 v) { + return (abs(v.x) < EPSILON) && (abs(v.y) < EPSILON) && (abs(v.z) < EPSILON); +} + +vec3 reflect_vector(vec3 v, vec3 n) { + return v - 2.0 * dot(v, n) * n; +} + +vec3 refract_vector(vec3 uv, vec3 n, float etai_over_etat) { + float cos_theta = min(dot(-uv, n), 1.0); + vec3 r_out_perp = etai_over_etat * (uv + cos_theta * n); + vec3 r_out_parallel = -sqrt(abs(1.0 - dot(r_out_perp, r_out_perp))) * n; + return r_out_perp + r_out_parallel; +} + +uint as_uint(float f) { return floatBitsToUint(f); } +float as_float(uint u) { return uintBitsToFloat(u); } + +#endif // MATH_GLSL diff --git a/shaders/include/rng.glsl b/shaders/include/rng.glsl new file mode 100644 index 0000000..582c658 --- /dev/null +++ b/shaders/include/rng.glsl @@ -0,0 +1,21 @@ +// PCG Random Number Generator + +#ifndef RNG_GLSL +#define RNG_GLSL + +uint pcg_hash(uint seed) { + uint state = seed * 747796405u + 2891336453u; + uint word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u; + return (word >> 22u) ^ word; +} + +float random_float(inout uint seed) { + seed = pcg_hash(seed); + return float(seed) / 4294967296.0; +} + +vec3 random_vec3(inout uint seed) { + return vec3(random_float(seed), random_float(seed), random_float(seed)); +} + +#endif // RNG_GLSL diff --git a/shaders/include/sampling.glsl b/shaders/include/sampling.glsl new file mode 100644 index 0000000..00a2c38 --- /dev/null +++ b/shaders/include/sampling.glsl @@ -0,0 +1,18 @@ +// Sampling utility functions + +#ifndef SAMPLING_GLSL +#define SAMPLING_GLSL + +// Cosine-weighted hemisphere sampling (avoids infinite loop) +vec3 random_in_unit_sphere(inout uint seed) { + float z = 1.0 - 2.0 * random_float(seed); + float r = sqrt(max(0.0, 1.0 - z * z)); + float phi = 2.0 * PI * random_float(seed); + return vec3(r * cos(phi), r * sin(phi), z); +} + +vec3 random_unit_vector(inout uint seed) { + return normalize(random_in_unit_sphere(seed)); +} + +#endif // SAMPLING_GLSL diff --git a/shaders/include/structs.glsl b/shaders/include/structs.glsl new file mode 100644 index 0000000..11ce6f7 --- /dev/null +++ b/shaders/include/structs.glsl @@ -0,0 +1,69 @@ +// Data structures for ray tracing + +#ifndef STRUCTS_GLSL +#define STRUCTS_GLSL + +struct Material { + vec3 albedo; + vec3 emission; + float metallic; + float roughness; + int type; + float ior; + float ao; + float padding1; + uint texture_handles[6]; +}; + +struct Light { + vec3 position; + int type; + vec3 direction; + float intensity; + vec3 color; + float range; + vec2 spot_angles; + vec2 padding; +}; + +struct Ray { + vec3 origin; + vec3 direction; +}; + +struct HitInfo { + bool hit; + float t; + vec3 position; + vec3 normal; + vec2 texcoord; + vec3 tangent; + uint material_id; + int material_type; +}; + +struct ScatterResult { + bool scattered; + vec3 attenuation; + Ray scattered_ray; +}; + +struct BVHNodeGpu { + vec4 aabb_min_left_first; + vec4 aabb_max_count; +}; + +struct TriangleGpu { + vec4 v0_material; + vec4 v1; + vec4 v2; + vec4 n0; + vec4 n1; + vec4 n2; + vec4 uv0_uv1; + vec4 uv2; + vec4 t0; + vec4 t1; +}; + +#endif // STRUCTS_GLSL diff --git a/shaders/denoiser.comp b/shaders/postprocess/denoiser.comp similarity index 100% rename from shaders/denoiser.comp rename to shaders/postprocess/denoiser.comp diff --git a/shaders/screen_blit.frag b/shaders/postprocess/screen_blit.frag similarity index 100% rename from shaders/screen_blit.frag rename to shaders/postprocess/screen_blit.frag diff --git a/shaders/screen_blit.vert b/shaders/postprocess/screen_blit.vert similarity index 100% rename from shaders/screen_blit.vert rename to shaders/postprocess/screen_blit.vert diff --git a/shaders/raytracing.comp b/shaders/raytracing.comp deleted file mode 100644 index d8f5852..0000000 --- a/shaders/raytracing.comp +++ /dev/null @@ -1,759 +0,0 @@ -#version 430 core - -#define PI 3.14159265359 -#define INV_PI 0.31830988618 -#define EPSILON 1e-4 -#define MAX_FLOAT 3.402823466e38 -#define RR_THRESHOLD 0.1 - -#define MATERIAL_DIFFUSE 0 -#define MATERIAL_METAL 1 -#define MATERIAL_DIELECTRIC 2 -#define MATERIAL_EMISSIVE 3 - -#define LIGHT_DIRECTIONAL 0 -#define LIGHT_POINT 1 -#define LIGHT_SPOT 2 - -layout(local_size_x = 16, local_size_y = 16) in; - -// G-Buffer inputs -layout(binding = 0, rgba32f) uniform readonly image2D g_position; -layout(binding = 1, rgba32f) uniform readonly image2D g_normal; - -// Material params + material id (for primary hit fast-path) -layout(binding = 5, rgba32f) uniform readonly image2D g_material; -layout(binding = 6, r32ui) uniform readonly uimage2D g_material_id; - -// Texcoord from G-Buffer -layout(binding = 7, rgba32f) uniform readonly image2D g_texcoord; - -// Tangent from G-Buffer -layout(binding = 8, rgba32f) uniform readonly image2D g_tangent; - -// Output -layout(binding = 3, rgba32f) uniform image2D output_image; -layout(binding = 4, rgba32f) uniform image2D accumulation_image; - -struct Material { - vec3 albedo; - vec3 emission; - float metallic; - float roughness; - int type; - float ior; - float ao; // ambient occlusion - float padding1; - uint texture_handles[6]; -}; - -struct Light { - vec3 position; - int type; - vec3 direction; - float intensity; - vec3 color; - float range; - vec2 spot_angles; - vec2 padding; -}; - -struct Ray { - vec3 origin; - vec3 direction; -}; - -struct HitInfo { - bool hit; - float t; - vec3 position; - vec3 normal; - vec2 texcoord; - vec3 tangent; - uint material_id; - int material_type; // material type from G-Buffer -}; - -struct ScatterResult { - bool scattered; - vec3 attenuation; - Ray scattered_ray; -}; - -struct BVHNodeGpu { - vec4 aabb_min_left_first; // xyz min, w = left_first (uint bits in float) - vec4 aabb_max_count; // xyz max, w = count (uint bits in float) -}; - -struct TriangleGpu { - vec4 v0_material; // xyz v0, w material_id (uint bits in float) - vec4 v1; - vec4 v2; - vec4 n0; - vec4 n1; - vec4 n2; - vec4 uv0_uv1; // xy uv0, zw uv1 - vec4 uv2; // xy uv2 - vec4 t0; // tangent at v0 - vec4 t1; // tangent at v1 -}; - -layout(std430, binding = 0) readonly buffer MaterialBuffer { Material materials[]; }; -layout(std430, binding = 1) readonly buffer LightBuffer { Light lights[]; }; -layout(std430, binding = 2) readonly buffer BVHNodeBuffer { BVHNodeGpu bvh_nodes[]; }; -layout(std430, binding = 3) readonly buffer TriangleBuffer { TriangleGpu bvh_tris[]; }; - -uniform uint u_frame_count; -uniform uint u_samples_per_pixel; -uniform uint u_max_depth; -uniform uint u_light_count; -uniform mat4 u_inv_view_projection; -uniform bool u_enable_accumulation; -uniform bool u_use_bvh; -uniform uint u_bvh_node_count; -uniform bool u_enable_textures; - -// Global texture arrays for bindless sampling (6 arrays for each texture type) -layout(binding = 10) uniform sampler2DArray u_texture_albedo_array; -layout(binding = 11) uniform sampler2DArray u_texture_normal_array; -layout(binding = 12) uniform sampler2DArray u_texture_metallic_array; -layout(binding = 13) uniform sampler2DArray u_texture_roughness_array; -layout(binding = 14) uniform sampler2DArray u_texture_ao_array; -layout(binding = 15) uniform sampler2DArray u_texture_emission_array; - -// Helper function to sample texture from array by index -vec4 sample_texture_array(int slot, int index, vec2 uv) { - if (index <= 0) return vec4(1.0); - - if (slot == 0) return texture(u_texture_albedo_array, vec3(uv, float(index - 1))); - if (slot == 1) return texture(u_texture_normal_array, vec3(uv, float(index - 1))); - if (slot == 2) return texture(u_texture_metallic_array, vec3(uv, float(index - 1))); - if (slot == 3) return texture(u_texture_roughness_array, vec3(uv, float(index - 1))); - if (slot == 4) return texture(u_texture_ao_array, vec3(uv, float(index - 1))); - if (slot == 5) return texture(u_texture_emission_array, vec3(uv, float(index - 1))); - - return vec4(1.0); -} - -// ============================================================================ -// Utility -// ============================================================================ - -/* - * @brief Check if vector is near zero - */ -bool near_zero(vec3 v) { - return (abs(v.x) < EPSILON) && (abs(v.y) < EPSILON) && (abs(v.z) < EPSILON); -} - -/* - * @brief Reflect vector around normal - */ -vec3 reflect_vector(vec3 v, vec3 n) { - return v - 2.0 * dot(v, n) * n; -} - -/* - * @brief Refract vector through surface - */ -vec3 refract_vector(vec3 uv, vec3 n, float etai_over_etat) { - float cos_theta = min(dot(-uv, n), 1.0); - vec3 r_out_perp = etai_over_etat * (uv + cos_theta * n); - vec3 r_out_parallel = -sqrt(abs(1.0 - dot(r_out_perp, r_out_perp))) * n; - return r_out_perp + r_out_parallel; -} - -uint as_uint(float f) { return floatBitsToUint(f); } -float as_float(uint u) { return uintBitsToFloat(u); } - -// ============================================================================ -// RNG (PCG) -// ============================================================================ - -uint pcg_hash(uint seed) { - uint state = seed * 747796405u + 2891336453u; - uint word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u; - return (word >> 22u) ^ word; -} - -float random_float(inout uint seed) { - seed = pcg_hash(seed); - return float(seed) / 4294967296.0; -} - -vec3 random_vec3(inout uint seed) { - return vec3(random_float(seed), random_float(seed), random_float(seed)); -} - -vec3 random_in_unit_sphere(inout uint seed) { - // Use cosine-weighted hemisphere sampling to avoid infinite loop - float z = 1.0 - 2.0 * random_float(seed); - float r = sqrt(max(0.0, 1.0 - z * z)); - float phi = 2.0 * PI * random_float(seed); - return vec3(r * cos(phi), r * sin(phi), z); -} - -vec3 random_unit_vector(inout uint seed) { - return normalize(random_in_unit_sphere(seed)); -} - -// ============================================================================ -// Camera ray -// ============================================================================ - -/* - * @brief Generate primary ray in world space (center pixel, no jitter) - */ -Ray generate_camera_ray(ivec2 pixel_coords, ivec2 image_size) { - vec2 uv = (vec2(pixel_coords) + vec2(0.5)) / vec2(image_size); - vec2 ndc = uv * 2.0 - 1.0; - - vec4 p_near = u_inv_view_projection * vec4(ndc, 0.0, 1.0); - vec4 p_far = u_inv_view_projection * vec4(ndc, 1.0, 1.0); - vec3 near_ws = p_near.xyz / p_near.w; - vec3 far_ws = p_far.xyz / p_far.w; - - Ray r; - r.origin = near_ws; - r.direction = normalize(far_ws - near_ws); - return r; -} - -// ============================================================================ -// Intersection -// ============================================================================ - -/* - * @brief Ray-AABB intersection - */ -bool intersect_aabb(Ray ray, vec3 aabb_min, vec3 aabb_max, float t_max) { - vec3 inv_d = 1.0 / ray.direction; - vec3 t0 = (aabb_min - ray.origin) * inv_d; - vec3 t1 = (aabb_max - ray.origin) * inv_d; - - vec3 tmin3 = min(t0, t1); - vec3 tmax3 = max(t0, t1); - - float tmin = max(max(tmin3.x, tmin3.y), tmin3.z); - float tmax2 = min(min(tmax3.x, tmax3.y), tmax3.z); - - return (tmax2 >= max(tmin, 0.0)) && (tmin <= t_max); -} - -/* - * @brief Moller-Trumbore triangle intersection - */ -bool intersect_triangle(Ray ray, TriangleGpu tri, inout HitInfo hit) { - vec3 v0 = tri.v0_material.xyz; - vec3 v1 = tri.v1.xyz; - vec3 v2 = tri.v2.xyz; - - vec3 e1 = v1 - v0; - vec3 e2 = v2 - v0; - vec3 pvec = cross(ray.direction, e2); - float det = dot(e1, pvec); - - if (abs(det) < EPSILON) return false; - float inv_det = 1.0 / det; - - vec3 tvec = ray.origin - v0; - float u = dot(tvec, pvec) * inv_det; - if (u < 0.0 || u > 1.0) return false; - - vec3 qvec = cross(tvec, e1); - float v = dot(ray.direction, qvec) * inv_det; - if (v < 0.0 || u + v > 1.0) return false; - - float t = dot(e2, qvec) * inv_det; - if (t < EPSILON || t >= hit.t) return false; - - float w = 1.0 - u - v; - vec3 n0 = tri.n0.xyz; - vec3 n1 = tri.n1.xyz; - vec3 n2 = tri.n2.xyz; - - vec2 uv0 = tri.uv0_uv1.xy; - vec2 uv1 = tri.uv0_uv1.zw; - vec2 uv2 = tri.uv2.xy; - - // Interpolate tangents - vec3 t0 = tri.t0.xyz; - vec3 t1 = tri.t1.xyz; - // Compute t2 from normal and t0 (t2 = cross(n, t0)) - vec3 t2 = normalize(cross(n0, t0)); // approximate third tangent - - hit.hit = true; - hit.t = t; - hit.position = ray.origin + t * ray.direction; - hit.normal = normalize(n0 * w + n1 * u + n2 * v); - hit.texcoord = uv0 * w + uv1 * u + uv2 * v; - - // Interpolate tangent using barycentric coordinates - hit.tangent = normalize(t0 * w + t1 * u + t2 * v); - - hit.material_id = as_uint(tri.v0_material.w); - return true; -} - -/* - * @brief BVH traversal (closest hit) - */ -HitInfo trace_ray_bvh(Ray ray) { - HitInfo hit; - hit.hit = false; - hit.t = MAX_FLOAT; - - if (!u_use_bvh || u_bvh_node_count == 0u) { - return hit; - } - - uint stack[64]; - int sp = 0; - stack[sp++] = 0u; - - while (sp > 0) { - uint node_idx = stack[--sp]; - if (node_idx >= u_bvh_node_count) continue; - - BVHNodeGpu node = bvh_nodes[node_idx]; - vec3 bmin = node.aabb_min_left_first.xyz; - vec3 bmax = node.aabb_max_count.xyz; - uint left_first = as_uint(node.aabb_min_left_first.w); - uint count = as_uint(node.aabb_max_count.w); - - if (!intersect_aabb(ray, bmin, bmax, hit.t)) continue; - - if (count > 0u) { - for (uint i = 0u; i < count; ++i) { - TriangleGpu tri = bvh_tris[left_first + i]; - intersect_triangle(ray, tri, hit); - } - } else { - uint left = left_first; - uint right = left_first + 1u; - if (sp < 63) stack[sp++] = right; - if (sp < 63) stack[sp++] = left; - } - } - - return hit; -} - -/* - * @brief Any-hit BVH for shadow ray - */ -bool trace_any_bvh(Ray ray, float t_max) { - if (!u_use_bvh || u_bvh_node_count == 0u) return false; - - uint stack[64]; - int sp = 0; - stack[sp++] = 0u; - - HitInfo hit; - hit.hit = false; - hit.t = t_max; - - while (sp > 0) { - uint node_idx = stack[--sp]; - if (node_idx >= u_bvh_node_count) continue; - - BVHNodeGpu node = bvh_nodes[node_idx]; - vec3 bmin = node.aabb_min_left_first.xyz; - vec3 bmax = node.aabb_max_count.xyz; - uint left_first = as_uint(node.aabb_min_left_first.w); - uint count = as_uint(node.aabb_max_count.w); - - if (!intersect_aabb(ray, bmin, bmax, hit.t)) continue; - - if (count > 0u) { - for (uint i = 0u; i < count; ++i) { - TriangleGpu tri = bvh_tris[left_first + i]; - if (intersect_triangle(ray, tri, hit)) return true; - } - } else { - uint left = left_first; - uint right = left_first + 1u; - if (sp < 63) stack[sp++] = right; - if (sp < 63) stack[sp++] = left; - } - } - - return false; -} - -// ============================================================================ -// Primary-ray fast path via G-Buffer -// ============================================================================ - -/* - * @brief Read primary hit from G-Buffer if current pixel has geometry - * @note Uses g_position.w as "valid" marker (your gbuffer writes 1.0 on hits, clear is 0). - */ -HitInfo trace_primary_gbuffer(Ray ray, ivec2 pixel_coords) { - HitInfo hit; - hit.hit = false; - hit.t = MAX_FLOAT; - hit.position = vec3(0.0); - hit.normal = vec3(0.0, 1.0, 0.0); - hit.texcoord = vec2(0.0); - hit.tangent = vec3(0.0); - hit.material_id = 0u; - hit.material_type = 0; - - vec4 pos = imageLoad(g_position, pixel_coords); - if (pos.w <= 0.5) { - return hit; - } - - vec3 p = pos.xyz; - vec3 n = normalize(imageLoad(g_normal, pixel_coords).xyz); - - // integer material id - uint mid = imageLoad(g_material_id, pixel_coords).r; - - // material type stored in g_material.w - vec4 mat = imageLoad(g_material, pixel_coords); - int mtype = int(mat.w); - - // Read texcoord from G-Buffer - vec4 texcoord_tangent = imageLoad(g_texcoord, pixel_coords); - vec2 texcoord = texcoord_tangent.xy; - - // Read tangent from G-Buffer - vec4 tangent_data = imageLoad(g_tangent, pixel_coords); - vec3 tangent = tangent_data.xyz; - - hit.hit = true; - hit.position = p; - hit.normal = n; - hit.texcoord = texcoord; - hit.tangent = tangent; - hit.material_id = mid; - hit.material_type = mtype; - - // For RR/any debug usage; path tracing uses this as starting point only. - hit.t = length(p - ray.origin); - - return hit; -} - -// ============================================================================ -// Material + scattering -// ============================================================================ - -// Apply normal map in world space -vec3 apply_normal_map(vec3 normal, vec2 texcoord, vec3 tangent, uint normal_handle) { - if (normal_handle == 0 || !u_enable_textures) return normal; - - vec3 T = normalize(tangent - normal * dot(tangent, normal)); - vec3 B = cross(normal, T); - mat3 TBN = mat3(T, B, normal); - - vec3 map_n = sample_texture_array(1, int(normal_handle), texcoord).xyz * 2.0 - 1.0; - return normalize(TBN * map_n); -} - -// Apply material textures to get final PBR values -void apply_material_textures(inout Material mat, inout vec3 normal, vec2 texcoord, vec3 tangent) { - if (!u_enable_textures) return; - - // Albedo texture (replace) - if (mat.texture_handles[0] != 0) { - mat.albedo = sample_texture_array(0, int(mat.texture_handles[0]), texcoord).rgb; - } - - // Normal map - if (mat.texture_handles[1] != 0) { - normal = apply_normal_map(normal, texcoord, tangent, mat.texture_handles[1]); - } - - // Metallic texture (replace) - if (mat.texture_handles[2] != 0) { - mat.metallic = sample_texture_array(2, int(mat.texture_handles[2]), texcoord).r; - } - - // Roughness texture (replace) - if (mat.texture_handles[3] != 0) { - mat.roughness = sample_texture_array(3, int(mat.texture_handles[3]), texcoord).r; - } - - // AO texture (store in material, apply during lighting) - if (mat.texture_handles[4] != 0) { - mat.ao = sample_texture_array(4, int(mat.texture_handles[4]), texcoord).r; - } - - // Emission texture (replace) - if (mat.texture_handles[5] != 0) { - mat.emission = sample_texture_array(5, int(mat.texture_handles[5]), texcoord).rgb; - } -} - -vec3 fresnel_schlick(float cos_theta, vec3 f0) { - return f0 + (1.0 - f0) * pow(1.0 - cos_theta, 5.0); -} - -float fresnel_dielectric(float cos_theta, float ior) { - float r0 = (1.0 - ior) / (1.0 + ior); - r0 = r0 * r0; - return r0 + (1.0 - r0) * pow(1.0 - cos_theta, 5.0); -} - -ScatterResult scatter_diffuse(Ray ray_in, HitInfo hit, Material mat, inout uint seed) { - ScatterResult r; - r.scattered = true; - r.attenuation = mat.albedo; - - vec3 dir = hit.normal + random_unit_vector(seed); - if (near_zero(dir)) dir = hit.normal; - - r.scattered_ray.origin = hit.position + hit.normal * EPSILON; - r.scattered_ray.direction = normalize(dir); - return r; -} - -ScatterResult scatter_metal(Ray ray_in, HitInfo hit, Material mat, inout uint seed) { - ScatterResult r; - - vec3 reflected = reflect_vector(normalize(ray_in.direction), hit.normal); - vec3 fuzz = mat.roughness * random_in_unit_sphere(seed); - vec3 dir = reflected + fuzz; - - r.scattered = dot(dir, hit.normal) > 0.0; - r.attenuation = mat.albedo; - r.scattered_ray.origin = hit.position + hit.normal * EPSILON; - r.scattered_ray.direction = normalize(dir); - return r; -} - -ScatterResult scatter_dielectric(Ray ray_in, HitInfo hit, Material mat, inout uint seed) { - ScatterResult r; - r.scattered = true; - r.attenuation = vec3(1.0); - - vec3 unit_dir = normalize(ray_in.direction); - float cos_theta = dot(-unit_dir, hit.normal); - float sin_theta = sqrt(max(0.0, 1.0 - cos_theta * cos_theta)); - - // Determine if ray is entering or exiting the material - // If dot(dir, normal) < 0, ray is entering (from air into material) - bool entering = cos_theta > 0.0; - - // eta: ratio of indices (etai/etat) - // Entering: eta = 1.0/ior (air to material) - // Exiting: eta = ior/1.0 (material to air) - float eta = entering ? (1.0 / mat.ior) : mat.ior; - - // Use correct normal for refraction calculation - // When exiting, we need to use -normal - vec3 normal = entering ? hit.normal : -hit.normal; - - // Check for total internal reflection - float sin_theta_t = eta * sin_theta; - bool total_internal_reflection = sin_theta_t >= 1.0; - - // Fresnel reflectance (Schlick approximation) - float f0 = pow((1.0 - mat.ior) / (1.0 + mat.ior), 2.0); - float f = f0 + (1.0 - f0) * pow(1.0 - abs(cos_theta), 5.0); - - vec3 dir; - if (total_internal_reflection || random_float(seed) < f) { - // Reflect - dir = reflect_vector(unit_dir, normal); - } else { - // Refract - dir = refract_vector(unit_dir, normal, eta); - } - - r.scattered_ray.origin = hit.position + dir * EPSILON; - r.scattered_ray.direction = normalize(dir); - return r; -} - -ScatterResult scatter_ray(Ray ray_in, HitInfo hit, Material mat, inout uint seed) { - if (mat.type == MATERIAL_DIFFUSE) return scatter_diffuse(ray_in, hit, mat, seed); - if (mat.type == MATERIAL_METAL) return scatter_metal(ray_in, hit, mat, seed); - if (mat.type == MATERIAL_DIELECTRIC) return scatter_dielectric(ray_in, hit, mat, seed); - - ScatterResult r; - r.scattered = false; - r.attenuation = vec3(0.0); - return r; -} - -// ============================================================================ -// Direct lighting (with shadow ray) -// ============================================================================ - -vec3 eval_direct_lighting(inout HitInfo hit, Material mat, inout uint seed) { - if (u_light_count == 0u) return vec3(0.0); - - uint light_idx = uint(random_float(seed) * float(u_light_count)) % u_light_count; - Light light = lights[light_idx]; - - vec3 L; - float dist = MAX_FLOAT; - vec3 radiance = vec3(0.0); - - if (light.type == LIGHT_POINT) { - vec3 to_light = light.position - hit.position; - dist = length(to_light); - if (dist > light.range) return vec3(0.0); - L = to_light / dist; - - float atten = 1.0 / max(dist * dist, 0.01); - radiance = light.color * light.intensity * atten; - } else if (light.type == LIGHT_DIRECTIONAL) { - L = normalize(-light.direction); - radiance = light.color * light.intensity; - } else { - return vec3(0.0); - } - - float n_dot_l = max(dot(hit.normal, L), 0.0); - if (n_dot_l <= 0.0) return vec3(0.0); - - Ray shadow_ray; - shadow_ray.origin = hit.position + hit.normal * EPSILON; - shadow_ray.direction = L; - - float t_max = (light.type == LIGHT_POINT) ? (dist - EPSILON) : MAX_FLOAT; - if (trace_any_bvh(shadow_ray, t_max)) return vec3(0.0); - - float pdf_light = 1.0 / float(u_light_count); - vec3 brdf = mat.albedo * INV_PI; - // Apply AO to the final lighting - return brdf * radiance * n_dot_l * mat.ao / max(pdf_light, EPSILON); -} - -// ============================================================================ -// Path tracing -// ============================================================================ - -Material fetch_material(uint material_id) { - uint cnt = uint(materials.length()); - if (material_id < cnt) return materials[material_id]; - - Material m; - m.albedo = vec3(0.5); - m.metallic = 0.0; - m.emission = vec3(0.0); - m.roughness = 0.5; - m.type = MATERIAL_DIFFUSE; - m.ior = 1.5; - m.ao = 1.0; // default: no AO - return m; -} - -vec3 environment_color(vec3 dir) { - return vec3(0.1, 0.1, 0.15); -} - -/* - * @brief Trace path with primary-ray G-Buffer acceleration - */ -vec3 trace_path_primary_gbuffer(ivec2 pixel_coords, ivec2 image_size, inout uint seed) { - Ray ray = generate_camera_ray(pixel_coords, image_size); - - vec3 radiance = vec3(0.0); - vec3 throughput = vec3(1.0); - - // Depth 0: try G-Buffer hit first - HitInfo hit0 = trace_primary_gbuffer(ray, pixel_coords); - if (hit0.hit) { - Material mat0 = fetch_material(hit0.material_id); - - // Override material type from G-Buffer if available - if (hit0.material_type >= 0) { - mat0.type = hit0.material_type; - } - - // Apply PBR textures (use tangent from G-Buffer if available) - apply_material_textures(mat0, hit0.normal, hit0.texcoord, hit0.tangent); - - radiance += throughput * mat0.emission; - - ScatterResult sc0 = scatter_ray(ray, hit0, mat0, seed); - if (!sc0.scattered) return radiance; - - throughput *= sc0.attenuation; - ray = sc0.scattered_ray; - } - - // Subsequent bounces: BVH - for (uint depth = (hit0.hit ? 1u : 0u); depth < u_max_depth; ++depth) { - HitInfo hit = trace_ray_bvh(ray); - if (!hit.hit) { - radiance += throughput * environment_color(ray.direction); - break; - } - - Material mat = fetch_material(hit.material_id); - - // Apply PBR textures (use tangent from intersection) - apply_material_textures(mat, hit.normal, hit.texcoord, hit.tangent); - - radiance += throughput * mat.emission; - - ScatterResult sc = scatter_ray(ray, hit, mat, seed); - if (!sc.scattered) break; - - throughput *= sc.attenuation; - - if (depth > 3u) { - float p = max(throughput.r, max(throughput.g, throughput.b)); - p = clamp(p, 0.0, 0.95); - if (p < RR_THRESHOLD || random_float(seed) > p) break; - throughput /= p; - } - - ray = sc.scattered_ray; - - if (all(lessThan(throughput, vec3(EPSILON)))) break; - } - - return radiance; -} - -// ACES Filmic Tone Mapping -vec3 aces_tonemap(vec3 x) { - float a = 2.51; - float b = 0.03; - float c = 2.43; - float d = 0.59; - float e = 0.14; - return clamp((x * (a * x + b)) / (x * (c * x + d) + e), 0.0, 1.0); -} - -void main() { - ivec2 pixel_coords = ivec2(gl_GlobalInvocationID.xy); - ivec2 image_size = imageSize(output_image); - if (pixel_coords.x >= image_size.x || pixel_coords.y >= image_size.y) return; - - uint base_seed = uint(pixel_coords.x) + uint(pixel_coords.y) * uint(image_size.x); - uint seed = base_seed + u_frame_count * 719393u; - - vec3 color = vec3(0.0); - uint spp = max(u_samples_per_pixel, 1u); - - for (uint s = 0u; s < spp; ++s) { - color += trace_path_primary_gbuffer(pixel_coords, image_size, seed); - } - color /= float(spp); - - color = clamp(color, vec3(0.0), vec3(100.0)); - - // Store HDR color to accumulation buffer BEFORE tone mapping - vec3 accumulation_color = color; - - if (u_enable_accumulation && u_frame_count > 0u) { - vec3 accumulated = imageLoad(accumulation_image, pixel_coords).rgb; - float w = 1.0 / float(u_frame_count + 1u); - accumulation_color = mix(accumulated, color, w); - } - - // Apply ACES tone mapping to output (not accumulation) - vec3 output_color = aces_tonemap(accumulation_color); - - imageStore(accumulation_image, pixel_coords, vec4(accumulation_color, 1.0)); - imageStore(output_image, pixel_coords, vec4(output_color, 1.0)); -} diff --git a/shaders/raytracing/raytracing.comp b/shaders/raytracing/raytracing.comp new file mode 100644 index 0000000..57c52c4 --- /dev/null +++ b/shaders/raytracing/raytracing.comp @@ -0,0 +1,171 @@ +#version 430 core + +// Include shared modules +#include "../include/common.glsl" +#include "../include/structs.glsl" +#include "../include/math.glsl" +#include "../include/rng.glsl" +#include "../include/sampling.glsl" + +// Workgroup size +layout(local_size_x = 16, local_size_y = 16) in; + +// G-Buffer inputs +layout(binding = 0, rgba32f) uniform readonly image2D g_position; +layout(binding = 1, rgba32f) uniform readonly image2D g_normal; +layout(binding = 5, rgba32f) uniform readonly image2D g_material; +layout(binding = 6, r32ui) uniform readonly uimage2D g_material_id; +layout(binding = 7, rgba32f) uniform readonly image2D g_texcoord; +layout(binding = 8, rgba32f) uniform readonly image2D g_tangent; + +// Output +layout(binding = 3, rgba32f) uniform image2D output_image; +layout(binding = 4, rgba32f) uniform image2D accumulation_image; + +// SSBO bindings +layout(std430, binding = 0) readonly buffer MaterialBuffer { Material materials[]; }; +layout(std430, binding = 1) readonly buffer LightBuffer { Light lights[]; }; +layout(std430, binding = 2) readonly buffer BVHNodeBuffer { BVHNodeGpu bvh_nodes[]; }; +layout(std430, binding = 3) readonly buffer TriangleBuffer { TriangleGpu bvh_tris[]; }; + +// Uniforms +uniform uint u_frame_count; +uniform uint u_samples_per_pixel; +uniform uint u_max_depth; +uniform uint u_light_count; +uniform mat4 u_inv_view_projection; +uniform bool u_enable_accumulation; +uniform bool u_use_bvh; +uniform uint u_bvh_node_count; +uniform bool u_enable_textures; + +// Texture arrays +layout(binding = 10) uniform sampler2DArray u_texture_albedo_array; +layout(binding = 11) uniform sampler2DArray u_texture_normal_array; +layout(binding = 12) uniform sampler2DArray u_texture_metallic_array; +layout(binding = 13) uniform sampler2DArray u_texture_roughness_array; +layout(binding = 14) uniform sampler2DArray u_texture_ao_array; +layout(binding = 15) uniform sampler2DArray u_texture_emission_array; + +// Include material, BVH, and lighting modules (needs uniform declarations above) +#include "../include/material.glsl" +#include "../include/bvh.glsl" +#include "../include/lighting.glsl" + +// Generate camera ray (center pixel, no jitter) +Ray generate_camera_ray(ivec2 pixel_coords, ivec2 image_size) { + vec2 uv = (vec2(pixel_coords) + vec2(0.5)) / vec2(image_size); + vec2 ndc = uv * 2.0 - 1.0; + + vec4 p_near = u_inv_view_projection * vec4(ndc, 0.0, 1.0); + vec4 p_far = u_inv_view_projection * vec4(ndc, 1.0, 1.0); + vec3 near_ws = p_near.xyz / p_near.w; + vec3 far_ws = p_far.xyz / p_far.w; + + Ray r; + r.origin = near_ws; + r.direction = normalize(far_ws - near_ws); + return r; +} + +// Path tracing with G-Buffer acceleration for primary ray +vec3 trace_path_primary_gbuffer(ivec2 pixel_coords, ivec2 image_size, inout uint seed) { + Ray ray = generate_camera_ray(pixel_coords, image_size); + + vec3 radiance = vec3(0.0); + vec3 throughput = vec3(1.0); + + // Depth 0: try G-Buffer hit first + HitInfo hit0 = trace_primary_gbuffer(ray, pixel_coords); + if (hit0.hit) { + Material mat0 = fetch_material(hit0.material_id); + + if (hit0.material_type >= 0) { + mat0.type = hit0.material_type; + } + + apply_material_textures(mat0, hit0.normal, hit0.texcoord, hit0.tangent); + + radiance += throughput * mat0.emission; + + ScatterResult sc0 = scatter_ray(ray, hit0, mat0, seed); + if (!sc0.scattered) return radiance; + + throughput *= sc0.attenuation; + ray = sc0.scattered_ray; + } + + // Subsequent bounces: BVH + for (uint depth = (hit0.hit ? 1u : 0u); depth < u_max_depth; ++depth) { + HitInfo hit = trace_ray_bvh(ray); + if (!hit.hit) { + radiance += throughput * environment_color(ray.direction); + break; + } + + Material mat = fetch_material(hit.material_id); + apply_material_textures(mat, hit.normal, hit.texcoord, hit.tangent); + + radiance += throughput * mat.emission; + + ScatterResult sc = scatter_ray(ray, hit, mat, seed); + if (!sc.scattered) break; + + throughput *= sc.attenuation; + + if (depth > 3u) { + float p = max(throughput.r, max(throughput.g, throughput.b)); + p = clamp(p, 0.0, 0.95); + if (p < RR_THRESHOLD || random_float(seed) > p) break; + throughput /= p; + } + + ray = sc.scattered_ray; + + if (all(lessThan(throughput, vec3(EPSILON)))) break; + } + + return radiance; +} + +// ACES Filmic Tone Mapping +vec3 aces_tonemap(vec3 x) { + float a = 2.51; + float b = 0.03; + float c = 2.43; + float d = 0.59; + float e = 0.14; + return clamp((x * (a * x + b)) / (x * (c * x + d) + e), 0.0, 1.0); +} + +void main() { + ivec2 pixel_coords = ivec2(gl_GlobalInvocationID.xy); + ivec2 image_size = imageSize(output_image); + if (pixel_coords.x >= image_size.x || pixel_coords.y >= image_size.y) return; + + uint base_seed = uint(pixel_coords.x) + uint(pixel_coords.y) * uint(image_size.x); + uint seed = base_seed + u_frame_count * 719393u; + + vec3 color = vec3(0.0); + uint spp = max(u_samples_per_pixel, 1u); + + for (uint s = 0u; s < spp; ++s) { + color += trace_path_primary_gbuffer(pixel_coords, image_size, seed); + } + color /= float(spp); + + color = clamp(color, vec3(0.0), vec3(100.0)); + + vec3 accumulation_color = color; + + if (u_enable_accumulation && u_frame_count > 0u) { + vec3 accumulated = imageLoad(accumulation_image, pixel_coords).rgb; + float w = 1.0 / float(u_frame_count + 1u); + accumulation_color = mix(accumulated, color, w); + } + + vec3 output_color = aces_tonemap(accumulation_color); + + imageStore(accumulation_image, pixel_coords, vec4(accumulation_color, 1.0)); + imageStore(output_image, pixel_coords, vec4(output_color, 1.0)); +} diff --git a/src/core/shader_manager.cpp b/src/core/shader_manager.cpp index f22fa51..976d334 100644 --- a/src/core/shader_manager.cpp +++ b/src/core/shader_manager.cpp @@ -4,133 +4,135 @@ namespace are { ShaderManager::ShaderManager() - : initialized_(false) { + : initialized_(false) { } ShaderManager::~ShaderManager() { - release(); + release(); } bool ShaderManager::initialize() { - if (initialized_) { - ARE_LOG_WARN("ShaderManager already initialized"); - return true; - } - - ARE_LOG_INFO("Loading built-in shaders..."); - - if (!load_builtin_shaders_()) { - ARE_LOG_ERROR("Failed to load built-in shaders"); - return false; - } - - initialized_ = true; - ARE_LOG_INFO("ShaderManager initialized successfully"); - return true; + if (initialized_) { + ARE_LOG_WARN("ShaderManager already initialized"); + return true; + } + + ARE_LOG_INFO("Loading built-in shaders..."); + + if (!load_builtin_shaders_()) { + ARE_LOG_ERROR("Failed to load built-in shaders"); + return false; + } + + initialized_ = true; + ARE_LOG_INFO("ShaderManager initialized successfully"); + return true; } void ShaderManager::release() { - if (!initialized_) return; + if (!initialized_) + return; - shader_cache_.clear(); + shader_cache_.clear(); - gbuffer_shader_.reset(); + gbuffer_shader_.reset(); screen_blit_shader_.reset(); - raytracing_shader_.reset(); + raytracing_shader_.reset(); denoise_shader_.reset(); - initialized_ = false; - ARE_LOG_INFO("ShaderManager released"); + initialized_ = false; + ARE_LOG_INFO("ShaderManager released"); } -std::shared_ptr ShaderManager::load_shader(const std::string& name, - const std::string& vertex_path, - const std::string& fragment_path) { - auto it = shader_cache_.find(name); - if (it != shader_cache_.end()) { - ARE_LOG_INFO("Shader '" + name + "' loaded from cache"); - return it->second; - } +std::shared_ptr ShaderManager::load_shader(const std::string &name, + const std::string &vertex_path, + const std::string &fragment_path) { + auto it = shader_cache_.find(name); + if (it != shader_cache_.end()) { + ARE_LOG_INFO("Shader '" + name + "' loaded from cache"); + return it->second; + } - auto shader = std::make_shared(); - if (!shader->load(vertex_path, fragment_path)) { - ARE_LOG_ERROR("Failed to load shader '" + name + "'"); - return nullptr; - } + auto shader = std::make_shared(); + if (!shader->load(vertex_path, fragment_path)) { + ARE_LOG_ERROR("Failed to load shader '" + name + "'"); + return nullptr; + } - shader_cache_[name] = shader; - ARE_LOG_INFO("Shader '" + name + "' loaded successfully"); - return shader; + shader_cache_[name] = shader; + ARE_LOG_INFO("Shader '" + name + "' loaded successfully"); + return shader; } -std::shared_ptr ShaderManager::load_compute_shader(const std::string& name, - const std::string& compute_path) { - auto it = shader_cache_.find(name); - if (it != shader_cache_.end()) { - ARE_LOG_INFO("Compute shader '" + name + "' loaded from cache"); - return it->second; - } +std::shared_ptr ShaderManager::load_compute_shader(const std::string &name, + const std::string &compute_path) { + auto it = shader_cache_.find(name); + if (it != shader_cache_.end()) { + ARE_LOG_INFO("Compute shader '" + name + "' loaded from cache"); + return it->second; + } - auto shader = std::make_shared(); - if (!shader->load_compute(compute_path)) { - ARE_LOG_ERROR("Failed to load compute shader '" + name + "'"); - return nullptr; - } + auto shader = std::make_shared(); + if (!shader->load_compute(compute_path)) { + ARE_LOG_ERROR("Failed to load compute shader '" + name + "'"); + return nullptr; + } - shader_cache_[name] = shader; - ARE_LOG_INFO("Compute shader '" + name + "' loaded successfully"); - return shader; + shader_cache_[name] = shader; + ARE_LOG_INFO("Compute shader '" + name + "' loaded successfully"); + return shader; } -std::shared_ptr ShaderManager::get_shader(const std::string& name) const { - auto it = shader_cache_.find(name); - if (it != shader_cache_.end()) return it->second; +std::shared_ptr ShaderManager::get_shader(const std::string &name) const { + auto it = shader_cache_.find(name); + if (it != shader_cache_.end()) + return it->second; - ARE_LOG_WARN("Shader '" + name + "' not found in cache"); - return nullptr; + ARE_LOG_WARN("Shader '" + name + "' not found in cache"); + return nullptr; } bool ShaderManager::load_builtin_shaders_() { // Load G-buffer shader ARE_LOG_INFO("Loading G-buffer shaders.."); - gbuffer_shader_ = std::make_shared(); - if (!gbuffer_shader_->load("shaders/gbuffer.vert", "shaders/gbuffer.frag")) { - ARE_LOG_ERROR("Failed to load G-Buffer shader"); - return false; - } - shader_cache_["gbuffer"] = gbuffer_shader_; + gbuffer_shader_ = std::make_shared(); + if (!gbuffer_shader_->load("shaders/gbuffer/gbuffer.vert", "shaders/gbuffer/gbuffer.frag")) { + ARE_LOG_ERROR("Failed to load G-Buffer shader"); + return false; + } + shader_cache_["gbuffer"] = gbuffer_shader_; // Load screen bliting shader ARE_LOG_INFO("Loading screen blit shaders..."); - screen_blit_shader_ = std::make_shared(); - if (!screen_blit_shader_->load("shaders/screen_blit.vert", "shaders/screen_blit.frag")) { - ARE_LOG_ERROR("Failed to load screen blit shader"); - return false; - } - shader_cache_["screen_blit"] = screen_blit_shader_; - ARE_LOG_INFO("Screen blit shader loaded successfully"); + screen_blit_shader_ = std::make_shared(); + if (!screen_blit_shader_->load("shaders/postprocess/screen_blit.vert", "shaders/postprocess/screen_blit.frag")) { + ARE_LOG_ERROR("Failed to load screen blit shader"); + return false; + } + shader_cache_["screen_blit"] = screen_blit_shader_; + ARE_LOG_INFO("Screen blit shader loaded successfully"); // Load ray tracing shader - ARE_LOG_INFO("Loading ray tracing compute shader..."); - raytracing_shader_ = std::make_shared(); - if (!raytracing_shader_->load_compute("shaders/raytracing.comp")) { - ARE_LOG_ERROR("Failed to load ray tracing shader"); - return false; - } - shader_cache_["raytracing"] = raytracing_shader_; - ARE_LOG_INFO("Ray tracing shader loaded successfully"); + ARE_LOG_INFO("Loading ray tracing compute shader..."); + raytracing_shader_ = std::make_shared(); + if (!raytracing_shader_->load_compute("shaders/raytracing/raytracing.comp")) { + ARE_LOG_ERROR("Failed to load ray tracing shader"); + return false; + } + shader_cache_["raytracing"] = raytracing_shader_; + ARE_LOG_INFO("Ray tracing shader loaded successfully"); // Load denoising shader ARE_LOG_INFO("Loading denoise compute shader..."); - denoise_shader_ = std::make_shared(); - if (!denoise_shader_->load_compute("shaders/denoiser.comp")) { - ARE_LOG_ERROR("Failed to load denoise shader"); - return false; - } - shader_cache_["denoise"] = denoise_shader_; - ARE_LOG_INFO("Denoise shader loaded successfully"); + denoise_shader_ = std::make_shared(); + if (!denoise_shader_->load_compute("shaders/postprocess/denoiser.comp")) { + ARE_LOG_ERROR("Failed to load denoise shader"); + return false; + } + shader_cache_["denoise"] = denoise_shader_; + ARE_LOG_INFO("Denoise shader loaded successfully"); - return true; + return true; } } // namespace are diff --git a/src/resource/shader.cpp b/src/resource/shader.cpp index 6928c54..9f56052 100644 --- a/src/resource/shader.cpp +++ b/src/resource/shader.cpp @@ -1,216 +1,275 @@ #include "resource/shader.h" -#include "utils/logger.h" #include "basic/math.h" -#include +#include "utils/logger.h" #include +#include #include namespace are { Shader::Shader() - : handle_(INVALID_HANDLE) { + : handle_(INVALID_HANDLE) { } -Shader::Shader(Shader&& other) noexcept - : handle_(other.handle_) - , uniform_cache_(std::move(other.uniform_cache_)) { - other.handle_ = INVALID_HANDLE; - other.uniform_cache_.clear(); +Shader::Shader(Shader &&other) noexcept + : handle_(other.handle_) + , uniform_cache_(std::move(other.uniform_cache_)) { + other.handle_ = INVALID_HANDLE; + other.uniform_cache_.clear(); } Shader::~Shader() { - release(); + release(); } -Shader& Shader::operator=(Shader&& other) noexcept { - if (this == &other) return *this; +Shader &Shader::operator=(Shader &&other) noexcept { + if (this == &other) + return *this; - release(); - handle_ = other.handle_; - uniform_cache_ = std::move(other.uniform_cache_); + release(); + handle_ = other.handle_; + uniform_cache_ = std::move(other.uniform_cache_); - other.handle_ = INVALID_HANDLE; - other.uniform_cache_.clear(); - return *this; + other.handle_ = INVALID_HANDLE; + other.uniform_cache_.clear(); + return *this; } -bool Shader::load(const std::string& vertex_path, const std::string& fragment_path) { - std::string vertex_source = read_file_(vertex_path); - std::string fragment_source = read_file_(fragment_path); - - if (vertex_source.empty() || fragment_source.empty()) { - ARE_LOG_ERROR("Failed to read shader files"); - return false; - } - - return compile(vertex_source, fragment_source); +bool Shader::load(const std::string &vertex_path, const std::string &fragment_path) { + std::string vertex_source = read_file_(vertex_path); + std::string fragment_source = read_file_(fragment_path); + + if (vertex_source.empty() || fragment_source.empty()) { + ARE_LOG_ERROR("Failed to read shader files"); + return false; + } + + // Process #include directives + std::string vertex_dir = vertex_path.substr(0, vertex_path.find_last_of("/\\")); + std::string fragment_dir = fragment_path.substr(0, fragment_path.find_last_of("/\\")); + vertex_source = process_includes_(vertex_source, vertex_dir); + fragment_source = process_includes_(fragment_source, fragment_dir); + + return compile(vertex_source, fragment_source); } -bool Shader::load_compute(const std::string& compute_path) { - std::string compute_source = read_file_(compute_path); - - if (compute_source.empty()) { - ARE_LOG_ERROR("Failed to read compute shader file"); - return false; - } - - return compile_compute(compute_source); +bool Shader::load_compute(const std::string &compute_path) { + std::string compute_source = read_file_(compute_path); + + if (compute_source.empty()) { + ARE_LOG_ERROR("Failed to read compute shader file"); + return false; + } + + // Process #include directives + std::string compute_dir = compute_path.substr(0, compute_path.find_last_of("/\\")); + compute_source = process_includes_(compute_source, compute_dir); + + return compile_compute(compute_source); } -bool Shader::compile(const std::string& vertex_source, const std::string& fragment_source) { - uint vertex_shader = compile_shader_(vertex_source, GL_VERTEX_SHADER); - if (vertex_shader == 0) return false; - - uint fragment_shader = compile_shader_(fragment_source, GL_FRAGMENT_SHADER); - if (fragment_shader == 0) { - glDeleteShader(vertex_shader); - return false; - } - - uint shaders[] = { vertex_shader, fragment_shader }; - bool success = link_program_(shaders, 2); - - glDeleteShader(vertex_shader); - glDeleteShader(fragment_shader); - - return success; +bool Shader::compile(const std::string &vertex_source, const std::string &fragment_source) { + uint vertex_shader = compile_shader_(vertex_source, GL_VERTEX_SHADER); + if (vertex_shader == 0) + return false; + + uint fragment_shader = compile_shader_(fragment_source, GL_FRAGMENT_SHADER); + if (fragment_shader == 0) { + glDeleteShader(vertex_shader); + return false; + } + + uint shaders[] = { vertex_shader, fragment_shader }; + bool success = link_program_(shaders, 2); + + glDeleteShader(vertex_shader); + glDeleteShader(fragment_shader); + + return success; } -bool Shader::compile_compute(const std::string& compute_source) { - uint compute_shader = compile_shader_(compute_source, GL_COMPUTE_SHADER); - if (compute_shader == 0) return false; - - uint shaders[] = { compute_shader }; - bool success = link_program_(shaders, 1); - - glDeleteShader(compute_shader); - - return success; +bool Shader::compile_compute(const std::string &compute_source) { + uint compute_shader = compile_shader_(compute_source, GL_COMPUTE_SHADER); + if (compute_shader == 0) + return false; + + uint shaders[] = { compute_shader }; + bool success = link_program_(shaders, 1); + + glDeleteShader(compute_shader); + + return success; } void Shader::use() const { - if (handle_ != INVALID_HANDLE) { - glUseProgram(handle_); - } + if (handle_ != INVALID_HANDLE) { + glUseProgram(handle_); + } } void Shader::release() { - if (handle_ != INVALID_HANDLE) { - glDeleteProgram(handle_); - handle_ = INVALID_HANDLE; - } - uniform_cache_.clear(); + if (handle_ != INVALID_HANDLE) { + glDeleteProgram(handle_); + handle_ = INVALID_HANDLE; + } + uniform_cache_.clear(); } -void Shader::set_bool(const std::string& name, bool value) const { - glUniform1i(get_uniform_location_(name), static_cast(value)); +void Shader::set_bool(const std::string &name, bool value) const { + glUniform1i(get_uniform_location_(name), static_cast(value)); } -void Shader::set_int(const std::string& name, int value) const { - glUniform1i(get_uniform_location_(name), value); +void Shader::set_int(const std::string &name, int value) const { + glUniform1i(get_uniform_location_(name), value); } -void Shader::set_uint(const std::string& name, uint value) const { - glUniform1ui(get_uniform_location_(name), value); +void Shader::set_uint(const std::string &name, uint value) const { + glUniform1ui(get_uniform_location_(name), value); } -void Shader::set_float(const std::string& name, float value) const { - glUniform1f(get_uniform_location_(name), value); +void Shader::set_float(const std::string &name, float value) const { + glUniform1f(get_uniform_location_(name), value); } -void Shader::set_vec2(const std::string& name, const Vec2& value) const { - glUniform2fv(get_uniform_location_(name), 1, &value[0]); +void Shader::set_vec2(const std::string &name, const Vec2 &value) const { + glUniform2fv(get_uniform_location_(name), 1, &value[0]); } -void Shader::set_vec3(const std::string& name, const Vec3& value) const { - glUniform3fv(get_uniform_location_(name), 1, &value[0]); +void Shader::set_vec3(const std::string &name, const Vec3 &value) const { + glUniform3fv(get_uniform_location_(name), 1, &value[0]); } -void Shader::set_vec4(const std::string& name, const Vec4& value) const { - glUniform4fv(get_uniform_location_(name), 1, &value[0]); +void Shader::set_vec4(const std::string &name, const Vec4 &value) const { + glUniform4fv(get_uniform_location_(name), 1, &value[0]); } -void Shader::set_mat3(const std::string& name, const Mat3& value) const { - glUniformMatrix3fv(get_uniform_location_(name), 1, GL_FALSE, &value[0][0]); +void Shader::set_mat3(const std::string &name, const Mat3 &value) const { + glUniformMatrix3fv(get_uniform_location_(name), 1, GL_FALSE, &value[0][0]); } -void Shader::set_mat4(const std::string& name, const Mat4& value) const { - glUniformMatrix4fv(get_uniform_location_(name), 1, GL_FALSE, MathUtils::value_ptr(value)); +void Shader::set_mat4(const std::string &name, const Mat4 &value) const { + glUniformMatrix4fv(get_uniform_location_(name), 1, GL_FALSE, MathUtils::value_ptr(value)); } -int Shader::get_uniform_location_(const std::string& name) const { - auto it = uniform_cache_.find(name); - if (it != uniform_cache_.end()) { - return it->second; - } - - int location = glGetUniformLocation(handle_, name.c_str()); - uniform_cache_[name] = location; - - if (location == -1) { - ARE_LOG_WARN("Uniform '" + name + "' not found in shader"); - } - - return location; +int Shader::get_uniform_location_(const std::string &name) const { + auto it = uniform_cache_.find(name); + if (it != uniform_cache_.end()) { + return it->second; + } + + int location = glGetUniformLocation(handle_, name.c_str()); + uniform_cache_[name] = location; + + if (location == -1) { + ARE_LOG_WARN("Uniform '" + name + "' not found in shader"); + } + + return location; } -uint Shader::compile_shader_(const std::string& source, uint type) { - uint shader = glCreateShader(type); - const char* source_cstr = source.c_str(); - glShaderSource(shader, 1, &source_cstr, nullptr); - glCompileShader(shader); - - int success; - glGetShaderiv(shader, GL_COMPILE_STATUS, &success); - if (!success) { - char info_log[512]; - glGetShaderInfoLog(shader, 512, nullptr, info_log); - - std::string type_str = (type == GL_VERTEX_SHADER) ? "VERTEX" : - (type == GL_FRAGMENT_SHADER) ? "FRAGMENT" : "COMPUTE"; - ARE_LOG_ERROR("Shader compilation failed (" + type_str + "): " + std::string(info_log)); - - glDeleteShader(shader); - return 0; - } - - return shader; +uint Shader::compile_shader_(const std::string &source, uint type) { + uint shader = glCreateShader(type); + const char *source_cstr = source.c_str(); + glShaderSource(shader, 1, &source_cstr, nullptr); + glCompileShader(shader); + + int success; + glGetShaderiv(shader, GL_COMPILE_STATUS, &success); + if (!success) { + char info_log[512]; + glGetShaderInfoLog(shader, 512, nullptr, info_log); + + std::string type_str = (type == GL_VERTEX_SHADER) ? "VERTEX" : (type == GL_FRAGMENT_SHADER) ? "FRAGMENT" + : "COMPUTE"; + ARE_LOG_ERROR("Shader compilation failed (" + type_str + "): " + std::string(info_log)); + + glDeleteShader(shader); + return 0; + } + + return shader; } -bool Shader::link_program_(const uint* shaders, uint count) { - handle_ = glCreateProgram(); - - for (uint i = 0; i < count; ++i) { - glAttachShader(handle_, shaders[i]); - } - - glLinkProgram(handle_); - - int success; - glGetProgramiv(handle_, GL_LINK_STATUS, &success); - if (!success) { - char info_log[512]; - glGetProgramInfoLog(handle_, 512, nullptr, info_log); - ARE_LOG_ERROR("Shader linking failed: " + std::string(info_log)); - - glDeleteProgram(handle_); - handle_ = INVALID_HANDLE; - return false; - } - - return true; +bool Shader::link_program_(const uint *shaders, uint count) { + handle_ = glCreateProgram(); + + for (uint i = 0; i < count; ++i) { + glAttachShader(handle_, shaders[i]); + } + + glLinkProgram(handle_); + + int success; + glGetProgramiv(handle_, GL_LINK_STATUS, &success); + if (!success) { + char info_log[512]; + glGetProgramInfoLog(handle_, 512, nullptr, info_log); + ARE_LOG_ERROR("Shader linking failed: " + std::string(info_log)); + + glDeleteProgram(handle_); + handle_ = INVALID_HANDLE; + return false; + } + + return true; } -std::string Shader::read_file_(const std::string& path) { - std::ifstream file(path); - if (!file.is_open()) { - ARE_LOG_ERROR("Failed to open file: " + path); - return ""; - } - - std::stringstream buffer; - buffer << file.rdbuf(); - return buffer.str(); +std::string Shader::read_file_(const std::string &path) { + std::ifstream file(path); + if (!file.is_open()) { + ARE_LOG_ERROR("Failed to open file: " + path); + return ""; + } + + std::stringstream buffer; + buffer << file.rdbuf(); + return buffer.str(); +} + +std::string Shader::process_includes_(const std::string &source, const std::string &base_dir) { + std::string result; + std::istringstream stream(source); + std::string line; + + while (std::getline(stream, line)) { + // Check if line starts with #include + std::string trimmed = line; + // Trim leading whitespace + size_t start = trimmed.find_first_not_of(" \t"); + if (start != std::string::npos) { + trimmed = trimmed.substr(start); + } + + if (trimmed.find("#include") == 0) { + // Extract path: #include "path" or #include + size_t first_quote = line.find('"'); + size_t last_quote = line.rfind('"'); + + if (first_quote != std::string::npos && last_quote != std::string::npos && first_quote != last_quote) { + std::string include_path = line.substr(first_quote + 1, last_quote - first_quote - 1); + std::string full_path = base_dir + "/" + include_path; + + // Read included file + std::string included_content = read_file_(full_path); + if (!included_content.empty()) { + // Get directory of included file for nested includes + std::string included_dir = full_path.substr(0, full_path.find_last_of("/\\")); + + // Recursively process includes + result += process_includes_(included_content, included_dir) + "\n"; + } else { + ARE_LOG_WARN("Include file not found or empty: " + full_path); + } + } else { + // Invalid include syntax, keep original line + result += line + "\n"; + } + } else { + result += line + "\n"; + } + } + + return result; } } // namespace are