首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Direct3D 9在硬件中将RGB曲面转换为YUV

使用Direct3D 9在硬件中将RGB曲面转换为YUV
EN

Stack Overflow用户
提问于 2018-07-20 03:50:46
回答 1查看 557关注 0票数 0

我有一个ARGB Direct3D9曲面,我需要将它加入到相同尺寸的UYVY曲面中。两个表面都在系统内存中。我怎样才能做到这一点?

UpdateSurface和StretchRect失败了。

如果需要的话,我可以使用纹理代替表面。

这必须在GPU中完成,即硬件加速。

EN

回答 1

Stack Overflow用户

发布于 2018-07-20 18:32:59

DirectXTex中,有用于执行所有这些转换的代码,您可以查看这些代码以供参考。遗留的Direct3D 9 D3DFMT_UYVY格式与DXGI_FORMAT_YUY2格式相同,但有一些通道抖动。

这些格式编码每个图像像素中的两个可见像素:

代码语言:javascript
复制
struct XMUBYTEN4 { // DirectXMath data type
  uint8_t x;
  uint8_t y;
  uint8_t z;
  uint8_t w;
};

XMUBYTEN4 rgb1, rgb2 = // Input pixel pair

int y0 = ((66 * rgb1.x + 129 * rgb1.y + 25 * rgb1.z + 128) >> 8) + 16;
int u0 = ((-38 * rgb1.x - 74 * rgb1.y + 112 * rgb1.z + 128) >> 8) + 128;
int v0 = ((112 * rgb1.x - 94 * rgb1.y - 18 * rgb1.z + 128) >> 8) + 128;

int y1 = ((66 * rgb2.x + 129 * rgb2.y + 25 * rgb2.z + 128) >> 8) + 16;
int u1 = ((-38 * rgb2.x - 74 * rgb2.y + 112 * rgb2.z + 128) >> 8) + 128;
int v1 = ((112 * rgb2.x - 94 * rgb2.y - 18 * rgb2.z + 128) >> 8) + 128;

对于DXGI_FORMAT_YUY2,您可以使用:

代码语言:javascript
复制
XMUBYTEN4 *dPtr = // Output pixel pair

dPtr->x = static_cast<uint8_t>(std::min<int>(std::max<int>(y0, 0), 255));
dPtr->y = static_cast<uint8_t>(std::min<int>(std::max<int>((u0 + u1) >> 1, 0), 255));
dPtr->z = static_cast<uint8_t>(std::min<int>(std::max<int>(y1, 0), 255));
dPtr->w = static_cast<uint8_t>(std::min<int>(std::max<int>((v0 + v1) >> 1, 0), 255));

对于D3DFMT_UYVY,您可以使用:

代码语言:javascript
复制
dPtr->x = static_cast<uint8_t>(std::min<int>(std::max<int>((u0 + u1) >> 1, 0), 255));
dPtr->y = static_cast<uint8_t>(std::min<int>(std::max<int>(y0, 0), 255));
dPtr->z = static_cast<uint8_t>(std::min<int>(std::max<int>((v0 + v1) >> 1, 0), 255));
dPtr->w = static_cast<uint8_t>(std::min<int>(std::max<int>(y1, 0), 255));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51434806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档