Qt+DirectX视频渲染出现画面水平错位问题求助
4K DeckLink采集帧DirectX渲染水平错位排查方案
- 先排查DeckLink采集侧行对齐问题:DeckLink输出的帧默认按128字节做行对齐,不要直接用
分辨率宽度*单像素字节数计算行步长,调用采集帧的GetRowBytes接口拿到实际行步长,后续纹理上传完全按这个值作为源数据行步长处理,不要硬编码3840对应的数值。 - 检查DirectX纹理上传参数匹配:创建D3D纹理时确认像素格式和采集帧完全匹配,比如DeckLink输出的10bit YUV422格式不要误当做8bit RGB处理。如果用动态纹理做帧上传,
Map操作后拿到的D3D11_MAPPED_SUBRESOURCE::RowPitch是驱动对齐后的目标行步长,必须按源和目标各自的行步长逐行拷贝数据,不能直接整块内存拷贝。 - 验证色彩空间转换逻辑:如果你在shader中做YUV到RGB的转换,确认采集帧的YUV排列顺序,UYVY和YUY2的采样顺序搞反的话,会直接出现水平方向的像素错位。
- 确认Qt窗口视口参数正确:检查当前Qt应用是否开启了高DPI适配,获取窗口的
devicePixelRatio系数,把渲染视口的宽高乘以该系数再传给D3D的视口设置接口,避免逻辑像素和物理像素不匹配导致的拉伸错位。 - 排查自研图形管线采样规则:如果是从D3D9迁移的管线,确认已经适配D3D11的半像素偏移规则,避免采样位置整体偏移。同时检查纹理采样器的地址模式是否设置为
D3D11_TEXTURE_ADDRESS_CLAMP,排除边缘采样溢出导致的画面异常。
内容的提问来源于stack exchange,提问作者Sang
相关产品推荐
相关产品推荐

