2012-04-14 93 views
2

我試圖在DirectX9中實現非常基本的延遲着色。我現在有能力使用2個渲染目標(後臺緩衝區和另一個紋理)。所以我可以渲染法線或深度,但不能同時渲染。我的問題是有人可以解釋如何渲染到多個紋理目標。我的印象是,我只能使用下面的代碼。它只適用於索引爲零的情況,這可能意味着其中一個表面沒有被寫入。DirectX9中的多個渲染目標

d3dDevice->SetRenderTarget(0, surfaceDepth); 
d3dDevice->SetRenderTarget(1, surfaceNormal); 

我得到這個消息:的Direct3D9:(WARN):無法呈現的渲染目標,它也用作紋理。渲染目標被檢測爲綁定,但無法檢測渲染中是否實際使用了紋理。

我知道可能有幾件事情可能與此消息有關......我想如果有人可以解釋如何正確使用多個呈現目標索引。你也改變每個渲染目標的技巧。目前,我的着色器爲管道提供了「常規技術」和「深度技術」和「後處理技術」。

謝謝你的時間。

這裏是一些代碼:

SetTransforms(); 
d3dDevice->SetRenderTarget(0, surfaceDepth); 
HR(d3dDevice->Clear(0, NULL, D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET, 0xff000000, 1.0f, 0)); 
scenes[sceneIndex]->setTechnique("depthTech"); 
scenes[sceneIndex]->render(dt); 

d3dDevice->SetRenderTarget(1, surfaceNormal); 
HR(d3dDevice->Clear(0, NULL, D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET, 0xff000000, 1.0f, 0)); 
scenes[sceneIndex]->setTechnique("normalTech"); 
scenes[sceneIndex]->render(dt); 
+0

你目前是否還將這些曲面設置爲紋理? (在調用d3dDevice-> SetTexture(...)) – Torious 2012-04-14 22:46:24

+0

即時設置與當前FX的紋理。從設備調用set紋理意味着什麼?我最初使用它來解除紋理,如:pDevice-> SetTexture(0,NULL); //解除紋理渲染 \t pDevice-> SetTexture(1,NULL); //解除紋理渲染 – iEATeVo 2012-04-15 00:15:37

+0

nm我想到了......我誤解了幕後發生的事情。 – iEATeVo 2012-04-15 21:46:56

回答

2

你剛纔說設置d3dDevice-> SetRenderTarget方法(N,表面)的所有目標,其中n是目標數,然後你設置輸出到多個技術渲染像素着色器中的目標結構

2

您的問題讓我更深入地發現了這個問題。

這是我的發現:

首先你必須檢查你的D3DCAPS9.NumSimultaneousRTs。是不是1? 所有的rendertargets必須是相同的分辨率和位深度,但可以是不同的格式。 您不能使用任何抗鋸齒。