イメージをポスタリゼーションする機能を作っています。最初の行に_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台の山車の中に色を展開したが、私は逆を行うための適切な方法を見つけることができません。
私はSSEのドキュメントを通して検索し、1が存在しない_mm_cvtepu8_epi32
の逆を見つけることができませんでしたか?
_mm_extract_epi32は()ビットを助けたが、あなたは「非常に次善」とはどういう意味ですか? – bitwise
一般的に言えば、データを保存してすぐに別の単語サイズで再度アクセスしようとすると、大きなペナルティが発生します。私が見てきたことから、MSVCの 'xmm'レジスタの要素を抽出する方法は、これを正確に行うことです。すなわち、メモリに格納し、別々にアクセスします。しかし、この特定のケースは最悪のシナリオではないと思います。 – Mysticial
とにかく、2048x2048の22msで動作するようになりました。これは今のところ十分です。ありがとう=) – bitwise