perovskite_client 0.3.2

Multiplayer voxel game written in Rust - Game client
#version 460
#extension GL_ARB_shading_language_include : enable
#include "encoding.glsl"

layout(location = 0) in vec3 position;
layout(location = 1) in vec4 top_color;
layout(location = 2) in vec4 side_color;
layout(location = 3) in int normal;
layout(location = 4) in float lod_orientation_bias;

layout(location = 0) out vec4 top_color_out;
layout(location = 1) out vec4 side_color_out;
layout(location = 2) out vec3 world_normal;
layout(location = 3) out vec3 model_pos;
layout(location = 4) out vec3 camera_relative_pos;
layout(location = 5) out float lod_orientation_bias_out;

layout(set = 1, binding = 0) uniform FarMeshUniforms {
  mat4 vp_matrix;
  vec3 global_brightness;
  vec3 global_light_dir;
};
// 64 bytes of push constants :(
layout(push_constant) uniform FarMeshPushConstants { mat4 model_matrix; };

void main() {
  // gamma correction. This is done in the shader, rather than
  // using an SRGB vulkan data type, because this color is being
  // retrieved via the vertex buffer, not a texture sampler.
  // Vulkan does not guarantee VK_FORMAT_R8G8B8A8_SRGB
  // + VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT together.
  top_color_out = vec4(pow(top_color.rgb, vec3(2.2)), top_color.a);
  side_color_out = vec4(pow(side_color.rgb, vec3(2.2)), side_color.a);
  model_pos = position;

  vec4 world_pos4 = model_matrix * vec4(position, 1.0);

  gl_Position = vp_matrix * world_pos4;

  camera_relative_pos = world_pos4.xyz / world_pos4.w;

  world_normal = decode_normal_x5y5z5_pack15(normal);

  lod_orientation_bias_out = lod_orientation_bias;
}