2010-08-27 4 views
0

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

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-индекс следует задать для спрайта, если он действительно «под» других спрайтов/объектов?

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

ответ

0

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

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

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

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

+0

Я не уверен в опечатке, возможно, это неправильно, но это все равно не работает. Загруженная текстура - это jpg без альфы. И, как я уже сказал, он работает, когда вводится в другое приложение, поэтому я говорю о флагах и z-индексах. В любом случае, я буду смотреть в альфа, чтобы быть уверенным. –

+0

Я все-таки нашел ответ, когда проверил больше флагов. Мне не хватало SetRenderState (D3DRS_ZFUNC, D3DCMP_ALWAYS); // важна для рисования спрайтов вверху, должна быть сброшена', а после пользовательского рендеринга ему требуется откат к 'SetRenderState (D3DRS_ZFUNC, D3DCMP_LESSEQUAL); 'снова. Пожалуйста, разместите его как новый ответ, чтобы я мог его принять. –

Смежные вопросы