Проект DirectX 9. Одним словом есть идентичные полигоны которые текстурируются как водяная поверхность. На скриншоте видно что часть полигонов прозрачна - то есть видно дно, а часть полигонов не прозрачна - и эта часть что не прозрачна смешивается не с дном а с фоном экрана - синий цвет. Почему может не работать смешивание?
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); }
Наверное потому что полигон дна не рисуется. Попробуй без воды.
SmoothBoy
На скриншоте впечатление, что куллинг неправильный — геометрия вывернута.
Пробовал менять кулинг- ничего не изменилось.
Геометрия дна рисуется я пробовал отключать рисование воды (прозрачных полигонов).
Может проблема в том что я использую функцию 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
SmoothBoy
> Может проблема в том что я использую функцию DrawPrimitiveUP без вершинных буферов DX?
Это никак не влияет (только на скорость).
> Заметил что эти непрозрачные участки воды вобще исчезают когда я включаю D3DRS_ZWRITEENABLE FALSE
У тебя, случайно, дно не рисуется после воды?
Спасибо за ответы. В том то и дело, что дно (непрозрачные полигоны) рисуется перед водой (прозрачные полигоны).
SmoothBoy
> Спасибо за ответы. В том то и дело, что дно (непрозрачные полигоны) рисуется
> перед водой (прозрачные полигоны).
с чего такой вывод? У тебя обход по каким-то комнатам и если и есть сортировка то только внутри этих комнат. Попробуй отрисовать двумя циклами, в первом только непрозрачные части комнат, во втором только прозрачные.
Спасиббо огромное, помогло, я сделал 2 цикла. ) Я не спал сегодня нормально из за этой пробелмы. Очень благодарен.
Я не спал сегодня нормально из за этой пробелмы.
Из-за такой ерунды не спать.
Да гори оно синим пламенем :)
Ты прав ronniko :-)