Передача D3DFMT_UNKNOWN в IDirect3DDevice9 :: CreateTexture () - PullRequest
1 голос
/ 30 июля 2009

Мне немного интересно об этом, если вы создаете текстуру в памяти в DirectX с помощью функции CreateTexture:

HRESULT CreateTexture(
  UINT Width,
  UINT Height,
  UINT Levels,
  DWORD Usage,
  D3DFORMAT Format,
  D3DPOOL Pool,
  IDirect3DTexture9** ppTexture,
  HANDLE* pSharedHandle
);

... и передать в формате D3DFMT_UNKNOWN что именно должно произойти? Если я попытаюсь получить поверхность первого или второго уровня, это вызовет ошибку? Может ли это потерпеть неудачу? Будет ли графическое устройство просто выбирать случайный формат по своему выбору? Может ли это вызвать проблемы между различными моделями / брендами видеокарт?

Ответы [ 3 ]

2 голосов
/ 30 июля 2009

Я только что попробовал, и он не выходит из строя, в основном

Когда для Usage установлено значение D3DUSAGE_RENDERTARGET или D3DUSAGE_DYNAMIC, оно постоянно отображается как D3DFMT_A8R8G8B8, независимо от того, что я сделал с форматом заднего буфера или другими настройками. Я не знаю, связано ли это с моей видеокартой или нет. Я предполагаю, что указание неизвестного означает «выбери для меня», и что 32-битный формат является самым легким для моей карты.

Когда использовалось значение D3DUSAGE_DEPTHSTENCIL, оно не удавалось последовательно.

Так что мой лучший вывод заключается в том, что указание D3DFMT_UNKNOWN в качестве формата дает DirectX выбор того, каким он должен быть. Или, возможно, он всегда по умолчанию равен D3DFMT_A8R8G8B.

К сожалению, я нигде не могу подтвердить это ни в одной документации. : |

0 голосов
/ 30 июля 2009

Я думаю, что это относится к категории "неопределенных". Некоторые драйверы потерпят неудачу при распределении, в то время как другие могут по умолчанию что-то сделать. Я никогда не видел в WDK ничего, что говорило бы о том, что с этим условием нужно справиться. Я предполагаю, что если вы включите время отладки DX, вы увидите сообщение об ошибке.

0 голосов
/ 30 июля 2009

MSDN не говорит. Но я уверен, что в результате вы получите "D3DERR_INVALIDCALL".

Если метод завершается успешно, возвращаемое значение значение D3D_OK. Если метод не удается, возвращаемое значение может быть одним из следующее: D3DERR_INVALIDCALL, D3DERR_OUTOFVIDEOMEMORY, E_OUTOFMEMORY.

...