2011-07-23 101 views
2

我對DirectX 10中的消除鋸齒需要完成的過程感到困惑。我之前根本沒有這樣做,所以它可能只是因爲我一般程序混淆。DirectX中多重採樣的操作順序10

以下是目前爲止我所知道的(或者我認爲我知道的):您需要爲您在着色器中使用的RasterizerState對象啓用多重採樣,並且需要將交換鏈描述中的SampleDesc(DXGI_SWAP_CHAIN_DESC)設置爲計數的支持值(並且質量應該保持爲0,因爲其他值或特定於硬件 - 儘管我不知道爲什麼)。在準備進行更多繪製(ClearRenderTargetView和IASetInputLayout)和調用Present之間的調用之間,應該對後緩衝區進行縮減採樣(通過ResolveSubresource),使其具有相同大小的紋理。然後,(這是我找不到任何東西的部分)以某種方式呈現下采樣紋理。

我在路上有東西搞砸了嗎?或者我只是誤會了最後一步?我看到一些資源指的是在最後一次繪製具有多重採樣着色器紋理(Texture2DMS <>)的全屏幕四邊形期間執行採樣分辨率,但是無法弄清楚會發生什麼,或者你爲什麼要這樣做設備調用來解決這個問題。

我在此做出的任何嘗試都不會增加圖像質量。

回答

5

編輯:我正在使用DX11,你只是使用D3D10_而不是D3D11_,謝謝DeadMG。

你不需要做任何下采樣。

找出您的GPU支持哪種質量模式和樣本數量。 你說質量水平應該是0,這是錯誤的。如果你想在你的着色器讀取多次採樣的紋理(如果您呈現例如全屏四)必須聲明紋理Texture2DMS <

UINT GetMSAAQuality(UINT numSamples,DXGI_FORMAT format) 
    { 
     UINT q=-1; 
     HR(m_device->CheckMultisampleQualityLevels(format,numSamples,&q)); 
     return q-1; 
    } 

    // Use it like this: 
    UINT sampleCount=4; // You set this 
    UINT sampleQuality=GetMSAAQuality(sampleCount,DXGI_FORMAT_CHOOSE_ONE); 

    // For swap chain 
    DXGI_SWAP_CHAIN_DESC d; 
    d.SampleDesc.Count=sampleCount; 
    d.SampleDesc.Quality=sampleQuality; 

     // Now for all the textures that you create for your 
     // render targets and also for your depth buffer 
     D3D11_TEXTURE2D_DESC dtex; 
     dtex.SampleDesc.Quality=sampleQuality; 
     dtex.SampleDesc.Count=sampleCount; 

     // Now for all your render target views you must set the correct dimension type 
     // based on if you use multisampling or not 
     D3D11_RENDER_TARGET_VIEW_DESC drtv; 
     dRtSwapChain.ViewDimension=sampleQuality==0?D3D11_RTV_DIMENSION_TEXTURE2D:D3D11_RTV_DIMENSION_TEXTURE2DMS; 

// For depth stencil view 
D3D11_DEPTH_STENCIL_VIEW_DESC ddsv; 
ddsv.ViewDimension=sampleQuality==0?D3D11_DSV_DIMENSION_TEXTURE2D:D3D11_DSV_DIMENSION_TEXTURE2DMS; 

>:使用此與樣本數,以獲得支持的質量模式。

+0

他將在Direct3D 10中使用D3D11_RENDER_TARGET_VIEW_DESC? – Puppy

+0

這是一個很晚的答覆,因爲我一直非常忙碌,但我真的很感激這個幫助。 我似乎無法得到它的工作(即使將D3D11更改爲D3D10),我不知道爲什麼 - 你有一個深度模具啓用了嗎?我不是在執行通常的3D場景,而是在調用OMSetRenderTargets時使用NULL,而不是僅禁用深度緩衝。 – emandrawkcab

+0

此外,我一直是一個潛伏者很長一段時間,從未發佈到現在,對不起,我不能upvote你的答案! – emandrawkcab