2

ゲーム画面を個別に色分けされたピクセルで塗りつぶしたい場合、どうすればよいですか?

たとえば、各ピクセルがセルである「ライフ ゲーム」タイプのゲームを作成したい場合、XNA を使用してこれをどのように実現できますか?

画面サイズの値の配列を使用SetData()してオブジェクトを呼び出してみましたが、次のように不満があります。Texture2DColor

GraphicsDevice でアクティブに設定されているリソースで SetData を呼び出すことはできません。

SetData を呼び出す前に、デバイスから設定を解除してください。

言われた通りにするにはどうすればいいですか?または、さらに良い...画面を任意のピクセルで塗りつぶすための、より良い、効率的な代替方法はありますか?

4

4 に答える 4

1

最も理想的なアプローチは、シェーダーにそれを実行させることです。私はシェーダーのみを使用する前にライフ ゲーム シミュレーションを実装しました。他の人は XNA http://www.xnainfo.com/content.php?content=21で同じことをしました。

アイデアは、2 つのテクスチャを使用することです。1 つは古い状態用で、もう 1 つは新しい状態用です。新しいテクスチャにレンダリングし、古いテクスチャから読み取るように設定します。シェーダーで直接細胞自律を行うことができます:)。

これで素晴らしいパフォーマンスを得ることができます.1024x1024グリッドを使用して約300fpsでした.

于 2011-01-15T14:25:48.557 に答える
1

Texture2D にデータを設定した後は、それを変更することはできません。これを回避するには、1x1 Texture2D を作成し、その色を白に設定します。次に、ピクセルにしたい色の色合いで描画します。テクスチャは白なので、選択した色に完全にシェーディングされた希望の色が得られます。

Texture2D pixel = new Texture2D(App.GraphicsDevice, 1, 1);
colors = new Color[1];
colors[0] = Color.White;
pixel.SetData(colors);

これは、上記のピクセルを使用してピクセルを描画するサンプル関数です。

public void DrawPixel(SpriteBatch spriteBatch, Vector2 pos, Color tint)
{
    spriteBatch.Draw(pixel, pos, tint);
}

ピクセル描画ごとにこの Texture2D を再利用します。

于 2011-01-13T01:13:38.833 に答える
1

取得しているエラーに関しては、テクスチャ データがデバイスのサンプラー ユニットの 1 つにまだバインドされている間に、テクスチャ データを変更しようとしていることを意味します。SpriteBatch.Begin/End ブロック内で SetData を呼び出していますか? そうであれば、それが問題です (描画を行う前にテクスチャを更新してください)。それ以外の場合は、GraphicsDevice.Textures[x] = yourTexture を使用して、デバイスのテクスチャ サンプラーの 1 つでテクスチャを直接設定していますか? その場合は、データの変更を開始する前に Textures[x] を null に設定します。

あなたがしていることの効率に関する限り、それは理想的ではありませんが、おそらくあなたの目的にとっては問題ではありません. 画像の解像度を適度に保つようにしてください。おそらくこのアプローチでは 200 FPS に到達しないことを認識してください。ただし、パフォーマンスについて心配する前に、試してみて、十分に高速かどうかを確認してください。

于 2011-01-04T02:19:56.550 に答える
0

ここで説明した手法を使用して、SpriteBatch を使用して四角形を描画できます。それを使用して、画面を覆う 1x1 の長方形を描画できます。それがどれほどパフォーマンスが高いかはわかりませんが、うまくいくはずです。

このApp Hubの投稿は、あなたが解決しようとしている正確な問題について話しているようです.

于 2010-12-23T12:03:57.000 に答える