Autor Wątek: Zła kolejność rysowania  (Przeczytany 1641 razy)

Offline MofC

  • Użytkownik

# Marzec 02, 2014, 20:28:40
Cześć, mam kolejny problem z DirectXem. Polega on na tym że DirectX rysuje moje prymitywy w kolejności odwrotnej do kolejności wypełniania bufora. Wywołując metodę DrawIndexed dla każdego obiektu osobno kolejność jest poprawna tj. obiekty rysowane wcześniej są zasłaniane przez te rysowanego później. Bufor głębokości jest wyłączony. Zauważyłem że jeżeli poprzestawiam coś w depthBufferDesc,  metoda CreateDepthStencilView zwraca błąd ale program działa dalej i kolejność rysowania jest poprawna.

DepthBufor:
D3D11_TEXTURE2D_DESC depthBufferDesc;
ZeroMemory(&depthBufferDesc, sizeof(depthBufferDesc));

// Set up the description of the depth buffer.
// Set up the description of the depth buffer.
depthBufferDesc.Width = Width;
depthBufferDesc.Height = Height;
depthBufferDesc.MipLevels = 1;
depthBufferDesc.ArraySize = 0;
depthBufferDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
depthBufferDesc.SampleDesc.Count = 1;
depthBufferDesc.SampleDesc.Quality = 0;
depthBufferDesc.Usage = D3D11_USAGE_DEFAULT;
depthBufferDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
depthBufferDesc.CPUAccessFlags = 0;
depthBufferDesc.MiscFlags = 0;

// Create the texture for the depth buffer using the filled out description.
d3d11Device->CreateTexture2D(&depthBufferDesc, NULL, &depthStencilBuffer);


//Describe our Depth/Stencil Buffer
D3D11_DEPTH_STENCIL_DESC depthStencilDesc;

depthStencilDesc.DepthEnable = false;
depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
depthStencilDesc.DepthFunc = D3D11_COMPARISON_LESS;
depthStencilDesc.StencilEnable = false;
depthStencilDesc.StencilReadMask = 0xFF;
depthStencilDesc.StencilWriteMask = 0xFF;
depthStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
depthStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
depthStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;

hr = d3d11Device->CreateDepthStencilState(&depthStencilDesc, &depthStencilState);
CheckError(hr,"CreateDepthStencilState");

hr = d3d11Device->CreateDepthStencilView(depthStencilBuffer, NULL, &depthStencilView);
CheckError(hr,"CreateDepthStencilView");

//Create our Render Target
hr = d3d11Device->CreateRenderTargetView( BackBuffer, NULL, &renderTargetView );
CheckError(hr,"CreateRenderTargetView");


//Set our Render Target
d3d11DevCon->OMSetRenderTargets( 1, &renderTargetView, depthStencilView );

Proszę o pomoc

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Estivo

  • Użytkownik
    • Blog

# Marzec 02, 2014, 21:16:29
Eh narysuj sobie na kartce kwadrat, a potem na nim kółko trochę większe. Uzyskasz efekt jak w swoim programie. Kolejność jest poprawna, po prostu to co ma być narysowane na pierwszym planie musi być rysowane na końcu ;)

Offline MofC

  • Użytkownik

# Marzec 02, 2014, 21:31:18
Mam cztery płaskie obiekty rysowane( dodawane do bufora) po kolei na ekranie od lewej do prawej. Metoda DrawIndexed wywoływana jest na końcu. Gdybym to Ja je rysował na kartce to ten najbardziej z prawej byłby na samym wierzchu, natomiast w programie jest odwrotnie. Nie rozumiem dlaczego DirectX rysuje je odwrotnie i dlaczego rysuje poprawnie jak sknocę  depthBufferDesc.
« Ostatnia zmiana: Marzec 02, 2014, 21:32:49 wysłana przez MofC »


Offline MofC

  • Użytkownik

# Marzec 03, 2014, 15:12:52
Dobra, mój błąd, zapomniałem o tym napisać, przepraszam. Wszystko rysuje płasko tzn. w tej samej odległości od kamery, z jednakową wartością współrzędnej z. Używam projekcji ortogonalnej(chyba tak to się nazywa po polsku)
XMMatrixOrthographicOffCenterLH( 0.0f, Width, 0.0f, Height, 0.1f, 100.0f );
I czytałem w tutkach że przy rysowaniu na płaszczyźnie bufor głębokości powinien być wyłączony i że wtedy powinno się rysować według kolejności umieszczania w buforze. Jest jeszcze tak że gdy wywołuje metodę DrawIndexed osobno dla każdego obiektu to kolejność jest poprawna ale tylko w tedy gdy czyszczę bufor głębokości na końcu całego rysowania.

EDIT:
Problem rozwiązany, brakowało wywołania funkcji OMSetDepthStencilState :/
« Ostatnia zmiana: Marzec 06, 2014, 11:12:37 wysłana przez MofC »