| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Программирование игр, графики и искусственного интеллекта > Нет нормалей в Mesh |
| Автор: EgoBrain 8.11.2008, 11:54 | ||
| Скачал готовый Mesh объект в формате .3ds, конвертнул в .x через Conv3ds.exe, открываю получившийся .x-файл в DirectX View (утилита поставляемая с DirectX SDK March 2008) все нормально: есть материалы (текстуры) есть нормали, только 1 недостаток: при перерисовки появляется какой-то "мусор" на моделе (по объекту как бы разбрасываются мелкие полигоны, преимущественно по краям), если приблизить до максимума, то "мусор" исчезает. Открываю этот же .x-файл в MeshView (утилита поставляемая с DirectX SDK Summer 2004) - "мусора" нет. И еще одна проблемка: загружаю модель в своей MDX-программе - нет нормалей :( И так: почему в одной программе "мусор" есть, а в другой (более старой) - нет, и почему у меня в программе объект без нормалей (если дело в них)? Вот скрины: Объект с "мусором" ![]() Объект без "мусора" ![]() Объект без нормалей в моей проге ![]() Вот код проги:
Эта же самая прога нормально рисует .x объекты, которые идут с SDK, и я еще пробовал сферу в 3ДМаксе с текстурой делать, потом конвертнул в .x той же прогой Conv3ds.exe - все норм, а вот с этой софой фигня какая-та. P.S. Как сделать spoiler? А то картинки скрыть поидее нада |
| Автор: mr.DUDA 8.11.2008, 19:48 |
| Стоит проверить, есть ли wireframe режиме "лишние" полигоны (там где мусор). Возможно также нормали не нормализованы (длина не 1), или в твоей проге шейдер освещения сделан некорректно. С Conv3ds.exe не работал ни разу, просто предположения. |
| Автор: EgoBrain 9.11.2008, 05:54 |
| Да х3 конвертер виноват или нет, я о нем на всякий случай упомянул. А с освящением (оно не шейдерное) все в порядке, в этой же сцене остальные объекты нормально отображаются и те же функции их грузят и рисуют. В wireframe мусора нету, да и откуда бы он взялся, если в других прогах все норм отображается. Но меня все-таки больше нормали беспокоят, мне эти объекты в проект внедрять нада. Добавлено через 10 минут Как в DX проверить на нормализвацию и нормализовать нормали? Добавлено через 10 минут и 32 секунды |
| Автор: EgoBrain 9.11.2008, 08:29 |
| Попробовал другой Mesh объект. Судя по изображению я уже начал сомневаться в том, что дело в нормалях. Посмотрите на изображение, в чем тут дело, почему моя картинки не такая качественная как в утилитах DirectX SDK и в 3DsMax? Моя катинка: ![]() DirectX SDK Util картинка: ![]() 3DsMax картинка: ![]() |
| Автор: EgoBrain 9.11.2008, 11:44 |
| Дальше хуже. Беру еще более сложный объект - модель BMW325I. И что же происходит когда я ее загружаю и рисую этими самыми функциями: Это то, что рисует моя программа: ![]() А это как должно быть: ![]() В чем же дело, я в шоке, просто плачу. Наверное чего-то не хватает, каких-то объектов рисования... Пожалуйста помогите кто разбирается. |
| Автор: mr.DUDA 9.11.2008, 12:06 |
| Последние скрины больше всего похожи на засветку. В свойства diffuse, ambient и specular у материала (буде таковой имеется в Mesh или MeshPart) заглянуть пробовали? |
| Автор: EgoBrain 9.11.2008, 13:13 |
| Получается к каждому объекту необходимо индивидуально подбирать эти параметры? Добавлено через 6 минут и 47 секунд Посмотрел свойства части материалов этого объекта Specular и Diffuse вроде ничего необычного, а вот Ambient значение все имеют одно и то же A=255, R=0, G=0, B=0. |
| Автор: mr.DUDA 9.11.2008, 19:47 |
| EgoBrain, альфа в освещении вообще не участвует. Засветка (если это она) происходит от умножения цвета текстуры или цвета объекта (если без текстуры) на значение большее чем 1. В результате: out_color = texColor * (diffuseMat * diffuseLight + specularColor * specularLight + ambientMat * ambientLight), где texColor не участвует если нет текстуры. Если одна из переменных выходит за рамки 0..1, получится засветка. Значения цветов 0..255 отображаются на 0..1 при расчётах. Добавлено через 3 минуты и 53 секунды P.S. а вообще я не телепат чтобы читать чужие исходники и модели на расстоянии, если нужна помощь - скинь сюда или мне на мыло проект, попробуем вместе разобраться... |
| Автор: EgoBrain 10.11.2008, 12:37 |
| Ок. Вот проект скидываю на мыло = 2,74 Мб: VS 2008 Proj подойдет? P.S. Все по учебнику, пока ничего своего не придумывал по DX |
| Автор: mr.DUDA 11.11.2008, 11:04 |
| Смотри в ПМ. |
| Автор: mr.DUDA 11.11.2008, 13:37 | ||||
Это были нормали, хотя в PIX например всё с ними в порядке (или пикс их нормализует, непонятно). Чтобы пофиксить баг, добавь в SetUpCamera строку:
Будет как на скриншоте. З.Ы. ещё посоветовал бы поставить в конструкторе Width и Height например 800 на 600, а в InitializeDirectX брать размеры так:
И при создании девайса ставь HardwareVertexProcessing, будет летать намного быстрее |
| Автор: EgoBrain 11.11.2008, 14:07 |
| Во! Но на этом мои вопросы не иссекают, а наоборот умножаются Для начала, как опытный программер, что скажете о концепции кода, правильно и рационально ли построение сцены организовано и т.п.? NormalizeNormals в RenderState это и есть нормализация нормалей, о которой писали выше? Что такое "PIX"? И по поводу программируемого конвейра: в учебники говорилось, что Флаг - HardwareVertexProcessing необходим для шейдеров, а про скорость я даже и не думал. Ну я в этой теме еще нуб. Надеюсь хоть на какие-нить мало мальские ответы. Понимаю, что про все нада читать статьи и т.п., но от разнообразия и количества информации, которую необходимо еще узнать и осмыслить разбегаются мылси, а ответ тут был бы проще Добавлено через 1 минуту и 44 секунды По части установки размеров буфера кадра при изменении размеров окна: это происходит автоматически средой исполнения. Добавлено через 6 минут и 21 секунду Благодаря нормализации нормалей затенение объектов стало более сглаженным, до этого в глаза бросалось как отдельные полигоны затемняются. Выглядело неудовлетворительно. |