diff options
| author | Valentin Popov <valentin@popov.link> | 2026-11-01 04:31:43 +0300 |
|---|---|---|
| committer | Valentin Popov <valentin@popov.link> | 2026-11-01 04:31:43 +0300 |
| commit | dfa2db65cc7b052d91c30ce179df8bc07af0cb1b (patch) | |
| tree | e68748431233b85f92e33792cb8c8e05c9ed7a0b /adapters/fparkan-render-vulkan/shaders/triangle.frag | |
| parent | 2de24962e01ee48dd11eaf64edb75ef3958e71d8 (diff) | |
| download | fparkan-dfa2db65cc7b052d91c30ce179df8bc07af0cb1b.tar.xz fparkan-dfa2db65cc7b052d91c30ce179df8bc07af0cb1b.zip | |
feat(render): add planar water reflections
Diffstat (limited to 'adapters/fparkan-render-vulkan/shaders/triangle.frag')
| -rw-r--r-- | adapters/fparkan-render-vulkan/shaders/triangle.frag | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/adapters/fparkan-render-vulkan/shaders/triangle.frag b/adapters/fparkan-render-vulkan/shaders/triangle.frag index 6a6e752..ec0acdb 100644 --- a/adapters/fparkan-render-vulkan/shaders/triangle.frag +++ b/adapters/fparkan-render-vulkan/shaders/triangle.frag @@ -9,12 +9,14 @@ layout(location = 5) in vec3 in_base_diffuse; layout(location = 6) in vec3 in_base_specular; layout(location = 7) in vec3 in_overlay_diffuse; layout(location = 8) in vec3 in_overlay_specular; +layout(location = 9) in float in_world_z; layout(location = 0) out vec4 out_color; layout(set = 0, binding = 0) uniform sampler2D base_color; layout(set = 0, binding = 1) uniform sampler2D base_detail; layout(set = 0, binding = 2) uniform sampler2D overlay_color; layout(set = 0, binding = 3) uniform sampler2D overlay_detail; +layout(set = 1, binding = 0) uniform sampler2D reflection_color; layout(std140, set = 0, binding = 4) uniform FrameConstants { mat4 clip_from_world; @@ -66,6 +68,19 @@ layout(push_constant) uniform MaterialConstants { } material; void main() { + int mode = int(round(material.material_mode)); + if ((mode & 32) != 0 && (mode & 4) == 0 && in_world_z < frame.camera_position.w) { + discard; + } + if ((mode & 64) != 0) { + vec2 reflection_uv = gl_FragCoord.xy / vec2(textureSize(reflection_color, 0)); + vec3 rgb = texture(reflection_color, reflection_uv).rgb * in_base_diffuse + in_base_specular; + out_color = vec4(mix(rgb * in_color, frame.fog_color.rgb, in_fog_factor), material.diffuse_alpha); + if (out_color.a < material.alpha_cutoff) { + discard; + } + return; + } vec2 base_uv = vec2(material.base_page_x, material.base_page_y) + in_uv * vec2(material.base_page_w, material.base_page_h); vec2 detail_uv = vec2(material.detail_page_x, material.detail_page_y) @@ -78,7 +93,6 @@ void main() { vec4 detail = texture(base_detail, detail_uv); vec4 overlay = texture(overlay_color, overlay_uv); vec4 overlay_detail_sample = texture(overlay_detail, overlay_detail_uv); - int mode = int(round(material.material_mode)); int combiner_mode = mode & 3; // Native sky mode 4 combines nebula and stars as |
