пятница, 31 декабря 2010 г.

Ходорковский

М-да... На пляже бабу мне не тра..ать :(

суббота, 25 декабря 2010 г.

Сдали бету

Совсем забыл написать: мы сдали бету!
Теперь надо мастер :)

пятница, 24 декабря 2010 г.

DirectGL progress

Ещё несколько демок прибыло:



Интересное затруднение возникло с mesh subsets, т. к. я не понимаю, каким точно образом attribute buffer управляет сабсетами меша. Чтобы добиться схожей функциональности, я выделил ограниченное кол-во индексных буферов для предполагаемых сабсетов (скажем, 8). Я просто обхожу attribute buffer и формирую индексные буферы сабсетов из главного индексного буфера. Новый индексный буфер выделяется только тогда, когда встречен соответствующий индекс в attribute буфере, поэтому расход памяти пока приемлемый. Можно и дальше развивать эту идею, но всё-таки интересно, как данный подход на самом деле реализован у Microsoft.


С демкой multiple viewports я наткнулся на интересное различие между Direct3D 9 и OpenGL: в первом операция очистки ограничена границами вьюпорта, а в последнем - нет, т. е. чистится всё. Побороть различие удалось установкой scissor теста.



понедельник, 20 декабря 2010 г.

DirectGL progress

Порт ещё одной демки: occlusion query


Изначально я планировал портировать только ядро Direct3D 9, но желание перенести некоторые демки на OpenGL стало столь велико, что я засучил рукава и принялся писать реализацию интерфейса ID3DXMesh и обвязку для него, т. е. D3DXCreateBox(), D3DXCreateSphere() и т. д. Спортирую только самое необходимое, а Wine мне поможет. Кстати, в последнем отсутствует функция D3DXCreateTeapot(), поэтому я думаю просто сделать дамп меша Direct3D в текстовый файл и потом подключить его как .h.

Да, когда-то мы API просто изучали, а теперь мы их портируем :)

четверг, 16 декабря 2010 г.

DirectGL progress

Спортировал ещё несколько демок, включая одну из DX SDK:






Все демки работают идентично Direct3D 9, за исключением той, что искривляет геометрию флага в вершинном шейдере: в D3D fixed-function pixel processing дружит с vertex shader, а в OpenGL - нет, по крайней мере в современных драйверах, поэтому изображение чёрное (я вывел в wireframe). Демка с жёлтым прямоугольником внутри синего - это мой собственный unit-test методов IDirect3DTexture9::LockRect и UnlockRect c RGBA8 форматом.

среда, 15 декабря 2010 г.

воскресенье, 12 декабря 2010 г.

Пальто

Забыл написать, что пальто из зелёного вельвета я всё-таки сшил. 

Выглядит оно здорово, но меня не устроили пропорции: широковато в плечах, в талии не такое зауженное, как хотелось бы, да оказалось, что рукава должны быть по-длиннее, референс диктует правила :) Перешивать не хочу, т. к. его и так уже перекраивали по моей просьбе. Придётся поднакопить деньжат и попытаться ещё раз, с нуля. Думаю, во второй раз всё пойдёт проще, т. к. есть готовый образец и точно ясно, что нужно исправить.



Счастлив тот, кто сшил себе
В Гамбурге штанишки.
Благодарен он судьбе
За свои делишки.

четверг, 9 декабря 2010 г.

3DMark 11

Погонял бесплатную версию бенчмарка на iMac-е с HD 5750.

Тормозит (и сильно), при том что настройки в бесплатной версии - низкие, соответственно и качество... Чувствуется, что ребята создали задел "на будущее", т. к. на однопроцессорной ПЕЧи бенчмарк нормально работать не способен. На странице результатов http://3dmark.com/search можно увидеть, что нормальный fps достижим на системе из трёх ПЕЧей 480 и разогнанном Intel Core i7.

Просмотрел сейчас настройки Performance пакета и ошалел: паршивое разрешение 1280x720 без мультисемплинга и с трилинейной фильтрацией... И это еле ползает на топовых видеокартах! Пиздец.

воскресенье, 5 декабря 2010 г.

DirectGL: linking and loading

Взял Direct3D 9 версию нашего проекта. Поменял файлы заголовков d3d на свои, подменил сдкейные lib-ы на зависимость от directgl, подпилил некоторые зависимости D3DX... И вся эта махина стартанула!!!

Начали трейситься вызовы, создался девайс Direct3D, swap chain, наперечислялись форматы и видеорежимы. Пошла загрузка уровня: создались вершинные декларации (кхм, как BLENDINDICES портировать?), 2D-текстуры, вершинные и индексные буферы, шейдеры (для них я пока сделал заглушку). В итоге упало на попытке чего-то отрисовать :)

Но большего пока и не надо! Как здорово обмануть проект и подсунуть ему фейковую обёртку, которая даже что-то делает. Теперь можно неспеша дебажиться и наращивать требуемый функционал :)

Update

Заставил загружаться в память игровой уровень. Это на самом деле просто, т. к. все ресурсы, которыми оперирует растеризатор, складываются из VB/IB, DXT-текстур, рендер таргетов и шейдеров (роль последних выполняет заглушка).

Интересно, что при заполнении текстуры через LockRect() во флагах обычно указывается 0, что означает, что мы можем как читать, так и писать по указателю. Чтобы только читать, можно указать флаг D3DLOCK_READONLY, но для заполнения нужно что-то вроде WRITEONLY. Можно было бы использовать usage D3DUSAGE_WRITEONLY при создании текстуры, но насколько я понял, этот флаг применяется только к (вершинному) буферу. В общем, для первого (и обычно единственного) lock-а приходится копировать данные из текстуры в PBO, а затем мапить буфер. Я рещил, что можно избежать этого шага, если хранить флажок bDirtyMip=true для текстуры, и на первом lock-e не копировать данные, а просто делать discard пиксельного буфера. После UnlockRect() флажок выставляется в false.

Если данные в текстуре всё равно невалидные и там мусор, то какая клиенту разница, чей это мусор: текстурный или буферный?

Нецензурщина

Каюсь, грешен.

Применил в коде goto, для удаления ресурсов при возникновении ошибки. Знаю, что это почти как мат, но без него придётся либо многократно дублировать код удаления, либо использовать исключения. Первое чревато, а второе не разрешено.