Gamedev LectureСтатьи

Лекция #21. TES4: Oblivion без прикрас. Технологии рендера [Лектор - Zeux]

Автор:

[20:05] <Zeux> в общем, сегодняшняя лекция - об Oblivion
[20:06] <Zeux> и о реверс инжиниринге вообще.
[20:06] <Zeux> сначала я вкратце расскажу, как он проходил
[20:06] <Zeux> и как его можно повторить с любой d3d9-игрой
[20:06] <Zeux> потом приступим к основной теме.
[20:06] <Zeux> Значит, есть такая замечательная программа
[20:06] <Zeux> называется NVPerfHUD
[20:07] <Zeux> версия 3.0 имеет большое количество интересных возможностей
[20:07] <Zeux> например - step by step analysis
[20:07] <Zeux> не помню, как оно называется в оригинале
[20:07] <Zeux> но вы можете посмотреть каждый DIP
[20:08] <Zeux> для которого посмотреть на рендерящийся меш визуально и узнать его vertex declaration
[20:08] <Zeux> посмотреть на шейдеры
[20:08] <Zeux> константы к шейдерам
[20:08] <Zeux> семплеры
[20:08] <Zeux> всякие настройки пайплайна
[20:08] <Zeux> бленд стейт, альфа стейт
[20:08] <Zeux> короче, очень полезная штука :)
[20:08] <Zeux> значит, о шейдерах вкратце
[20:08] <Zeux> как все знают, в итоге в d3d передается бинарный вариант шейдера
[20:09] <Zeux> на самом деле, это тупая трансляция в байткод
[20:09] <Zeux> потом этот байт код транслируется кажется в мю-код
[20:09] <Zeux> который специфичен для вендора
[20:09] <Zeux> но идея в том
[20:09] <Zeux> что этот самый байт код можно дизассемблировать
[20:09] <Zeux> получив асм.
[20:09] <Zeux> (как ни странно :))
[20:09] <Zeux> дизассемблер шейдеров я видел на www.clootie.ru
[20:10] <Zeux> но он у меня работал криво
[20:10] <Zeux> ну и его написали в NV.
[20:10] <Zeux> таким образом, в случае шейдеров вы получаете асм-код плюс имена для констант, если они есть в constant table шейдера
[20:10] <Zeux> этого обычно хватает.
[20:10] <Zeux> минус только один.
[20:10] <Zeux> иногда строчки шейдера вылезают за доступную область
[20:10] <Zeux> (особенно def констант)
[20:11] <Zeux> и конец строчек не виден
[20:11] <Zeux> как с этим бороться?
[20:11] <Zeux> - большое разрешение
[20:11] <Zeux> у меня максимум 1024х768, поэтому к сожалению в одном шейдере
[20:11] <Zeux> видно было не все.
[20:11] <Zeux> - альтернативные методы
[20:11] <Zeux> про них сейчас чуть-чуть скажу.
[20:11] <Zeux> Теперь, собственно, почему это возможно
[20:12] <Zeux> понятное дело, люди в NVidia были не дураки
[20:12] <Zeux> и просто так перфхуд подключить к любому приложению не получится.
[20:12] <Zeux> надо, чтобы девелопер выбрал спец. адаптер и REF-растеризацию.
[20:12] <Zeux> тем не менее, есть обходные пути.
[20:12] <Zeux> Во-первых, в случае Обливиона они забыли выключить поддержку перфхуда
[20:12] <Zeux> и поэтому вы без всяких изысков можете анализировать его сами :)
[20:13] <Zeux> Во-вторых, есть хардкорный метод от neteraser-а, заключающийся в исправлении асм-кода вызова CreateDevice
[20:13] <Zeux> В-третьих, есть метод, который работает, видимо, на всех играх (вчера были протестированы FEAR, Tomb Raider последний, HL2)
[20:13] <Zeux> и более прост.
[20:13] <Zeux> Пишется proxy D3D9 dll
[20:14] <Zeux> в которой возвращается свой экземпляр класса, реализующего интерфейс IDirect3D9, у которого переписывается ф-ия CreateDevice
[20:14] <Zeux> подробнее есть например статья на codeproject
[20:14] <Zeux> урл потом скажу
[20:15] <Zeux> тут маленькая тонкость - похоже, perfhud детектит такую попытку
[20:15] <Zeux> на 100% работает такой метод: dll свою называем z3d9.dll и в exe приложения руками меняем d3d9.dll на z3d9.dll
[20:15] <Zeux> Таким образом реверс инжиниринг становится возможным для любого приложения
[20:15] <Zeux> использующего d3d9
[20:16] <Zeux> для opengl есть glIntercept, он далеко не так удобен, но кое-что сделать можно.
[20:16] <Zeux> Зато, кстати, он сохраняет шейдеры и текстуры на диск

