#xna #render
#xna #рендеринг
Вопрос:
Я просто не могу найти решение относительно того, почему XNA неправильно отображает мои модели. В каждой модели, которую я загрузил с XNA 4.0 (X files и файлы FBX), отображаются некоторые грани, которые должны быть скрыты / не видны. Я даже попробовал модели, которые поставляются с образцами с сайта App Hubs.
Вот дамп обратного буфера устройства:
Все эти модели отлично работают в других моих проектах XNA 3.1.
Я попытался переключить свой проект между reach и hidef. Я пробовал запускать разные профили шейдеров. Я пытался включить касательные в модель или сгенерировать их в процессоре или даже полностью исключить это. Я также пытался отрисовывать его, используя BasicEffect вместо моих собственных шейдеров. И я пробовал разные вызовы draw (IndexedPrimitive vs UserIndexedPrimitive vs UserPrimitive). Я пробовал различные варианты отбора (да, я действительно экспортировал свои модели снова, чтобы попробовать правостороннюю сетку и с переворачивающейся намоткой), Варианты наложения и т.д. Теперь у меня совсем закончились идеи…
О, я также использую последние версии DirectX и NVidia 🙂
Есть предложения?
Комментарии:
1. Вы пробовали на другом компьютере?
2. ЛОЛ, ты заметил одну вещь, которую я не включил в тот список вещей, которые я пробовал. На самом деле у меня их нет, но к завтрашнему дню я буду готов «перенести» тестирование на свой рабочий стол и попробовать его там.
3. @Serve well это единственная простая вещь, которую я вижу. Возможно, вы могли бы попробовать проверить списки отличий XNA 3/4 на наличие известных ошибок.
4. @Serve: каково состояние растризатора перед отрисовкой модели?
5. @Neil: Установлено значение Cullcounter против часовой стрелки. DepthStencil установлен по умолчанию, а BlendState — непрозрачным. Я даже попробовал это в шейдере :
Ответ №1:
Хорошо, Нил подал мне идею изучить дополнительные параметры шейдера.
Одно из изменений в XNA 4.0 заключается в том, что намного проще устанавливать различные состояния по сравнению с XNA 3.1. В принципе, согласно большинству документации и блогов, следующего должно быть достаточно :
_device.DepthStencilState = DepthStencilState.Defau<
_device.RasterizerState = RasterizerState.CullCounterClockwise;
_device.BlendState = BlendState.Opaque;
Однако внутри шейдера при включенных следующих параметрах (в частности, параметрах Z) проблема исчезает, и объекты отрисовываются правильно:
technique Main
{
pass p0
{
VertexShader = compile vs_3_0 standardVS();
ZEnable = true;
ZWriteEnable = true;
ZFunc = LessEqual;
AlphaBlendEnable = true;
CullMode = ccw;
PixelShader = compile ps_3_0 standardPS();
}
}
(Код шейдера здесь неправильно форматируется)
Итак … есть ли в XNA 4.0 настройка для всего устройства, которую я пропустил? Или это всегда контролируется для каждого шейдера?
ОБНОВЛЕНИЕ После многих часов разработки Stingray я нашел решение для вышеупомянутого, которое не предполагает использования старых опций шейдера. Состояния устройства XNA работают отлично, но вы должны настроить их непосредственно перед рисованием. В то время я устанавливал это в разделе инициализации моей игры. Впоследствии я начал использовать несколько целевых объектов рендеринга и был вынужден менять состояния между ними, и при удалении параметров шейдера проблем с рисованием не возникает.