Как построить отдельные пиксели с помощью API-интерфейсов XNA? - PullRequest
2 голосов
/ 23 декабря 2010

Если бы я хотел заполнить свой игровой экран индивидуально окрашенными пикселями, как бы я это сделал?

Например, если бы я хотел написать игру типа « игра жизни », в которой каждый пиксель представлял собой ячейку, как бы я достиг этого, используя XNA?

Я пытался просто вызвать SetData() для Texture2D объекта, используя массив размера экрана Color, но он жалуется на:

Вы не можете вызывать SetData для ресурса, когда он активно установлен в GraphicsDevice.

Сбросьте его с устройства перед вызовом SetData.

Как мне сделать, как он просит? Или еще лучше ... есть ли альтернативный, лучший, эффективный способ заполнить экран произвольными пикселями?

Ответы [ 4 ]

1 голос
/ 15 января 2011

Самый идеальный подход - заставить ваш шейдер сделать это за вас.Я реализовал игру симуляции жизни, прежде чем использовать только шейдеры, а другие сделали то же самое с XNA http://www.xnainfo.com/content.php?content=21.

Идея состоит в том, чтобы использовать две текстуры, одну для старого состояния и одну для нового состояния,Настройте его так, чтобы вы отображали новую текстуру и читали со старой.Вы можете сделать свою клеточную автономию прямо в шейдере:).

Вы можете получить отличную производительность с этим, у меня было около 300 кадров в секунду при использовании сетки 1024x1024.

1 голос
/ 04 января 2011

Что касается ошибки, которую вы получаете, это означает, что вы пытаетесь изменить данные текстуры, пока они все еще привязаны к одному из блоков сэмплера на устройстве. Вы вызываете SetData внутри блока SpriteBatch.Begin / End? Если это так, проблема в этом (обновите текстуру перед тем, как начать рисовать). В противном случае вы устанавливаете свою текстуру непосредственно в один из сэмплеров текстуры устройства, с GraphicsDevice.Textures [x] = yourTexture? Если это так, установите Textures [x] в null, прежде чем начинать изменять данные.

Что касается эффективности того, что вы делаете, это не идеально, но, вероятно, это не имеет значения для ваших целей. Постарайтесь сохранить разумное разрешение изображения и поймите, что при таком подходе вы, вероятно, не достигнете 200 кадров в секунду, но я попробую и посмотрю, достаточно ли это быстро, прежде чем вы начнете беспокоиться о производительности.

1 голос
/ 13 января 2011

После настройки данных на 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 для каждого рисования пикселей.

0 голосов
/ 23 декабря 2010

Вы можете использовать технику, которую я упоминаю здесь , чтобы рисовать прямоугольники, используя SpriteBatch. Затем вы можете использовать это, чтобы нарисовать прямоугольники 1x1, которые покрывают экран. Я не знаю, насколько это будет эффективно, но это должно сработать.

Эта публикация в App Hub , кажется, говорит о точной проблеме, которую вы пытаетесь решить.

...