Рисование спрайтов на устройстве D3D - PullRequest
0 голосов
/ 27 августа 2010

У меня есть подключенный DirectX, используемый в коде C ++, который рисует текст и спрайт.Я протестировал его, и он хорошо рисовал на 2D-приложении.Однако, когда я попробовал это с 3D-приложением (на самом деле, это была какая-то сложная игра), был виден только текст.Исходя из этого, я понял, что спрайт не перекрывается чем-то другим, поэтому текст тоже будет.Я установил флаги

    SetVertexShader(0);
    SetPixelShader(0);
    SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);

    //SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); 
    SetRenderState(D3DRS_ZENABLE, false);
    SetRenderState(D3DRS_LIGHTING, FALSE);
    SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

    SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
    SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
    SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
    SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
    SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);

По какой-то причине ALPHABLEND привел к тому, что спрайт вообще не был виден в любом приложении, поэтому я не включил его, и он закомментирован.

Существует ли какой-нибудь безотказный способ рисования спрайтов через D3D?В противном случае, следует ли мне использовать для них разные флаги / значения?

Кроме того, какой z-индекс я должен установить для спрайта, если он действительно "под" некоторыми другими спрайтами / объектами?

(Я не являюсь автором чего-либо привязанного к устройству, у меня есть только подключенный DirectX API и даже не знаю код приложения, которое я рисую).

1 Ответ

0 голосов
/ 27 августа 2010

Во-первых, самый простой способ визуализации спрайтов на устройстве D3D - это ID3DXSprite.

Во-вторых, я думаю, что есть опечатка, и вы хотели установить для COLOROP значение MODULATE, а не ALPHAOP.

Тем не менее, я думаю, что в обоих случаях вы получите только невидимый вывод, если ваша альфа равна 0. Может ли быть, что используемая вами текстура полностью прозрачна?

Кроме того, не забудьте восстановить все состояния рендеринга, которые вы изменили (прямо или косвенно) после того, как закончите с введенным кодом рендеринга. Простой способ сделать это - захватить блок состояния и применить его после того, как вы закончите со своим собственным рендерингом.

...