Сурс не читай @ сразу отвечай 1. Не правильные опции блендинга 2. Спрайт рисуется первым со включенным z-тестом
Я так понял что нужно просто этот код: Код (Text): D3DXVECTOR3 sPosition( 0.0f, 0.0f, 1.0f ); pd3dSprite1->Begin( D3DXSPRITE_ALPHABLEND ) ; pd3dSprite1->Draw( pd3dTexture1, 0, 0, &sPosition, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ; pd3dSprite1->End(); D3DXVECTOR3 sPosition2( 500.0f, 350.0f, 0.0f ); pd3dSprite2->Begin( D3DXSPRITE_ALPHABLEND ); pd3dSprite2->Draw( pd3dTexture2, 0, 0, &sPosition2, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ; pd3dSprite2->End(); Вынести за этот: Код (Text): pd3dDevice->EndScene() ;
А почему все зависит от того в каком порядке идет? Нельзя сделать чтоб порядок не имел значение, а зависело бы только от того как они в пространстве находятся? Если дальний спрайт отрисовать вторым, то у первого, почему то края рваные, на фоне дальнего. Например, если в приложенном исходнике поменять порядок отрисовки спрайта: Код (Text): D3DXVECTOR3 sPosition2( 500.0f, 350.0f, 0.0f ); pd3dSprite2->Begin( D3DXSPRITE_ALPHABLEND ); pd3dSprite2->Draw( pd3dTexture2, 0, 0, &sPosition2, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ; pd3dSprite2->End(); D3DXVECTOR3 sPosition( 0.0f, 0.0f, 1.0f ); pd3dSprite1->Begin( D3DXSPRITE_ALPHABLEND ) ; pd3dSprite1->Draw( pd3dTexture1, 0, 0, &sPosition, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ; pd3dSprite1->End();
PodonOK Обдумай внимательно как работает альфа-блендинг + http://ru.wikipedia.org/wiki/Z-буферизация Нет, все должно быть между BeginScene / EndScene
Не могу никак понять. Всяко перепробовал... Могу я не следовать порядку и что бы все нормально отображалось? Этот Код (Text): pd3dDevice->BeginScene() ; pd3dMesh->DrawSubset( NULL ) ; D3DXVECTOR3 sPosition( 0.0f, 0.0f, 1.0f ) ; pd3dSprite1->Begin( D3DXSPRITE_ALPHABLEND ) ; pd3dSprite1->Draw( pd3dTexture1, 0, 0, &sPosition, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ; pd3dSprite1->End() ; D3DXVECTOR3 sPosition2( 500.0f, 350.0f, 0.0f ) ; pd3dSprite2->Begin( D3DXSPRITE_ALPHABLEND ) ; pd3dSprite2->Draw( pd3dTexture2, 0, 0, &sPosition2, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ; pd3dSprite2->End() ; RECT rcFont3d = { 5, 5, 0, 0 } ; pd3dFont->DrawText( 0, szText, -1, &rcFont3d, DT_NOCLIP, 0xFF00B7EF ) ; pd3dDevice->EndScene() ; Перевернуть Код (Text): pd3dDevice->BeginScene() ; RECT rcFont3d = { 5, 5, 0, 0 } ; pd3dFont->DrawText( 0, szText, -1, &rcFont3d, DT_NOCLIP, 0xFF00B7EF) ; D3DXVECTOR3 sPosition2( 500.0f, 350.0f, 0.0f ) ; pd3dSprite2->Begin( D3DXSPRITE_ALPHABLEND ) ; pd3dSprite2->Draw( pd3dTexture2, 0, 0, &sPosition2, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ; pd3dSprite2->End() ; D3DXVECTOR3 sPosition( 0.0f, 0.0f, 1.0f ) ; pd3dSprite1->Begin( D3DXSPRITE_ALPHABLEND ) ; pd3dSprite1->Draw( pd3dTexture1, 0, 0, &sPosition, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ; pd3dSprite1->End() ; pd3dMesh->DrawSubset( NULL ) ; pd3dDevice->EndScene() ; И чтобы все нормально вывелось??? Какие именно стейты поменять или чтото еще?
Ну в общем, я так понял, что без программной сортировки выводимого на экран не обойтись! Вывод моделей, потом спрайтов, текст самым последним. В моем случае все должно выглядеть вот так: Код (Text): pd3dDevice->BeginScene() ; D3DXVECTOR3 sPosition( 0.0f, 0.0f, 1.0f ); pd3dSprite1->Begin( D3DXSPRITE_ALPHABLEND ) ; pd3dSprite1->Draw( pd3dTexture1, 0, 0, &sPosition, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ; pd3dSprite1->End(); pd3dMesh->DrawSubset( NULL ) ; D3DXVECTOR3 sPosition2( 500.0f, 350.0f, 0.0f ) ; pd3dSprite2->Begin( D3DXSPRITE_ALPHABLEND ) ; pd3dSprite2->Draw( pd3dTexture2, 0, 0, &sPosition2, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ; pd3dSprite2->End() ; RECT rcFont3d = { 5, 5, 0, 0 } ; pd3dFont->DrawText( 0, szText, -1, &rcFont3d, DT_NOCLIP, 0xFF00B7EF ) ; pd3dDevice->EndScene() ; Первый спрайт в коде находится перед моделью т.к. в сцене выводится он будет за моделью. Надеюсь что я правильно понял...
PodonOK Молодец, это так Чтобы альфа-блендинг имитировал полупрозрачные материалы, нужно выводить полупрозрачные полигоны от дальних к ближним, типа т.н. алгоритм художника. При этом режим смешивания - не помню как в дх - в опенгл это glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Есть вроде как и чуть более упрощенный способ, не требующий программной обработки. Рисовать одну и ту же сцену два раза (полигоны в произвольном порядке), но с разными настройками контекста: - первый раз как обычно, но с включенной AlphaFunc, разрешающей модификацию только тех пиклелей в цветовом и z-буфере, для которых альфа строго равно 1 (то есть, модификацию в сцену внесут только полностью непрозрачные части) - второй раз альфа-функция разрешает модификацию только тех пикселей, у кого альфа меньше 1, включен блендинг типа (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), проверка z-буфера разрешена, но модификация z-буфера запрещена. То есть, так отрисовываются все полупрозрачные части. Правда требуется соблюдение допущения - у полупрозрачных вещей альфа должна быть заметно меньше единицы, тогда порядок отрисовки двух налагающихся полупрозрачных участков практически не будет заметно сказываться на результате. А преимущества огромны, если практически вся сцена будет отрисовывается дисплей листом (или иерархией дисплей-листов) - проц сможет спокойно заниматься своими вещами, пока видеокарта будет разбираться с листами.