【发布时间】:2014-02-09 15:48:32
【问题描述】:
我正在制作在 CPU 上生成 mip 映射的函数。 我的目标是编写适用于许多 DXGI_FORMAT 的通用函数。函数对所有 DXGI_FORMAT 组合做同样的事情,唯一的区别是数据类型和 XMMATH 函数来加载和存储它。
我尝试以很好的方式做到这一点 - 通过模板参数,就像这样:
#define AVERAGE(p, q) (((p - q) * 0.5f) + q)
template<typename XMATH_PIXEL_FORMAT,
typename XMVECTOR(*XMATH_LOAD_FUNC)(const XMATH_PIXEL_FORMAT*),
typename void(*XMATH_STORE_FUNC)(XMATH_PIXEL_FORMAT*, XMVECTOR)>
void minifyMipMap(XMATH_PIXEL_FORMAT* dst, const XMATH_PIXEL_FORMAT* src, size_t src_x, size_t src_y) {
size_t x, y, x2, y2, dst_x = src_x >> 1, dst_y = src_y >> 1;
XMVECTOR out, p00, p10, p01, p11; // p:xy
for(y = 0; y < dst_y; ++y) { // for each dst line
y2 = y << 1; // y2 = y * 2
for(x = 0; x < dst_x; ++x) { // for each dst pixel
x2 = x << 1; // x2 = x * 2
// load 4 pixels
p00 = XMATH_LOAD_FUNC(src + y2 * src_x + x2);
p10 = XMATH_LOAD_FUNC(src + y2 * src_x + x2 + 1);
p01 = XMATH_LOAD_FUNC(src + (y2 + 1) * src_x + x2);
p11 = XMATH_LOAD_FUNC(src + (y2 + 1) * src_x + x2 + 1);
// blend 4 pixels into 1
out = AVERAGE(AVERAGE(p00, p10), AVERAGE(p01, p11));
// store dest pixel
XMATH_STORE_FUNC(dst + y * dst_x + x, out);
}
}
}
void test() {
BYTE src[] = {
0, 0, 0, 255, // black
255, 255, 255, 255, // white
0, 0, 0, 255, // black
255, 255, 255, 255 // white
};
XMUBYTE4 dst[1]; // gray ???
minifyMipMap<XMUBYTE4, XMLoadUByte4, XMStoreUByte4>(dst, (const XMUBYTE4*)src, 2, 2); // 2x2 = > 1x1
}
msvc 说:C2893:无法专门化函数模板 'void minifyMipMap(XMATH_PIXEL_FORMAT *,const XMATH_PIXEL_FORMAT *,size_t,size_t)' 使用以下模板参数: 'DirectX::PackedVector::XMUBYTE4'
我尝试以几种组合方式编译此代码,但没有成功(我也尝试将类型定义为类模板并将函数定义为此类的静态方法参数,但它也失败了)。 我希望以某种方式可以在 C++ 中以很好的方式编写它 - 不使用#define's
【问题讨论】:
-
我犯了一个可怕的错误,这不起作用,因为 void(XMMATH_STORE_FUNC)(XMATH_PIXEL_FORMAT, XMVECTOR) 在第二个参数中应该是 FXMVECTOR - 而不是 XMVECTOR - 这是误报:>此模板代码在 msvc 2012 下工作
标签: c++