aboutsummaryrefslogtreecommitdiff
path: root/adapters/fparkan-render-vulkan/shaders
diff options
context:
space:
mode:
Diffstat (limited to 'adapters/fparkan-render-vulkan/shaders')
-rw-r--r--adapters/fparkan-render-vulkan/shaders/triangle.frag26
-rw-r--r--adapters/fparkan-render-vulkan/shaders/triangle.frag.spvbin14512 -> 15060 bytes
-rw-r--r--adapters/fparkan-render-vulkan/shaders/triangle.vert12
-rw-r--r--adapters/fparkan-render-vulkan/shaders/triangle.vert.spvbin20384 -> 20860 bytes
4 files changed, 24 insertions, 14 deletions
diff --git a/adapters/fparkan-render-vulkan/shaders/triangle.frag b/adapters/fparkan-render-vulkan/shaders/triangle.frag
index 5d10152..b945905 100644
--- a/adapters/fparkan-render-vulkan/shaders/triangle.frag
+++ b/adapters/fparkan-render-vulkan/shaders/triangle.frag
@@ -75,29 +75,35 @@ void main() {
if ((mode & 32) != 0 && (mode & 4) == 0 && in_world_position.z < frame.camera_position.w) {
discard;
}
- if ((mode & 64) != 0) {
+ vec2 base_uv = vec2(material.base_page_x, material.base_page_y)
+ + in_uv * vec2(material.base_page_w, material.base_page_h);
+ if ((mode & (64 | 256)) != 0) {
vec2 reflection_uv = gl_FragCoord.xy / vec2(textureSize(reflection_color, 0));
vec2 span = frame.embm_bounds.zw - frame.embm_bounds.xy;
vec2 plane_uv = vec2(1.0) - (in_world_position.yx - frame.embm_bounds.yx) / span.yx;
vec2 bump_uv = plane_uv * frame.embm_wave.y + frame.embm_wave.x;
vec2 duv = max(vec2(-1.0), (texture(embm_bump, bump_uv).rg * 255.0 - 128.0) / 127.0);
vec2 displacement = duv * frame.embm_wave.zw;
- // shortcut: convert native map-UV displacement to the current mirror projection;
- // replace this projection when accepting the original shifted reflection camera.
- vec3 displaced_world = in_world_position - vec3(displacement.yx * span, 0.0);
- vec4 displaced_clip = frame.clip_from_world * vec4(displaced_world, 1.0);
- if (displaced_clip.w > 0.000001) {
- reflection_uv = displaced_clip.xy / displaced_clip.w * 0.5 + 0.5;
+ if ((mode & 128) != 0) {
+ reflection_uv = plane_uv + displacement;
+ } else {
+ // shortcut: non-perspective API cameras retain the projective mirror fallback.
+ vec3 displaced_world = in_world_position - vec3(displacement.yx * span, 0.0);
+ vec4 displaced_clip = frame.clip_from_world * vec4(displaced_world, 1.0);
+ if (displaced_clip.w > 0.000001) {
+ reflection_uv = displaced_clip.xy / displaced_clip.w * 0.5 + 0.5;
+ }
}
- vec3 rgb = texture(reflection_color, reflection_uv).rgb * in_base_diffuse + in_base_specular;
+ vec3 water_color = (mode & 256) != 0
+ ? texture(base_color, base_uv).rgb
+ : texture(reflection_color, reflection_uv).rgb;
+ vec3 rgb = water_color * 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)
+ in_detail_uv * vec2(material.detail_page_w, material.detail_page_h);
vec2 overlay_uv = vec2(material.overlay_page_x, material.overlay_page_y)
diff --git a/adapters/fparkan-render-vulkan/shaders/triangle.frag.spv b/adapters/fparkan-render-vulkan/shaders/triangle.frag.spv
index de3ace6..02596d1 100644
--- a/adapters/fparkan-render-vulkan/shaders/triangle.frag.spv
+++ b/adapters/fparkan-render-vulkan/shaders/triangle.frag.spv
Binary files differ
diff --git a/adapters/fparkan-render-vulkan/shaders/triangle.vert b/adapters/fparkan-render-vulkan/shaders/triangle.vert
index 8e04536..3accd2e 100644
--- a/adapters/fparkan-render-vulkan/shaders/triangle.vert
+++ b/adapters/fparkan-render-vulkan/shaders/triangle.vert
@@ -45,7 +45,8 @@ layout(std430, set = 0, binding = 5) readonly buffer MaterialSpecular {
struct PointLightRecord {
vec4 position_range;
vec4 rgb_active;
- vec4 coefficients_active;
+ vec3 coefficients;
+ uint owner_scope;
};
layout(std430, set = 0, binding = 6) readonly buffer PointLightBuffer {
@@ -197,6 +198,9 @@ LightingTerms native_material_lighting(
}
for (uint index = 0u; index < point_light_buffer.header.x; ++index) {
PointLightRecord point_light = point_light_buffer.records[index];
+ if (point_light.owner_scope != 0u && point_light.owner_scope != uint(gl_InstanceIndex)) {
+ continue;
+ }
vec3 to_light = point_light.position_range.xyz - world_position;
float distance_squared = dot(to_light, to_light);
float range = point_light.position_range.w;
@@ -209,9 +213,9 @@ LightingTerms native_material_lighting(
float ndotl = dot(normal, light_direction);
if (ndotl > 0.0) {
float t = (range - distance_to_light) / range;
- float attenuation = point_light.coefficients_active.x
- + point_light.coefficients_active.y * t
- + point_light.coefficients_active.z * t * t;
+ float attenuation = point_light.coefficients.x
+ + point_light.coefficients.y * t
+ + point_light.coefficients.z * t * t;
attenuation = max(attenuation, 0.0);
accumulated += ndotl * directional_rgb * point_light.rgb_active.rgb * attenuation;
specular += specular_from_light(
diff --git a/adapters/fparkan-render-vulkan/shaders/triangle.vert.spv b/adapters/fparkan-render-vulkan/shaders/triangle.vert.spv
index 439e2a0..74adcc7 100644
--- a/adapters/fparkan-render-vulkan/shaders/triangle.vert.spv
+++ b/adapters/fparkan-render-vulkan/shaders/triangle.vert.spv
Binary files differ