2013-08-06 1 views
5

私はRenderscriptを初めて使用しています。私が見た限りでは(私が挿入したデバッグ文から)私のコードは正常に動作しますが、計算された値はAllocation.copyTo(Bitmap)メソッドによってビットマップにコピーされているときに乱雑になりつつあります。Allocation.copyTo(ビットマップ)ピクセル値の破損

私はこの問題を示している奇妙な色を取得するので、最終的にはこのサンプルに私のスクリプトを下にストリップした:

void root(const uchar4 *v_in, uchar4 *v_out, const void *usrData, uint32_t x, uint32_t y) 
{ 
    *v_out = rsPackColorTo8888(1.f, 0.f, 0.f, 1.f); 

    if (x==0 && y==0) { 
     rsDebug("v_out ", v_out->x, v_out->y, v_out->z, v_out->w); 
    } 
} 

ここで私達はちょうど不透明な赤色画素を書いています。デバッグ行は正しい値(255 0 0 255)を出力するように見え、実際にはビットマップに赤いピクセルが表示されます。

しかし、私はわずかに赤色画素にアルファ変更する場合:

*v_out = rsPackColorTo8888(1.f, 0.f, 0.f, 0.998f); 

デバッグプリント(255 0 0 254)がまだ正しいと思われるが、最終的な画素値(0 0 0 254なってしまいます)すなわち。黒。

明らかに、私はそれがあらかじめ混合されたアルファ問題であると思っていましたが、私の理解は、ビットマップからビットマップにコピーする割り当てルーチンがそれを処理することになっていることです。少なくともこれはChet Haaseがこのブログ記事で提案したものです:https://plus.google.com/u/0/+ChetHaase/posts/ef6Deey6xKA

また、事前に乗算されたアルファに関する問題はありません。私のスクリプトはSDKのHelloComputerの例に基づいていました。

私が間違いを犯している場合、私はそれを指摘するRSの達人が大好きです。

レンダスクリプトのドキュメントは2年以上経ってもまだ貧弱です。

PS。私が使用しているビットマップはARGB_888で、SDK18(Android 4.3)でビルドとターゲット設定をしています

+0

アルファではなくrgbの値を変更するとどうですか? –

+0

問題のアルファを変更しています。私はおそらくそれを明確にしていませんでした。アルファが255に変換される限り、すべてが問題ありません。それが他のものであれば、ピクセルはマングルされます。 –

+0

他の例が他の人にとってはうまくいくので、私はそれがAndroid 4.3の問題かADT 20.0.5かどうか疑問に思っています。 –

答えて

3

この例ではアルファが変更されていないため、この例はうまくいきます。

アルファを変更して、通常のビットマップとして割り当てを使用する場合は、(r * a、g * a、b * a、a)を返す必要があります。

しかし、事前に乗算されていないGLサーフェスに割り当てを送信していた場合、コードはそのまま動作します。