пятница, 7 марта 2008 г.

Глюки и недокументированные вещи Direct3D, драйверов NVidia и ATI

Входе работы над нашим стерео драйвером были обнаружены множество глюков, которые в силу специфики в других приложениях видимо небыли замечены.
  1. Как то возникла необходимость выполнять операции прерывая рендеринг игры, пришлось использовать StateBlock'и для того чтобы никакие State игры не испортить. Оказывалось что если создать StateBlock при запуске программы CreateStateBlock(D3DSBT_ALL, ...), а потом его использовать Capture, а затем Apply то все OffsetStream'ов сбросятся в 0. Поэтому пришлось сохранять все смещения потоков (GetStreamSource) и потом их восстанавливать (SetStreamSource). А если же StateBlock создавать каждый раз и применять, то почему-то ещё портятся некоторые вертексные константы с индексами свыше 128, по крайней мере такие вещи были замечены на некоторых играх, причем между Create, Apply вообще не одна константа в коде не менялась.
  2. Частое переключение RenderTarget'ов, DepthStencil поверхностей сильно тормозит на NVidia, а на ATI только при включение AntiAlising'а.
  3. На NVidia не работает 255'ая константа для VertexShader'ов.
  4. ID3DXFont портит какие-то State'ы из за чего появлялись глюки в некоторых играх, при рисование FPS с помощью него. Поэтому вместо него стали пользоваться AngelCode Bitmap Font
  5. На NVidia не работает MRT если поставить в качестве RenderTarget'ов BackBuffer'а от двух SwapChain'ов если создать из со включенным антиалайзингом.
  6. Не где не сказано, но видимо подозревается как само собой разумеющееся. При установке 0'го RenderTarget'а Viewport и ScissorRect устанавливаются по размерам этой поверхности.
Вот вроде все что удалось вспомнить, надеюсь это кому-то будет полезно.