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

Я перехватываю меши в теле метода DrawIndexedPrimitive примерно так:
В итоге начинает происходить то, что вы видели на гифке выше, только не так сильно. Похоже на то, что я беру не те значения BaseVertexIndex и/или StartIndex, но этого не может быть.
Сделал вывод информации о вызовах некоторых d3d функций, вот что выходит при рендеринге одного кадра:
То есть везде используются одни и те же буферы вершин и индексов.
Пробовал рисовать перехваченный меш не перед вызовом EndScene, а вместо строчки "DrawIndexedPrimitive(4, 0, 510, 24509, 382) // Paladin Body" - тот же результат.
Но если рендерить меш так, то всё работает:
В чём может быть проблема, может я не учёл вызов какой-то важной функции?
А если через время тень обновлять ? Типа 1 раз отрисовал и 2 или 3 рендера пропустил.
У тебя в GIF видно что один раз тень нормально рисуеться, а потом несколько раз битая.
Хотя конечно это костыль а не совет.
И еще не понятно почему у тебя блымает тень на видео где герой по серой планке бегает.
Может чуть выше планку поднять от земли по Y (+1.0 или 10.0)?
ronniko
> А если через время тень обновлять ? Типа 1 раз отрисовал и 2 или 3 рендера
> пропустил.
Попробовал рисовать сцену раз в несколько кадров - ещё хуже стало, теперь заметна чернота между кадрам.
ronniko
> И еще не понятно почему у тебя блымает тень на видео где герой по серой планке
> бегает.
> Может чуть выше планку поднять от земли по Y (+1.0 или 10.0)?
Это не важно, просто тест был. Теперь я учитываю ландшафт и автоматически перехватываю все модели, находящиеся в кадре, отфильтровывая лишние.
Если интересно, то вот страничка проекта: http://xgm.guru/p/renderedge
Тени пока реализованы только в экспериментальной версии.
Может ли твой перехват давать пустые данные ?
Может как то проверки делать.
Мол если пришли пустые данные , например нули в дате сеток, то не рендерить твою тень.
ronniko
> Может ли твой перехват давать пустые данные ?
Нет, проверил в дебаг логе - ни разу не вызывается DrawIndexedPrimitive с пустыми данными.
ronniko
> Может как то проверки делать.
> Мол если пришли пустые данные , например нули в дате сеток, то не рендерить твою тень.
Не помогло.
Смотрю на Ютубе твое видео и там тени не глючат !
https://www.youtube.com/watch?v=ZtdN4741cK8
ronniko, это меш, загруженный из файла, с новым буфером вершин.
Так. Щота я тебе не верю.
Ты можешь сохранять дату сетки в фалы ?
Тоесть каждый рендер будет создавать новый файл. Например в папку Dbg файл msh1 потом msh2 и так далее гдето сотню создай и смотри их.
А потом открывай файлы и смотри где битые сетки в каком файле.
Еще может надо твои тени подстроить под V-Sync или под FPS варкрафта ?
Что бы твоя программа теней не срабатывала чаще чем FPS варкрафта.
ronniko
> Ты можешь сохранять дату сетки в фалы ?
> Тоесть каждый рендер будет создавать новый файл. Например в папку Dbg файл msh1
> потом msh2 и так далее гдето сотню создай и смотри их.
> А потом открывай файлы и смотри где битые сетки в каком файле.
Да, недавно добавил такую возможность, сейчас проверю.
Так, у меня эта функция рассчитана на сохранение меша только один раз, сейчас буду исправлять.
Проверил - из пятидесяти ни одной битой модели.
ronniko
> Еще может надо твои тени подстроить под V-Sync или под FPS варкрафта ?
> Что бы твоя программа теней не срабатывала чаще чем FPS варкрафта.
Не нужно, я и так рендерю всю сцену раз в кадр.
ENAleksey
> То есть везде используются одни и те же буферы вершин и индексов.
буферы одни и те же но данные в них уже разные, lock()/unlock()
буферы одни и те же но данные в них уже разные, lock()/unlock()
Я знаю, поэтому и перезаписываю буфер перед каждым вызовом DrawIndexedPrimitive.
ENAleksey
> Я знаю, поэтому и перезаписываю буфер перед каждым вызовом
> DrawIndexedPrimitive.
не вижу я этого тут:
где?
И судя по:
m_pVB = pVB; // Буфер вершин, получаю при вызове метода SetStreamSource m_pIB = pIB; // Буфер индексов, получаю в теле функции SetIndices
и
m_pDevice->SetStreamSource(0, m_pVB, 0, 32); m_pDevice->SetIndices( m_pIB);
ты наивно думаешь что в этих буферах все те же самые данные.
Тема в архиве.
Тема закрыта.