![]() |
|
Модераторы: Rickert |
![]()
|
|
| EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: 1 Всего: 2 |
Скачал готовый 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 |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 7 Всего: 232 |
Стоит проверить, есть ли wireframe режиме "лишние" полигоны (там где мусор). Возможно также нормали не нормализованы (длина не 1), или в твоей проге шейдер освещения сделан некорректно. С Conv3ds.exe не работал ни разу, просто предположения.
-------------------- ![]() |
|||
|
||||
| EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: 1 Всего: 2 |
Да х3 конвертер виноват или нет, я о нем на всякий случай упомянул. А с освящением (оно не шейдерное) все в порядке, в этой же сцене остальные объекты нормально отображаются и те же функции их грузят и рисуют. В wireframe мусора нету, да и откуда бы он взялся, если в других прогах все норм отображается. Но меня все-таки больше нормали беспокоят, мне эти объекты в проект внедрять нада.
Добавлено через 10 минут Как в DX проверить на нормализвацию и нормализовать нормали? Добавлено через 10 минут и 32 секунды |
|||
|
||||
| EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: 1 Всего: 2 |
Попробовал другой Mesh объект. Судя по изображению я уже начал сомневаться в том, что дело в нормалях. Посмотрите на изображение, в чем тут дело, почему моя картинки не такая качественная как в утилитах DirectX SDK и в 3DsMax?
Моя катинка: ![]() DirectX SDK Util картинка: ![]() 3DsMax картинка: |
|||
|
||||
| EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: 1 Всего: 2 |
Дальше хуже. Беру еще более сложный объект - модель BMW325I. И что же происходит когда я ее загружаю и рисую этими самыми функциями:
Это то, что рисует моя программа: ![]() А это как должно быть: ![]() В чем же дело, я в шоке, просто плачу. Наверное чего-то не хватает, каких-то объектов рисования... Пожалуйста помогите кто разбирается. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 7 Всего: 232 |
Последние скрины больше всего похожи на засветку. В свойства diffuse, ambient и specular у материала (буде таковой имеется в Mesh или MeshPart) заглянуть пробовали?
-------------------- ![]() |
|||
|
||||
| EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: 1 Всего: 2 |
Получается к каждому объекту необходимо индивидуально подбирать эти параметры?
Добавлено через 6 минут и 47 секунд Посмотрел свойства части материалов этого объекта Specular и Diffuse вроде ничего необычного, а вот Ambient значение все имеют одно и то же A=255, R=0, G=0, B=0. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 7 Всего: 232 |
EgoBrain, альфа в освещении вообще не участвует. Засветка (если это она) происходит от умножения цвета текстуры или цвета объекта (если без текстуры) на значение большее чем 1. В результате: out_color = texColor * (diffuseMat * diffuseLight + specularColor * specularLight + ambientMat * ambientLight), где texColor не участвует если нет текстуры. Если одна из переменных выходит за рамки 0..1, получится засветка. Значения цветов 0..255 отображаются на 0..1 при расчётах.
Добавлено через 3 минуты и 53 секунды P.S. а вообще я не телепат чтобы читать чужие исходники и модели на расстоянии, если нужна помощь - скинь сюда или мне на мыло проект, попробуем вместе разобраться... -------------------- ![]() |
|||
|
||||
| EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: 1 Всего: 2 |
Ок. Вот проект скидываю на мыло = 2,74 Мб: VS 2008 Proj подойдет?
P.S. Все по учебнику, пока ничего своего не придумывал по DX |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 7 Всего: 232 |
Смотри в ПМ.
-------------------- ![]() |
|||
|
||||
| mr.DUDA |
|
||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 7 Всего: 232 |
Это были нормали, хотя в PIX например всё с ними в порядке (или пикс их нормализует, непонятно). Чтобы пофиксить баг, добавь в SetUpCamera строку:
Будет как на скриншоте. З.Ы. ещё посоветовал бы поставить в конструкторе Width и Height например 800 на 600, а в InitializeDirectX брать размеры так:
И при создании девайса ставь HardwareVertexProcessing, будет летать намного быстрее Присоединённый файл ( Кол-во скачиваний: 5 )
screenshot16.png 93,52 Kb-------------------- ![]() |
||||
|
|||||
| EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: 1 Всего: 2 |
Во!
Но на этом мои вопросы не иссекают, а наоборот умножаются Для начала, как опытный программер, что скажете о концепции кода, правильно и рационально ли построение сцены организовано и т.п.? NormalizeNormals в RenderState это и есть нормализация нормалей, о которой писали выше? Что такое "PIX"? И по поводу программируемого конвейра: в учебники говорилось, что Флаг - HardwareVertexProcessing необходим для шейдеров, а про скорость я даже и не думал. Ну я в этой теме еще нуб. Надеюсь хоть на какие-нить мало мальские ответы. Понимаю, что про все нада читать статьи и т.п., но от разнообразия и количества информации, которую необходимо еще узнать и осмыслить разбегаются мылси, а ответ тут был бы проще Добавлено через 1 минуту и 44 секунды По части установки размеров буфера кадра при изменении размеров окна: это происходит автоматически средой исполнения. Добавлено через 6 минут и 21 секунду Благодаря нормализации нормалей затенение объектов стало более сглаженным, до этого в глаза бросалось как отдельные полигоны затемняются. Выглядело неудовлетворительно. |
|||
|
||||
| mr.DUDA |
|
||||||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 7 Всего: 232 |
Начальный размер для бэкбуффера ты сам задаёшь; проверь, поставив к примеру pp.BackBufferWidth = this.Width / 2, увидишь заблуренную картинку. ДиректХ сам меняет размеры в случае сброса девайса при ресайзинге и т.д.
Ну это не мне решать. Со временем опыт подскажет, что и где можно было бы улучшить, а так если по коду - сильно не к чему придраться.
Это рендер стейт, который не на всех картах может поддерживаться (в капсах посмотреть можно, есть ли поддержка). Вообще нормализовать нормали надо непосредственно при их генерации, т.е. один раз, а не заставлять GPU выполнять несколько лишних умножений и извлечение корня. В принципе это не критично по производительности, современная видеокарта среднего уровня даже не поперхнётся от этого рендерстейта. Мегатулза по адресу "Program Files\Microsoft DirectX SDK (August 2008)\Utilities\bin\x86\PIXWin.exe", с жутким интерфейсом и миллионом возможностей, этакий швейцарский нож от Microsoft, позволяет к примеру захватывать полную инфу о конкретном кадре а после выхода из приложения - просматривать и анализировать что происходило на каждом вызове Direct3D. Из самого рулеза - просмотр содержимого буферов и отладка шейдеров. Смотри скриншот для примера.
В доке по DX SDK ничего про это не сказано (см. топик "Processing Vertex Data (Direct3D 9)"). Факт в том, что работает быстрее, т.к. карточка а не CPU занимается обработкой вершин. Присоединённый файл ( Кол-во скачиваний: 7 )
screenshot17.jpg 266,85 Kb-------------------- ![]() |
||||||||
|
|||||||||
![]()
|
| Правила форума "Программирование игр, графики и искуственного интеллекта" | |
|
|
НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |