我已经制作了一个用于张贴图像的功能。如何将_m128i转换为带有SSE的无符号整数?
// =(
#define ARGB_COLOR(a, r, g, b) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
inline UINT PosterizeColor(const UINT &color, const float &nColors)
{
__m128 clr = _mm_cvtepi32_ps( _mm_cvtepu8_epi32((__m128i&)color) );
clr = _mm_mul_ps(clr, _mm_set_ps1(nColors/255.0f) );
clr = _mm_round_ps(clr, _MM_FROUND_TO_NEAREST_INT);
clr = _mm_mul_ps(clr, _mm_set_ps1(255.0f/nColors) );
__m128i iClr = _mm_cvttps_epi32(clr);
return ARGB_COLOR(iClr.m128i_u8[12],
iClr.m128i_u8[8],
iClr.m128i_u8[4],
iClr.m128i_u8[0]);
}
在第一线
,我解开颜色分为4个浮点,但我不能找到合适的方式做相反。
我搜索通过上证所文档,找不到的_mm_cvtepu8_epi32
反向确实存在一个?
_mm_extract_epi32()帮助了一点,但你所说的“非常次优”是什么意思? – bitwise
一般来说,当您存储一些数据,然后立即尝试以不同的字号访问它时,将会有一个巨大的惩罚。从我所看到的,MSVC提取'xmm'寄存器组件的方法就是:存储到内存中,并单独访问这些单词。但我想这个特例并不是最坏的情况。 – Mysticial
好的,无论如何,对于2048x2048它运行在22ms,我认为现在已经足够了。谢谢=) – bitwise