当前位置: 首页 > news >正文

vulkan从小白到专家——YUV处理

1 YUV使用场景

在这里插入图片描述

通过生产者消费者模式,底层照相机,录制视频生成buffer,图形渲染模块作为消费者,
拿到的通常是多层平面表示的像素格式,即YCbCr格式。图像信息通常由多层图片构成,

如果gles开发,开发者需要维护两套纹理,分别保存YUV的多层平面信息,然后再fragment shader中分别采样,结果再进行混合。。非常繁琐
基于vulkan YUV扩展,驱动自动生成shader,从多个图像的平面上采样,然后将结果转化成rgba的格式,
yuv有多种不同格式:nv12、nv21、420p。

youtube上的vulkanised24上的视频:https://www.youtube.com/watch?v=RABV11Nr-gE&t=1348s

2 VK_KHR_sampler_ycbcr_conversion

The use of Y′CBCR sampler conversion is an area in 3D graphics not used by most Vulkan developers. It is mainly used for processing inputs from video decoders and cameras. The use of the extension assumes basic knowledge of Y′CBCR concepts.This extension provides the ability to perform specified color space conversions during texture sampling operations for the Y′CBCR color space natively. It also adds a selection of multi-planar formats, image aspect plane, and the ability to bind memory to the planes of an image collectively or separately.

Y′CBCR采样器转换的使用是大多数Vulkan开发者未曾涉足的3D图形领域,其主要应用于视频解码器和摄像头输入的处理。使用该扩展功能需具备Y′CBCR色彩空间的基本概念。

该扩展原生支持在纹理采样操作期间执行指定的Y′CBCR色彩空间转换,同时新增了多平面格式选项、图像切面(aspect plane)概念,并允许将内存整体或分别绑定至图像的各个平面。
https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_sampler_ycbcr_conversion.html

2.1 查询能力

        VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR ycbcrFeatures = {};ycbcrFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR;VkPhysicalDeviceFeatures2 features2 = {};features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;features2.pNext = &ycbcrFeatures;vkGetPhysicalDeviceFeatures2(physicalDevice, &features2);if (!ycbcrFeatures.samplerYcbcrConversion) {throw std::runtime_error("Y′CBCR conversion not supported!");}

2.2 创建转换器

重点指定颜色空间即色域相关的转化,
VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601_KHR 指定了yuv专程rgb以后到色域信息,
问deepseek到结果:标清601,高清的709,HDR的BT2020,

VkSamplerYcbcrConversionCreateInfoKHR ycbcrCreateInfo = {};
ycbcrCreateInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO_KHR;
ycbcrCreateInfo.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
ycbcrCreateInfo.ycbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601_KHR;
ycbcrCreateInfo.ycbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_NARROW_KHR;
ycbcrCreateInfo.components = {VK_COMPONENT_SWIZZLE_IDENTITY,  // RVK_COMPONENT_SWIZZLE_IDENTITY,  // GVK_COMPONENT_SWIZZLE_IDENTITY,  // BVK_COMPONENT_SWIZZLE_IDENTITY   // A
};
ycbcrCreateInfo.xChromaOffset = VK_CHROMA_LOCATION_COSITED_EVEN_KHR;
ycbcrCreateInfo.chromaFilter = VK_FILTER_LINEAR;VkSamplerYcbcrConversionKHR ycbcrConversion;
vkCreateSamplerYcbcrConversionKHR(device, &ycbcrCreateInfo, nullptr, &ycbcrConversion);
//或者vkCreateSamplerYcbcrConversion ,不同版本vulkan api 有差异!

2.3 pipeline中集成

在这里插入图片描述
createTexture的时候,根据解析的纹理格式desc中的平面个数智能开启YUV的配置,最终得在ImageView中设置ycbcrInfo

https://github.com/corporateshark/lightweightvk/blob/master/samples/004_YUV.cpp

http://www.xdnf.cn/news/1199215.html

相关文章:

  • Windows|CUDA和cuDNN下载和安装,默认安装在C盘和不安装在C盘的两种方法
  • 《谁在翻译机器的疼痛?》——故障诊断的认知鸿沟与产教破壁之战!
  • C++ 多线程(一)
  • 低精度训练一:低精度训练介绍与大模型下载
  • 09_opencv_遍历操作图像像素
  • net8.0一键创建支持(RabbitMQ)
  • 【AI论文】WebShaper:通过信息寻求形式化实现主动式数据合成
  • 深入理解Java内存与运行时机制:从对象内存布局到指针压缩
  • 【C++】红黑树实现
  • n8n “Run Once for All Items“和“Run Once for Each Item“区别
  • 基于Springboot+UniApp+Ai实现模拟面试小工具七:前端项目创建及框架搭建
  • cJSON在STM32单片机上使用遇到解析数据失败问题
  • Java面试全栈通关:从微服务到AI的技术深度解析
  • 一文读懂 JWT(JSON Web Token)
  • 【LeetCode刷题指南】--设计循环队列
  • 怎样让阿里云服务器(centos)有界面
  • 机械学习----knn实战案例----手写数字图像识别
  • Kotlin位运算
  • 板凳-------Mysql cookbook学习 (十二--------3_3)
  • BUG记录——Request接传Json数据中文乱码
  • Spring Boot + @RefreshScope:动态刷新配置的终极指南
  • Keepalived + LVS-DR 高可用与负载均衡实验
  • Java全栈面试实战:从JVM到AI的技术演进之路
  • OpenResty 高并发揭秘:架构优势与 Linux 优化实践
  • Unity TAA
  • CentOS网卡未被托管解决记录
  • PDF文件被加密限制怎么办?专业级解除方案分享
  • Python|OpenCV-实现快速处理图像的方法(23)
  • GPT-4o实战应用指南:从入门到精通的技术心得
  • 昇思学习营-模型推理和性能优化