ПрограммированиеФорумГрафика

[Решено] Проблема с перехватом мешей

Страницы: 1 2 3 Следующая »
#0
12:57, 3 ноя 2016

Здравствуйте, я всё-таки решил реализовать тени в Варкрафте, и вот, что я имею на данный момент:

+ Показать

Но вот в чём проблема:

+ GIF

Чем больше примитивов в кадре, тем сильнее глюки. Вот видео с тремя мешами:

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

Я перехватываю меши в теле метода DrawIndexedPrimitive примерно так:

+ Показать

В итоге начинает происходить то, что вы видели на гифке выше, только не так сильно. Похоже на то, что я беру не те значения BaseVertexIndex и/или StartIndex, но этого не может быть.

Сделал вывод информации о вызовах некоторых d3d функций, вот что выходит при рендеринге одного кадра:

+ D3D8_Псевдокод

То есть везде используются одни и те же буферы вершин и индексов.
Пробовал рисовать перехваченный меш не перед вызовом EndScene, а вместо строчки "DrawIndexedPrimitive(4, 0, 510, 24509, 382) // Paladin Body" - тот же результат.
Но если рендерить меш так, то всё работает:

+ Показать

В чём может быть проблема, может я не учёл вызов какой-то важной функции?

#1
13:05, 3 ноя 2016

А если через время тень обновлять ? Типа 1 раз отрисовал и 2 или 3 рендера пропустил.
У тебя в GIF видно что один раз тень нормально рисуеться, а потом несколько раз битая.

Хотя конечно это костыль а не совет.


И еще не понятно почему у тебя блымает тень на видео где герой по серой планке бегает.
Может чуть выше планку поднять от земли по Y (+1.0 или 10.0)?

#2
13:16, 3 ноя 2016

ronniko
> А если через время тень обновлять ? Типа 1 раз отрисовал и 2 или 3 рендера
> пропустил.
Попробовал рисовать сцену раз в несколько кадров - ещё хуже стало, теперь заметна чернота между кадрам.

ronniko
> И еще не понятно почему у тебя блымает тень на видео где герой по серой планке
> бегает.
> Может чуть выше планку поднять от земли по Y (+1.0 или 10.0)?
Это не важно, просто тест был. Теперь я учитываю ландшафт и автоматически перехватываю все модели, находящиеся в кадре, отфильтровывая лишние.

Если интересно, то вот страничка проекта: http://xgm.guru/p/renderedge
Тени пока реализованы только в экспериментальной версии.

#3
13:21, 3 ноя 2016

Может ли твой перехват давать пустые данные ?
Может как то проверки делать.
Мол если пришли пустые данные , например нули в дате сеток, то не рендерить твою тень.

#4
13:25, 3 ноя 2016

ronniko
> Может ли твой перехват давать пустые данные ?
Нет, проверил в дебаг логе - ни разу не вызывается DrawIndexedPrimitive с пустыми данными.

ronniko
> Может как то проверки делать.
> Мол если пришли пустые данные , например нули в дате сеток, то не рендерить твою тень.
Не помогло.

#5
13:28, 3 ноя 2016

Смотрю на Ютубе твое видео и там тени не глючат !
https://www.youtube.com/watch?v=ZtdN4741cK8

#6
13:33, 3 ноя 2016

ronniko, это меш, загруженный из файла, с новым буфером вершин.

#7
13:38, 3 ноя 2016

Так. Щота я тебе не верю.
Ты можешь сохранять дату сетки в фалы ?
Тоесть каждый рендер будет создавать новый файл. Например в папку Dbg файл msh1 потом msh2 и так далее гдето сотню создай и смотри их.
А потом открывай файлы и смотри где битые сетки в каком файле.

#8
13:39, 3 ноя 2016

Еще может надо твои тени подстроить под V-Sync или под FPS варкрафта ?
Что бы твоя программа теней не срабатывала чаще чем FPS варкрафта.

#9
13:44, 3 ноя 2016

ronniko
> Ты можешь сохранять дату сетки в фалы ?
> Тоесть каждый рендер будет создавать новый файл. Например в папку Dbg файл msh1
> потом msh2 и так далее гдето сотню создай и смотри их.
> А потом открывай файлы и смотри где битые сетки в каком файле.
Да, недавно добавил такую возможность, сейчас проверю.
Так, у меня эта функция рассчитана на сохранение меша только один раз, сейчас буду исправлять.

#10
14:06, 3 ноя 2016

Проверил - из пятидесяти ни одной битой модели.

ronniko
> Еще может надо твои тени подстроить под V-Sync или под FPS варкрафта ?
> Что бы твоя программа теней не срабатывала чаще чем FPS варкрафта.
Не нужно, я и так рендерю всю сцену раз в кадр.

#11
14:14, 3 ноя 2016

ENAleksey
> То есть везде используются одни и те же буферы вершин и индексов.
буферы одни и те же но данные в них уже разные, lock()/unlock()

#12
14:59, 3 ноя 2016

буферы одни и те же но данные в них уже разные, lock()/unlock()

+ Показать
#13
15:38, 3 ноя 2016

Я знаю, поэтому и перезаписываю буфер перед каждым вызовом DrawIndexedPrimitive.

#14
16:02, 3 ноя 2016

ENAleksey
> Я знаю, поэтому и перезаписываю буфер перед каждым вызовом
> DrawIndexedPrimitive.
не вижу я этого тут:

+ Показать

где?

И судя по:

m_pVB = pVB; // Буфер вершин, получаю при вызове метода SetStreamSource
m_pIB = pIB; // Буфер индексов, получаю в теле функции SetIndices

и

m_pDevice->SetStreamSource(0, m_pVB, 0, 32);
m_pDevice->SetIndices(m_pIB);

ты наивно думаешь что в этих буферах все те же самые данные.

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.

Тема закрыта.