diff --git a/res/dpr/utility/encode_color_conversion.frag b/res/dpr/utility/encode_color_conversion.frag index 7e39b74b8929e86ff2476a022dcda5d302685c49..9125d168879650d312f8b721cf9e1cf868322bc4 100644 --- a/res/dpr/utility/encode_color_conversion.frag +++ b/res/dpr/utility/encode_color_conversion.frag @@ -15,13 +15,19 @@ void main() vec3(0.114, 0.436, -0.10001) //third column ); + float gamma = 2.2; + float u_max = 0.436; + float v_max = 0.615; + int height = textureSize(samplerInput, 0).y; ivec2 coord = ivec2(gl_FragCoord.xy); coord.y = height - coord.y; - vec3 color_rgb = texelFetch(samplerInput, coord, 0).xyz; - vec3 color_yuv = convert_matrix * color_rgb; + vec3 color_rgb_linear = texelFetch(samplerInput, coord, 0).xyz; + vec3 color_rgb_gamma = pow(color_rgb_linear, vec3(1.0 / gamma)); //Slight change in brighness when compared to emulated headset. Maybe due to different gamma compression when using sRGB. + vec3 color_yuv = convert_matrix * color_rgb_gamma; outLuma = color_yuv.x; - outChroma = color_yuv.yz + 0.5; + outChroma.x = ((color_yuv.y / u_max) + 1.0) / 2.0; + outChroma.y = ((color_yuv.z / v_max) + 1.0) / 2.0; } diff --git a/src/headset/emulated_headset.cpp b/src/headset/emulated_headset.cpp index cff8020b9903566b37b5f96a527661840287d812..f5d0bd76eb2020f93891f6829d6e85f138a6ba75 100644 --- a/src/headset/emulated_headset.cpp +++ b/src/headset/emulated_headset.cpp @@ -142,6 +142,19 @@ void EmulatedHeadset::submit_frame(VkCommandBuffer command_buffer, VkImageLayout VkFormat EmulatedHeadset::get_format() const { + switch (this->get_application()->get_target()->get_format()) + { + case VK_FORMAT_B8G8R8A8_UNORM: + case VK_FORMAT_B8G8R8A8_SRGB: + return VK_FORMAT_B8G8R8A8_SRGB; + case VK_FORMAT_R8G8B8A8_UNORM: + case VK_FORMAT_R8G8B8A8_SRGB: + return VK_FORMAT_R8G8B8A8_SRGB; + default: + lava::log()->warn("Can't derive correct sRGB color format for headset framebuffer!"); + break; + } + return this->get_application()->get_target()->get_format(); } diff --git a/src/scene.hpp b/src/scene.hpp index c746abfd28d7e0aadc403bf6b07eddb5630510ba..1e490fef3890aae0aee8a958e56c61714cd76ba2 100644 --- a/src/scene.hpp +++ b/src/scene.hpp @@ -216,7 +216,7 @@ private: glm::vec3 scene_min = glm::vec3(0.0f); glm::vec3 scene_max = glm::vec3(0.0f); - const glm::vec3 ambient_color = glm::vec3(5.0f); //NOTE: This factor is used so that the Bistro scene looks okay. + const glm::vec3 ambient_color = glm::vec3(0.5f); //NOTE: This factor is used so that the Bistro scene looks okay. float exposure = 0.1f; //NOTE: This factor is used so that the Bistro scene looks okay. bool exposure_changed = false; diff --git a/src/utility/companion_window.cpp b/src/utility/companion_window.cpp index e959cfd8d9771765fe5e509f598eaedee1702502..86ab73a926f1df4eb155f5126f3958b4b4e82e32 100644 --- a/src/utility/companion_window.cpp +++ b/src/utility/companion_window.cpp @@ -2,7 +2,24 @@ bool CompanionWindow::create(lava::device_ptr device, lava::render_target::ptr target) { - this->framebuffer = lava::make_image(target->get_format(), device, target->get_size()); + VkFormat format = target->get_format(); + + switch (format) + { + case VK_FORMAT_B8G8R8A8_UNORM: + case VK_FORMAT_B8G8R8A8_SRGB: + format = VK_FORMAT_B8G8R8A8_SRGB; + break; + case VK_FORMAT_R8G8B8A8_UNORM: + case VK_FORMAT_R8G8B8A8_SRGB: + format = VK_FORMAT_R8G8B8A8_SRGB; + break; + default: + lava::log()->warn("Can't derive correct sRGB color format for companion window!"); + break; + } + + this->framebuffer = lava::make_image(format, device, target->get_size()); if (this->framebuffer == nullptr) {