Сброс изменений атрибута XNA, вызванных такими функциями, как SetRenderTarget () - PullRequest
2 голосов
/ 18 марта 2012

Я новичок в XNA и мне интересно, есть ли какой-то встроенный рабочий процесс для восстановления графического стека до заданного состояния. Например, я заметил, что после рендеринга спрайта в мою 3D-сцену 3D-часть перестала работать после вызова SpriteBatch.begin (), и мне пришлось исправить это с помощью

  GraphicsDevice.BlendState = BlendState.Opaque;
  GraphicsDevice.DepthStencilState = DepthStencilState.Default;
  GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap;

Есть ли что-то вроде glPushAttrib () / glPopAttrib (), чтобы обернуть это вместо того, чтобы просто знать, в каких состояниях изменяется движок спрайта?

Моя текущая проблема заключается в том, что я играю с целями рендеринга, и после создания я обнаружил, что моя трехмерная часть кажется испорченной после вызова SetRenderTarget ().

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

  GraphicsDevice.SetRenderTarget(target);
  GraphicsDevice.SetRenderTarget(null);

Комментирование первой строки, приведенной выше, сохраняет правильность 3D-рендеринга, поэтому я предполагаю, что некоторые изменения в этом вызове сильно изменились. Документированы ли эти изменения состояния где-нибудь по вызову или есть способ явно сохранить состояние и восстановить его, когда завершит выполнение какой-либо операции?

1 Ответ

0 голосов
/ 22 марта 2012

Есть некоторая документация по целям рендеринга,

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.rendertarget%28v=xnagamestudio.20%29.aspx

Чтобы сбросить цель рендеринга обратно в буфер, используйте

GraphicsDevice.SetRenderTarget(0, null);

Также (Мой случайныйИдея у меня была, но я не уверен в этом)

Вы могли бы (возможно) добавить это в spritebatch,

SpriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.Opaque, SamplerState.LinearWrap, DepthStencilState.Default, null);

Многое не сделал с целями рендеринга, но я верю, что это то же самое.А затем в следующий раз для сброса просто вызовите spriteBatch без аргументов (или что вы хотите для этого spritebatch)

...