質問が回答されました。詳細については、このテキストの最後にあるEDIT#4を参照してください。添加剤ブレンドによる描画イメージ
私たちは現在、かなりうまく行っているゲームメーカーエンジンに取り組んでいます。私はアニメーションクリエイターに取り組んでおり、追加ブレンドでイメージを描くことが可能かどうか疑問に思っていました。
私を説明しましょう。
私たちはC#のSystem.Drawingライブラリを使用し、Windowsフォームで作業します。今のところ、ユーザは、フレーム化されたアニメーション画像(アニメーションの各フレームを含む画像)をインポートすることによって、自分のアニメーションを作成することができ、ユーザは、所望の場所にこれらのフレームをドラッグアンドドロップすることができる。
実際の問題は、追加ブレンディングでフレームを描画する方法を理解できないことです。
ここでは、それが得られない場合の添加剤ブレンドの例を示します。私はあなたを責めません、私は英語で書くのは難しいです。
次の方法を使用して、パネルに描画するか、フォームに直接描画します。例として、地図エディタ用のタイルマップを描画するコードを示します。 AnimationManagerのコードは混乱しているので、この例ではより明確になります。
using (Graphics g = Graphics.FromImage(MapBuffer as Image))
using (Brush brush = new SolidBrush(Color.White))
using (Pen pen = new Pen(Color.FromArgb(255, 0, 0, 0), 1))
{
g.FillRectangle(brush, new Rectangle(new Point(0, 0), new Size(CurrentMap.MapSize.Width * TileSize, CurrentMap.MapSize.Height * TileSize)));
Tile tile = CurrentMap.Tiles[l, x, y];
if (tile.Background != null) g.DrawImage(tile.Background, new Point(tile.X * TileSize, tile.Y * TileSize));
g.DrawRectangle(pen, x * TileSize, y * TileSize, TileSize, TileSize);
}
添加剤の図面に画像を描画する可能な方法はありますし、もしそうなら、誰かがどのように私を指摘することができれば、私は永遠に感謝するでしょう。ありがとうございました。
EDIT#1:
画像を描画するため、我々はこのような色相とALPH(不透明度)を設定するカラーマトリックスを使用している:
ColorMatrix matrix = new ColorMatrix
(
new Single[][]
{
new Single[] {r, 0, 0, 0, 0},
new Single[] {0, g, 0, 0, 0},
new Single[] {0, 0, b, 0, 0},
new Single[] {0, 0, 0, a, 0},
new Single[] {0, 0, 0, 0, 1}
}
);
多分カラー行列がのために使用することができます添加ブレンド?
EDIT#2:
ちょうどマヘシュチャンドによってthis記事を見つけました。
さらに色の変換に関して多くのことを達成することはできますが、さらにブラウズしてもカラーマトリックスでは不可能な場合があります。 解決策が見つかったら私自身の質問に答えます。
ありがとうございました。
EDIT#3:
XNAは、ブレンドに関するドキュメントhereをたくさん持っています。画像の各ピクセルに加法混色を達成するために使用された式が見つかりました。 =
PixelColor(ソース*の[1、1、1、1])+(先* [1、1、1、1])
多分現在のコンテキストでは、この式を使用する方法がありますか? 私は次回の編集で50の賞金を払うつもりです。
もう一度お返事ありがとうございます。軸索へ
EDIT#4
おかげで、今の問題が解決されます。 XNAとそのSpritebatchを使用して、あなたはそうする添加剤の配合を達成することができます:あなたはのGraphicsDeviceを作成するすべてとSpriteBatch
// In the following example, we want to draw inside a Panel called PN_Canvas.
// If you want to draw directly on the form, simply use "this" if you
// write the following code in your form class
PresentationParameters pp = new PresentationParameters();
// Replace PN_Canvas with the control to be drawn on
pp.BackBufferHeight = PN_Canvas.Height;
pp.BackBufferWidth = PN_Canvas.Width;
pp.DeviceWindowHandle = PN_Canvas.Handle;
pp.IsFullScreen = false;
device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile.Reach, pp);
batch = new SpriteBatch(device);
の
まず、それがコントロールまたはフォーム上に描画する時が来たときに( )例えばOnPaintイベントで、次のコードブロック
// You should always clear the GraphicsDevice first
device.Clear(Microsoft.Xna.Framework.Color.Black);
// Note the last parameter of Begin method
batch.Begin(SpriteSortMode.BackToFront, BlendState.Additive);
batch.draw(/* Things you want to draw, positions and other infos */);
batch.End();
// The Present method will draw buffer onto control or form
device.Present();
これは、ピクセル値自体を操作することなく、まっすぐなwinformsで可能かどうかわかりません。図面用のWPFホストコンポーネントを使用するのはオプションですか?WPFにはブレンドモードを設定するのがはるかに簡単です。 – Dervall
@Dervallもっと検索するほど、WPFホストされたコンポーネントを使用することは非常に良いアイデアだと思うようになります。たぶん、Winformsで直接ピクセル単位のalgoを使用しないと解決策はありません。あるいは、誰かが何らかの奇跡を思いつくだろうか? –
[.DrawImage with opacity?](http://stackoverflow.com/questions/5519956/drawimage-with-opacity) –