The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

c/shaders: Add equirect shader.

authored by

Lubosz Sarnecki and committed by
Jakob Bornecrantz
9738b4fe 5777d829

+129 -1
+2
src/xrt/compositor/CMakeLists.txt
··· 6 6 shaders/mesh.vert 7 7 shaders/layer.frag 8 8 shaders/layer.vert 9 + shaders/equirect.vert 10 + shaders/equirect.frag 9 11 ) 10 12 11 13 set(CLIENT_SOURCE_FILES)
+4
src/xrt/compositor/main/comp_compositor.h
··· 138 138 { 139 139 VkShaderModule mesh_vert; 140 140 VkShaderModule mesh_frag; 141 + 142 + VkShaderModule equirect_vert; 143 + VkShaderModule equirect_frag; 144 + 141 145 VkShaderModule layer_vert; 142 146 VkShaderModule layer_frag; 143 147 };
+13
src/xrt/compositor/main/comp_shaders.c
··· 22 22 23 23 #include "shaders/layer.frag.h" 24 24 #include "shaders/layer.vert.h" 25 + #include "shaders/equirect.frag.h" 26 + #include "shaders/equirect.vert.h" 25 27 #include "shaders/mesh.frag.h" 26 28 #include "shaders/mesh.vert.h" 27 29 ··· 87 89 sizeof(shaders_mesh_frag), // size 88 90 &s->mesh_frag)); // out 89 91 92 + C(shader_load(vk, // vk_bundle 93 + shaders_equirect_vert, // data 94 + sizeof(shaders_equirect_vert), // size 95 + &s->equirect_vert)); // out 96 + C(shader_load(vk, // vk_bundle 97 + shaders_equirect_frag, // data 98 + sizeof(shaders_equirect_frag), // size 99 + &s->equirect_frag)); // out 100 + 90 101 C(shader_load(vk, // vk_bundle 91 102 shaders_layer_vert, // data 92 103 sizeof(shaders_layer_vert), // size ··· 112 123 { 113 124 D(mesh_vert); 114 125 D(mesh_frag); 126 + D(equirect_vert); 127 + D(equirect_frag); 115 128 D(layer_vert); 116 129 D(layer_frag); 117 130
+68
src/xrt/compositor/shaders/equirect.frag
··· 1 + // Copyright 2020 Collabora Ltd. 2 + // Author: Lubosz Sarnecki <lubosz.sarnecki@collabora.com> 3 + // SPDX-License-Identifier: BSL-1.0 4 + 5 + #version 460 6 + 7 + layout (location = 0) in vec2 uv; 8 + 9 + layout (binding = 0, std140) uniform Transformation { 10 + mat4 mvp; 11 + ivec2 offset; 12 + ivec2 extent; 13 + bool flip_y; 14 + } ubo; 15 + layout (binding = 1) uniform sampler2D image; 16 + 17 + layout (location = 0) out vec4 out_color; 18 + 19 + const float PI = 3.1416; 20 + 21 + // #define DEBUG 1 22 + 23 + void main () 24 + { 25 + vec2 uv_sub = vec2(ubo.offset) + uv * vec2(ubo.extent); 26 + uv_sub /= textureSize(image, 0); 27 + 28 + vec2 frag_coord = vec2(uv_sub) * 2 - 1; 29 + 30 + vec4 view_dir = normalize(ubo.mvp * vec4(frag_coord.x, -frag_coord.y, 1, 1)); 31 + 32 + float lat = atan(view_dir.x, -view_dir.z) / (2 * PI); 33 + float lon = acos(view_dir.y) / PI; 34 + 35 + #ifdef DEBUG 36 + int lat_int = int(lat * 1000.0); 37 + int lon_int = int(lon * 1000.0); 38 + 39 + if (lat < 0.001 && lat > -0.001) 40 + out_color = vec4(1, 0, 0, 1); 41 + else if (lat_int % 50 == 0) 42 + out_color = vec4(1, 1, 1, 1); 43 + else if (lon_int % 50 == 0) 44 + out_color = vec4(1, 1, 1, 1); 45 + else 46 + out_color = vec4(lat, lon, 0, 1); 47 + #endif 48 + 49 + float chan = equirect.central_horizontal_angle / (PI * 2.0f); 50 + 51 + // Normalize [0, 2π] to [0, 1] 52 + float uhan = chan / 2.0f; 53 + float lhan = -chan / 2.0f; 54 + 55 + // Normalize [-π/2, π/2] to [0, 1] 56 + float uvan = equirect.upper_vertical_angle / PI + 0.5f; 57 + float lvan = equirect.lower_vertical_angle / PI + 0.5f; 58 + 59 + if (lon < uvan && lon > lvan && lat < uhan && lat > lhan) 60 + #ifdef DEBUG 61 + out_color += texture(image, vec2(lat, lon)) / 2.0; 62 + #else 63 + out_color = texture(image, vec2(lat, lon)); 64 + else 65 + out_color = vec4(0, 0, 0, 0); 66 + #endif 67 + } 68 +
+39
src/xrt/compositor/shaders/equirect.vert
··· 1 + // Copyright 2020 Collabora Ltd. 2 + // Author: Lubosz Sarnecki <lubosz.sarnecki@collabora.com> 3 + // SPDX-License-Identifier: BSL-1.0 4 + 5 + #version 460 6 + 7 + layout (binding = 0, std140) uniform Transformation { 8 + mat4 mvp; 9 + ivec2 offset; 10 + ivec2 extent; 11 + bool flip_y; 12 + } transformation; 13 + 14 + layout (location = 0) in vec3 position; 15 + layout (location = 1) in vec2 uv; 16 + 17 + layout (location = 0) out vec2 out_uv; 18 + 19 + 20 + out gl_PerVertex { 21 + vec4 gl_Position; 22 + }; 23 + 24 + const mat4 mvp = mat4( 25 + 2, 0, 0, 0, 26 + 0, 2, 0, 0, 27 + 0, 0, 1, 0, 28 + 0, 0, 0, 1 29 + ); 30 + 31 + void main() { 32 + gl_Position = mvp * vec4 (position, 1.0f); 33 + gl_Position.y = -gl_Position.y; 34 + out_uv = uv; 35 + 36 + if (transformation.flip_y) { 37 + out_uv.y = 1.0 - out_uv.y; 38 + } 39 + }
+3 -1
src/xrt/compositor/shaders/meson.build
··· 2 2 'mesh.frag', 3 3 'mesh.vert', 4 4 'layer.vert', 5 - 'layer.frag' 5 + 'layer.frag', 6 + 'equirect.vert', 7 + 'equirect.frag' 6 8 ] 7 9 8 10 shader_headers = []