我有一个ARGB Direct3D9曲面,我需要将它加入到相同尺寸的UYVY曲面中。两个表面都在系统内存中。我怎样才能做到这一点?
UpdateSurface和StretchRect失败了。
如果需要的话,我可以使用纹理代替表面。
这必须在GPU中完成,即硬件加速。
发布于 2018-07-20 18:32:59
在DirectXTex中,有用于执行所有这些转换的代码,您可以查看这些代码以供参考。遗留的Direct3D 9 D3DFMT_UYVY格式与DXGI_FORMAT_YUY2格式相同,但有一些通道抖动。
这些格式编码每个图像像素中的两个可见像素:
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,您可以使用:
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,您可以使用:
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));https://stackoverflow.com/questions/51434806
复制相似问题