[20:16] <Zeux> введение закончено, если есть вопросы - задавайте
[20:16] <Zeux> я пока найду линк на dll
[20:16] <Zeux> которую я собрал и которая подключает перфхуд
[20:18] <Zeux> вчера это дело проверял Cote-Duke на вышеуказанных играх
[20:18] <Zeux> выяснил в итоге, что хартбиты есть везде
[20:18] <Zeux> но это так, side-note :)

[20:18] <Zeux> да, перфхуд весит около 30 метров
[20:18] <Zeux> скачать его можно на developer.nvidia.com
[20:19] <Zeux> работает только с драйверами 75.xx
[20:19] <Zeux> да, перфхуд работает только на NV-картах
[20:19] <Zeux> говорят, ATi собирается выпустить свое
[20:19] <Zeux> причем оно будет работать вообще с любым приложением
[20:19] <Zeux> без хаков :)

[20:18] <Darth> Средство, гарантировано избавляющие от возможности реверс-инжиниринга?
[20:19] <Zeux> Darth, я не буду говорить точно
[20:19] <Zeux> но я не знаю такого средства
[20:19] <Anubis_> не буду качать :)
[20:20] <Zeux> значит, бороться с этим, конечно, можно как-то
[20:20] <Zeux> например, грузить d3d9.dll жестко из системной директории
[20:20] <Zeux> это не спасет все равно
[20:20] <Zeux> можно пробовать криптовать ее имя
[20:20] <Zeux> тогда нельзя будет поменять ее имя в exe, и работать не будет
[20:21] <Zeux> но задумайтесь
[20:21] <Zeux> с учетом выхода тулзы от ATi это не спасет :)
[20:21] <Zeux> да, еще
[20:21] <Zeux> метод neteraser-а, видимо, работает всегда
[20:21] <Zeux> но он хардкорен тоже вполне, т.к. exe-шник может быть сжат
[20:21] <Zeux> в общем, попробовать защититься можно
[20:21] <Darth> Динамически, с помощью GetProcAdress вызывать CreateDirect3D9, программу шифровать. По идее, должно защитить
[20:21] <Zeux> но универсального средства нет.
[20:22] <Zeux> т.е. в теории можно будет раскриптовать и т.д.
[20:22] <Anubis_> можно проверять так, типа если создали при запросе на нормальный девайс - какую-нить лажу, то вываливаццо и материццо
[20:22] <Zeux> можно проверять по капсам номер созданного девайса
[20:22] <Zeux> но!
[20:22] <Zeux> капсы можно вернуть свои :)
[20:23] <Zeux> короче, универсального средства нет. Криптование работает, видимо, нормально.
[20:23] <Zeux> но от очень вдумчивого и настойчивого человека не спасает :)

