DirectX 11 Рендеринг объекта наизнанку

У меня много проблем, пытаясь следовать книге Фрэнка Луны по 3D-программированию DirectX 11, и в настоящее время я дошел до главы 7, раздела 2. Я импортировал файл модели черепа и начал его визуализировать. Странно то, что когда я рендерю его, кажется, что обратные грани отображаются поверх лицевых граней. Я почти уверен, что это случай того, что происходит. Но я задаю этот вопрос для помощи и руководства о том, где я могу ошибаться. Я отредактирую этот пост, добавив свой код, если это потребуется, чтобы помочь мне понять, где я ошибаюсь, большое спасибо! (фото прилагается)

Фото — лицом к черепу, немного левее

Фото: над черепом, лицом вниз

РЕДАКТИРОВАТЬ: я установил точку останова в своем коде после первого цикла вызова отрисовки, и он не показывает лица, которые находятся за передними, поэтому проблема решена в этом кадре, но когда я перехожу к следующему кадру, это когда начнутся проблемы.


person Sharpie    schedule 08.09.2017    source источник
comment
Эта модель выглядит так же, когда вы изменяете ее z-преобразование (перемещаете ее дальше)? Какое значение вы указали для ближней и дальней плоскостей усеченного конуса?   -  person Asesh    schedule 08.09.2017
comment
Похоже, вы установили неправильный режим отбраковки при настройке описание растеризатора.   -  person user7860670    schedule 08.09.2017
comment
Я использую XMMatrixLookAtLH, должен ли я реализовать XMMatrixPerspectiveLH?   -  person Sharpie    schedule 08.09.2017
comment
@VTT Я пытался изменить описание растеризатора, но эти изображения по умолчанию без изменений состояния растеризатора.   -  person Sharpie    schedule 08.09.2017
comment
После того, как вы создадите состояние растеризатора, вам нужно применить его для обработки конвейера, вызвав RSSetState перед рисованием сетки. Переключатели режимов отбраковки должны быть хорошо видны. С другой стороны, это тоже похоже на то, что проверка глубины не проводится: вид сверху предполагает, что сначала нужно нарисовать череп, а потом зубы сверху — если бы была проверка глубины, то зубы не были бы видны даже при неправильной выбраковке.   -  person user7860670    schedule 08.09.2017
comment
@VTT, в том-то и дело, что я даже не реализовал описание растеризатора, чтобы вообще изменить процесс растеризации. Эти изображения полностью используются по умолчанию в отношении процесса растеризации.   -  person Sharpie    schedule 08.09.2017
comment
У меня есть установленный буфер глубины, и каждый вызов отрисовки очищается с помощью: mDevContext->ClearDepthStencilView(mDepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);   -  person Sharpie    schedule 08.09.2017
comment
Но правильно ли вы привязываете его, чтобы тест глубины работал? Вы можете взглянуть на Настройка функциональности трафарета глубины.   -  person user7860670    schedule 08.09.2017


Ответы (2)


Такие проблемы иногда связаны с настройкой CullMode в D3D11_RASTERIZER_DESC. Попробуйте изменить с D3D11_CULL_BACK на D3D11_CULL_FRONT или наоборот. Также взгляните на опцию FrontCounterClockwise файла D3D11_RASTERIZER_DESC.

person nh_    schedule 08.09.2017
comment
Глядя на картинку, я не думаю, что это из-за режима отбраковки. - person Asesh; 08.09.2017

Я понял, что было причиной моего горя. Я использовал классы DirectXToolKits SpriteFont и SpriteBatch, чтобы использовать функцию DrawString для отображения счетчика FPS в верхнем левом углу экрана, и, должно быть, он возился с вызовами ID3D11DeviceContext::DrawIndexed. Спасибо за ваш вклад и мозговой штурм!!

person Sharpie    schedule 08.09.2017
comment
Вы должны посмотреть на вики, чтобы точно узнать, какие состояния SpriteBatch устанавливает. Вы должны обязательно установить любое состояние, на которое вы полагаетесь, и очистить все «неочищенные» состояния, которые могут вызвать проблемы. - person Chuck Walbourn; 10.09.2017
comment
Спасибо за вклад, я сейчас пытаюсь работать над решением - person Sharpie; 10.09.2017