aboutsummaryrefslogtreecommitdiff
path: root/adapters/fparkan-render-vulkan/shaders/triangle.frag
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-11-01 04:31:43 +0300
committerValentin Popov <valentin@popov.link>2026-11-01 04:31:43 +0300
commitdfa2db65cc7b052d91c30ce179df8bc07af0cb1b (patch)
treee68748431233b85f92e33792cb8c8e05c9ed7a0b /adapters/fparkan-render-vulkan/shaders/triangle.frag
parent2de24962e01ee48dd11eaf64edb75ef3958e71d8 (diff)
downloadfparkan-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.frag16
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