[20:23] <Zeux> Значит, мы плавно подошли к теме разговора.
[20:24] <Zeux> Я буду говорить, конечно, только про рендер технологии, причем буду стараться делать это беспристрастно без выкриков "как такие рождаются?.." :)
[20:24] <Zeux> Во-первых, дисклаймер. Мне не удалось включить поддержку шейдеров 3.0 несмотря на то, что карточка их держит (6600 gt)
[20:25] <Zeux> так что весь рассказ про 2.0 shading path
[20:25] <Zeux> дисклаймер 2 - там 19 или 20 shader packages
[20:25] <Zeux> поэтому видимо очень зависит все от package
[20:25] <Zeux> ну не все
[20:25] <Zeux> но кое-что зависит
[20:25] <Zeux> в остальном - настройки максимальные (без исправлений в конфиге)
[20:26] <Zeux> Я делал реверс инжиниринг кусками
[20:26] <Zeux> брал некоторую сцену
[20:26] <Zeux> и разбирал там все, или почти все.
[20:26] <Zeux> примерно так я и буду рассказывать.
[20:27] <Zeux> огромный минус перфхуда для реверс инжиниринга в том, что шейдеры там нельзя сохранять
[20:27] <Zeux> отсюда следуют два момента
[20:27] <Zeux> 1. возможно, в шейдерах есть опечатки, т.к. я, как дурак, сидел перед экраном и переписывал шейдеры на ноут, и кое-где я опечатки даже в процессе дальнейшего разбора поймал
[20:28] <Zeux> 2. некоторые шейдеры мне было немножко лениво переписывать (157 инструкций, 275 инструкций)

[20:28] <Zeux> вот, ладно. Значит, сценарий первый.
[20:29] <Zeux> Здесь я хотел просто посмотреть на общий пайплайн с освещением
[20:29] <Zeux> поэтому была выбрана комната
[20:29] <Zeux> (индор, соответственно)
[20:29] <Zeux> камера стояла так, что ни один человек не попадал в поле зрения
[20:29] <Zeux> был виден очень небольшой кусочек
[20:29] <Zeux> короче, исключительно рендер интерьера.
[20:29] <Zeux> итак, небольшая статистика по этому сценарию.
[20:29] <Zeux> 220 дипов
[20:30] <Zeux> 128 метров видеопамяти
[20:30] <Zeux> gpu idle time = ~0
[20:30] <Zeux> 15-30 мсек на кадр
[20:30] <Zeux> ~3 мсек - в драйвере
[20:30] <Zeux> (эту статистику дает перфхуд)

[20:30] <Zeux> итак, поехали.
[20:31] <Zeux> сначала рендерится в первый проход интерьер (65 dips)
[20:31] <Zeux> потом делается еще один проход (содержание проходов буду комментировать потом) для интерьера - 17 dips
[20:31] <Zeux> потом - еще один проход для интерьера (53 dips)
[20:31] <Zeux> потом - еще один проход для интерьера (53 dips)
[20:31] <Zeux> (мы видим, что почти весь интерьер рендерится в 3 прохода, а кое-что в 4)
[20:32] <Zeux> дальше рендерится попавшее в кадр окно с environment map (1 dip)
[20:32] <Zeux> дальше рендерится бахрома ковра (2 dips)
[20:32] <Zeux> дальше рендерится свое обмундирование (щит, что-то еще - 16 dips. Я не буду сейчас останавливаться на этом, по персонажам будет отдельный сценарий)
[20:33] <Zeux> весь этот рендеринг производился в текстуру размером с экран
[20:33] <Zeux> (800 x 600 в моем случае)
[20:33] <Zeux> с форматом r16g16b16a16f (floating-point, по half-у на компонент)
[20:33] <Zeux> дальше идет обработка hdr-текстур и композитинг финального изображения
[20:33] <Zeux> (детали потом)
[20:34] <Zeux> дальше 21 dip идет рендеринг интерфейса
[20:34] <Zeux> (интерфейса, который виден на экране - health bar, курсор, etc., etc.)

Страницы: 1 2 3 4 5 6 Следующая »

#reverse engineering

20 апреля 2006

Комментарии [28]