Войти
ПрограммированиеФорумГрафика

Не работает смешивание DX9

#0
(Правка: 17:25) 17:20, 17 мар 2023

Проект DirectX 9. Одним словом есть идентичные полигоны которые текстурируются как водяная поверхность. На скриншоте видно что часть полигонов прозрачна - то есть видно дно, а часть полигонов не прозрачна - и эта часть что не прозрачна смешивается не с дном а с фоном экрана - синий цвет. Почему может не работать смешивание?


https://ibb.co/s6SSK3n

for (int i = 0; i < Level->NumRooms; i++)
  {

    //--------------------------
    //сначала рисуем непрозрачные полигоны

    HRESULT hr;

    hr = m_pD3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
    if(FAILED(hr)) return;
    
    hr = m_pD3DDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
    if(FAILED(hr)) return;

    hr = m_pD3DDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_LESSEQUAL );
    if(FAILED(hr)) return;

    //сначала рисуем непрозрачные полигоны
    Room[i].polygonsTri.Draw_Polygon_List(m_pD3DDevice, m_pLevelTile, Level);
    Room[i].polygonsRec.Draw_Polygon_List(m_pD3DDevice, m_pLevelTile, Level);

    //---------------------
    //рисуем прозрачные полигоны
    
    hr = m_pD3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
    if(FAILED(hr)) return;
    
    hr = m_pD3DDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
    if(FAILED(hr)) return;

    hr = m_pD3DDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_LESSEQUAL );
    if(FAILED(hr)) return;
    
    m_pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
    m_pD3DDevice->SetRenderState(D3DRS_BLENDOP,D3DBLENDOP_ADD);
    m_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
      m_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);

    //рисуем прозрачные полигоны с альфа
    Room[i].polygonsTri.Draw_Polygon_List_Alpha(m_pD3DDevice, m_pLevelTile, Level);
    Room[i].polygonsRec.Draw_Polygon_List_Alpha(m_pD3DDevice, m_pLevelTile, Level);

    m_pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE);
  }
#1
6:59, 18 мар 2023

Наверное потому что полигон дна не рисуется. Попробуй без воды.

#2
8:37, 18 мар 2023

SmoothBoy
На скриншоте впечатление, что куллинг неправильный — геометрия вывернута.

#3
9:19, 18 мар 2023

Пробовал менять кулинг- ничего не изменилось.

Геометрия дна рисуется я пробовал отключать рисование воды (прозрачных полигонов).

Может проблема в том что я использую функцию DrawPrimitiveUP без вершинных буферов DX?

Заметил что эти непрозрачные участки воды вобще исчезают когда я включаю D3DRS_ZWRITEENABLE FALSE

    hr = m_pD3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE );
  
    hr = m_pD3DDevice->SetRenderState( D3DRS_ZENABLE, TRUE );

    hr = m_pD3DDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_LESSEQUAL );
    
    m_pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
    m_pD3DDevice->SetRenderState(D3DRS_BLENDOP,D3DBLENDOP_ADD);
    m_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
    m_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);;

    //рисуем прозрачные полигоны с альфа
    
    Room[i].polygonsTri.Draw_Polygon_List_Alpha(m_pD3DDevice, m_pLevelTile, Level);
    Room[i].polygonsRec.Draw_Polygon_List_Alpha(m_pD3DDevice, m_pLevelTile, Level);

    m_pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE);

Тогда скниншот такой - непрозрачных полигонов вобще не видно.
https://ibb.co/2q1d9dg

#4
11:16, 18 мар 2023

SmoothBoy
> Может проблема в том что я использую функцию DrawPrimitiveUP без вершинных буферов DX?
Это никак не влияет (только на скорость).

> Заметил что эти непрозрачные участки воды вобще исчезают когда я включаю D3DRS_ZWRITEENABLE FALSE
У тебя, случайно, дно не рисуется после воды?

#5
15:22, 18 мар 2023

Спасибо за ответы. В том то и дело, что дно (непрозрачные полигоны) рисуется перед водой (прозрачные полигоны).

#6
15:33, 18 мар 2023

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

#7
15:45, 18 мар 2023

Спасиббо огромное, помогло, я сделал 2 цикла. ) Я не спал сегодня нормально из за этой пробелмы. Очень благодарен.

#8
16:53, 18 мар 2023

Я не спал сегодня нормально из за этой пробелмы.

Из-за такой ерунды не спать.
Да гори оно синим пламенем :)

#9
18:46, 18 мар 2023

Ты прав ronniko :-)

ПрограммированиеФорумГрафика