4.0 KiB
4.0 KiB
BRIEF: NFS 2015-Style Wet Perma-Night Scene Setup (Raylib / C)
1. Goal
Transform an existing basic 3D scene (containing car model, road surfaces, and city building meshes with flat albedo textures) into a high-contrast, moody, wet perma-night aesthetic inspired by Need for Speed (2015).
2. Technical Stack Context
- Framework: Raylib (C/C++)
- Core APIs: Custom GLSL Shaders (Shader / Fragment Shaders),
RenderTexture2D(FBOs),rlglfor state/texture management. - Goal Output: Modular shader code and pass-management architecture that runs efficiently on Raylib's forward renderer.
3. Implementation Roadmap & Execution Tasks
Phase 1: Material & Wetness Shader (wet_road.fs)
Modify the primary object shader used for terrain/road surfaces to support a wetness model.
- Inputs Needed:
texture0(Albedo / Diffuse)texture1(Normal Map)texture2(Roughness Map or Puddle Noise Mask)- Uniform
float u_wetness(Range:0.0to1.0)
- Shader Logic Requirements:
- Albedo Darkening: Darken base albedo by ~30–40% on wet areas (porous surfaces darken when saturated).
- Roughness Modulation: Force surface roughness down to near-mirror levels (
~0.02 - 0.1) based onu_wetnessand the puddle mask. - Normal Flattening for Puddles: In high-puddle mask areas, lerp surface normals toward
vec3(0.0, 1.0, 0.0)to simulate smooth standing water.
Phase 2: Lighting & Emissive Setup
Configure scene lights and emissive materials for night contrast.
- Global Ambient Light: Lower global ambient color to a dark, cool navy (
RGB: 10, 15, 30). - Emissive Material Handling:
- Add support for an emissive map/uniform on neon signs, building windows, and car light meshes.
- Multiply emissive output by an intensity factor (
> 2.0) to ensure they trigger the Bloom threshold in post-processing.
- Point & Spot Lights:
- Implement dynamic point lights for streetlights and headlights with quadratic distance attenuation (
1.0 / (att_const + att_linear * d + att_quad * d * d)).
- Implement dynamic point lights for streetlights and headlights with quadratic distance attenuation (
Phase 3: Post-Processing Framebuffer Pipeline (main.c)
Set up offscreen rendering to enable screen-space passes.
- Render Texture Setup:
- Create a master
RenderTexture2D targetSceneFBO matching screen resolution. - Create a secondary
RenderTexture2D pingPongBlur[2]FBO pair for downscaled bloom processing.
- Create a master
- Render Loop Flow:
BeginTextureMode(targetScene)\rightarrowRender all 3D geometry using object shaders.EndTextureMode()- Extract bright pixels from
targetSceneto bloom FBO via threshold shader (luminance > 0.7). - Perform horizontal and vertical blur passes on the bright map.
- Composite original scene + blurred bloom + final color grading onto the screen.
Phase 4: Color Grading & Anamorphic Bloom Shader (post_process.fs)
Apply the final cinematic "lens" pass over the scene texture.
- Heavy / Anamorphic Bloom:
- Scale horizontal blur kernel radius larger than vertical to simulate anamorphic lens flares from streetlights and wet ground reflections.
- High-Contrast Night LUT / Grading:
- Crushed deep blacks (
#050508). - Cool cyan/teal shadows and warm orange/amber highlights for light sources.
- Crushed deep blacks (
- Vignette & Lens Effects:
- Radial vignette intensity dropping at screen edges.
- Subtle chromatic aberration (offset Red/Blue channels slightly near screen borders).
Phase 5: Simple Reflection Pass (Ground / Car)
- Implement a basic planar reflection pass or sample a low-resolution cubemap probe inside the
wet_road.fsfragment shader to give wet surfaces mirror-like reflections of the ambient sky and light sources.
4. Deliverables Checklist
wet_material.fs/wet_material.vs: Shader handling albedo darkening, normal mapping, and specular puddle blending.post_process.fs: Screen-space shader combining Bloom, Color Grading, Vignette, and Chromatic Aberration.- Updated Raylib C loop establishing the
RenderTexture2Dpipeline and uniform bindings.