Sprite перекрывает Mesh

Тема в разделе "WASM.DirectX", создана пользователем PodonOK, 3 дек 2011.

  1. PodonOK

    PodonOK New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2009
    Сообщения:
    23
    Не могу понять, почему через полупрозрачный спрайт не видно Mesh?
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Сурс не читай @ сразу отвечай

    1. Не правильные опции блендинга
    2. Спрайт рисуется первым со включенным z-тестом
     
  3. PodonOK

    PodonOK New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2009
    Сообщения:
    23
    Я так понял что нужно просто этот код:
    Код (Text):
    1.     D3DXVECTOR3     sPosition( 0.0f, 0.0f, 1.0f );
    2.     pd3dSprite1->Begin( D3DXSPRITE_ALPHABLEND ) ;
    3.     pd3dSprite1->Draw( pd3dTexture1, 0, 0, &sPosition, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ;
    4.     pd3dSprite1->End();
    5.  
    6.     D3DXVECTOR3     sPosition2( 500.0f, 350.0f, 0.0f );
    7.     pd3dSprite2->Begin( D3DXSPRITE_ALPHABLEND );
    8.     pd3dSprite2->Draw( pd3dTexture2, 0, 0, &sPosition2, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ;
    9.     pd3dSprite2->End();
    Вынести за этот:
    Код (Text):
    1.     pd3dDevice->EndScene() ;
     
  4. PodonOK

    PodonOK New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2009
    Сообщения:
    23
    А почему все зависит от того в каком порядке идет?
    Нельзя сделать чтоб порядок не имел значение, а зависело бы только от того как они в пространстве находятся?
    Если дальний спрайт отрисовать вторым, то у первого, почему то края рваные, на фоне дальнего.
    Например, если в приложенном исходнике поменять порядок отрисовки спрайта:
    Код (Text):
    1.     D3DXVECTOR3     sPosition2( 500.0f, 350.0f, 0.0f );
    2.     pd3dSprite2->Begin( D3DXSPRITE_ALPHABLEND );
    3.     pd3dSprite2->Draw( pd3dTexture2, 0, 0, &sPosition2, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ;
    4.     pd3dSprite2->End();
    5.  
    6.     D3DXVECTOR3     sPosition( 0.0f, 0.0f, 1.0f );
    7.     pd3dSprite1->Begin( D3DXSPRITE_ALPHABLEND ) ;
    8.     pd3dSprite1->Draw( pd3dTexture1, 0, 0, &sPosition, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ;
    9.     pd3dSprite1->End();
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    PodonOK
    Обдумай внимательно как работает альфа-блендинг + http://ru.wikipedia.org/wiki/Z-буферизация

    Нет, все должно быть между BeginScene / EndScene
     
  6. PodonOK

    PodonOK New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2009
    Сообщения:
    23
    Не могу никак понять. Всяко перепробовал...
    Могу я не следовать порядку и что бы все нормально отображалось?
    Этот
    Код (Text):
    1.     pd3dDevice->BeginScene() ;
    2.  
    3.     pd3dMesh->DrawSubset( NULL ) ;
    4.  
    5.     D3DXVECTOR3     sPosition( 0.0f, 0.0f, 1.0f ) ;
    6.     pd3dSprite1->Begin( D3DXSPRITE_ALPHABLEND ) ;
    7.     pd3dSprite1->Draw( pd3dTexture1, 0, 0, &sPosition, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ;
    8.     pd3dSprite1->End() ;
    9.  
    10.     D3DXVECTOR3     sPosition2( 500.0f, 350.0f, 0.0f ) ;
    11.     pd3dSprite2->Begin( D3DXSPRITE_ALPHABLEND ) ;
    12.     pd3dSprite2->Draw( pd3dTexture2, 0, 0, &sPosition2, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ;
    13.     pd3dSprite2->End() ;
    14.  
    15.     RECT    rcFont3d = { 5, 5, 0, 0 } ;
    16.     pd3dFont->DrawText( 0, szText, -1, &rcFont3d, DT_NOCLIP, 0xFF00B7EF ) ;
    17.  
    18.     pd3dDevice->EndScene() ;
    Перевернуть
    Код (Text):
    1.     pd3dDevice->BeginScene() ;
    2.  
    3.     RECT    rcFont3d = { 5, 5, 0, 0 } ;
    4.     pd3dFont->DrawText( 0, szText, -1, &rcFont3d, DT_NOCLIP, 0xFF00B7EF) ;
    5.  
    6.     D3DXVECTOR3     sPosition2( 500.0f, 350.0f, 0.0f ) ;
    7.     pd3dSprite2->Begin( D3DXSPRITE_ALPHABLEND ) ;
    8.     pd3dSprite2->Draw( pd3dTexture2, 0, 0, &sPosition2, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ;
    9.     pd3dSprite2->End() ;
    10.  
    11.     D3DXVECTOR3     sPosition( 0.0f, 0.0f, 1.0f ) ;
    12.     pd3dSprite1->Begin( D3DXSPRITE_ALPHABLEND ) ;
    13.     pd3dSprite1->Draw( pd3dTexture1, 0, 0, &sPosition, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ;
    14.     pd3dSprite1->End() ;
    15.  
    16.     pd3dMesh->DrawSubset( NULL ) ;
    17.  
    18.     pd3dDevice->EndScene() ;
    И чтобы все нормально вывелось??? Какие именно стейты поменять или чтото еще?
     
  7. PodonOK

    PodonOK New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2009
    Сообщения:
    23
    Ну в общем, я так понял, что без программной сортировки выводимого на экран не обойтись! Вывод моделей, потом спрайтов, текст самым последним. В моем случае все должно выглядеть вот так:
    Код (Text):
    1.     pd3dDevice->BeginScene() ;
    2.  
    3.     D3DXVECTOR3        sPosition( 0.0f, 0.0f, 1.0f );
    4.     pd3dSprite1->Begin( D3DXSPRITE_ALPHABLEND ) ;
    5.     pd3dSprite1->Draw( pd3dTexture1, 0, 0, &sPosition, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ;
    6.     pd3dSprite1->End();
    7.  
    8.     pd3dMesh->DrawSubset( NULL ) ;
    9.  
    10.     D3DXVECTOR3        sPosition2( 500.0f, 350.0f, 0.0f ) ;
    11.     pd3dSprite2->Begin( D3DXSPRITE_ALPHABLEND ) ;
    12.     pd3dSprite2->Draw( pd3dTexture2, 0, 0, &sPosition2, D3DCOLOR_ARGB( 0xFF, 0xFF, 0xFF, 0xFF ) ) ;
    13.     pd3dSprite2->End() ;
    14.  
    15.     RECT    rcFont3d = { 5, 5, 0, 0 } ;
    16.     pd3dFont->DrawText( 0, szText, -1, &rcFont3d, DT_NOCLIP, 0xFF00B7EF ) ;
    17.  
    18.     pd3dDevice->EndScene() ;
    Первый спрайт в коде находится перед моделью т.к. в сцене выводится он будет за моделью.
    Надеюсь что я правильно понял...
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    PodonOK
    Молодец, это так :) Чтобы альфа-блендинг имитировал полупрозрачные материалы, нужно выводить полупрозрачные полигоны от дальних к ближним, типа т.н. алгоритм художника. При этом режим смешивания - не помню как в дх - в опенгл это glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
     
  9. PodonOK

    PodonOK New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2009
    Сообщения:
    23
    Вот програмка которая выводит все как нужно - в правильном порядке. Написана на FASM
     
  10. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Есть вроде как и чуть более упрощенный способ, не требующий программной обработки. Рисовать одну и ту же сцену два раза (полигоны в произвольном порядке), но с разными настройками контекста:
    - первый раз как обычно, но с включенной AlphaFunc, разрешающей модификацию только тех пиклелей в цветовом и z-буфере, для которых альфа строго равно 1 (то есть, модификацию в сцену внесут только полностью непрозрачные части)
    - второй раз альфа-функция разрешает модификацию только тех пикселей, у кого альфа меньше 1, включен блендинг типа (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), проверка z-буфера разрешена, но модификация z-буфера запрещена. То есть, так отрисовываются все полупрозрачные части.

    Правда требуется соблюдение допущения - у полупрозрачных вещей альфа должна быть заметно меньше единицы, тогда порядок отрисовки двух налагающихся полупрозрачных участков практически не будет заметно сказываться на результате. А преимущества огромны, если практически вся сцена будет отрисовывается дисплей листом (или иерархией дисплей-листов) - проц сможет спокойно заниматься своими вещами, пока видеокарта будет разбираться с листами.