aboutsummaryrefslogtreecommitdiff
path: root/adapters/fparkan-render-vulkan/shaders/triangle.vert
diff options
context:
space:
mode:
Diffstat (limited to 'adapters/fparkan-render-vulkan/shaders/triangle.vert')
-rw-r--r--adapters/fparkan-render-vulkan/shaders/triangle.vert25
1 files changed, 17 insertions, 8 deletions
diff --git a/adapters/fparkan-render-vulkan/shaders/triangle.vert b/adapters/fparkan-render-vulkan/shaders/triangle.vert
index d1e2e04..3accd2e 100644
--- a/adapters/fparkan-render-vulkan/shaders/triangle.vert
+++ b/adapters/fparkan-render-vulkan/shaders/triangle.vert
@@ -19,6 +19,7 @@ layout(location = 5) out vec3 out_base_diffuse;
layout(location = 6) out vec3 out_base_specular;
layout(location = 7) out vec3 out_overlay_diffuse;
layout(location = 8) out vec3 out_overlay_specular;
+layout(location = 9) out vec3 out_world_position;
layout(std140, set = 0, binding = 4) uniform FrameConstants {
mat4 clip_from_world;
@@ -32,6 +33,8 @@ layout(std140, set = 0, binding = 4) uniform FrameConstants {
vec4 fog_color;
vec4 fog_distances;
vec4 camera_position;
+ vec4 embm_bounds;
+ vec4 embm_wave;
} frame;
layout(std430, set = 0, binding = 5) readonly buffer MaterialSpecular {
@@ -42,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 {
@@ -130,12 +134,13 @@ float native_specular_power(float cosine, float power) {
}
float native_fog_factor(vec3 world_position) {
- float fog_span = frame.fog_distances.y - frame.fog_distances.x;
- float distance_to_camera = distance(world_position, frame.camera_position.xyz);
- if (fog_span <= 0.000001 || distance_to_camera <= frame.fog_distances.x) {
+ float fog_span_squared = frame.fog_distances.w - frame.fog_distances.z;
+ vec3 to_camera = world_position - frame.camera_position.xyz;
+ float distance_squared = dot(to_camera, to_camera);
+ if (fog_span_squared <= 0.000001 || distance_squared <= frame.fog_distances.z) {
return 0.0;
}
- return clamp((distance_to_camera - frame.fog_distances.x) / fog_span, 0.0, 1.0);
+ return clamp((distance_squared - frame.fog_distances.z) / fog_span_squared, 0.0, 1.0);
}
vec3 normalized_or(vec3 value, vec3 fallback) {
@@ -193,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;
@@ -205,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(
@@ -240,6 +248,7 @@ LightingTerms native_material_lighting(
}
void main() {
+ out_world_position = in_position;
out_color = in_color;
out_uv = in_uv;
out_detail_uv = in_detail_uv;