Артефакты, обращенные к XNA 4.0, при рендеринге

#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 работают отлично, но вы должны настроить их непосредственно перед рисованием. В то время я устанавливал это в разделе инициализации моей игры. Впоследствии я начал использовать несколько целевых объектов рендеринга и был вынужден менять состояния между ними, и при удалении параметров шейдера проблем с рисованием не возникает.