2011-08-28 67 views
1

大家好我正在嘗試使用c#和SlimDX爲我的圖形引擎創建延遲渲染器。作爲一個資源,我使用this教程,儘管它是爲XNA設計的,但它非常有用。 但現在我卡住了... 我有我的渲染器設置繪製所有幾何的顏色,法線和深度來分離渲染目標紋理。這工作。我可以將生成的紋理繪製成恢復後的緩衝區,並且我可以看到它們只包含它們應有的內容。但是當我嘗試將這些紋理傳遞給另一個着色器時,在這種情況下要創建一個光照貼圖,會發生奇怪的事情。以下是我畫一個框:爲什麼有效的紋理不能到達着色器? (Direct3D9)

public bool RenderFrame(FrameInfo fInfo){ 
    if(!BeginRender()) //checks Device, resizes buffers, calls BeginScene(), etc. 
     return false; 
    foreach(RenderQueue queue in fInfo.GetRenderQueues()){ 
     RenderQueue(queue); 
    } 
    EndRender(); //currently only calls EndScene, used to do more 
    ResolveGBuffer(); 
    DrawDirectionalLight(
     new Vector3(1f, -1f, 0), 
     new Color4(1f,1f,1f,1f), 
     fi.CameraPosition, 
     SlimMath.Matrix.Invert(fi.ViewProjectionMatrix)); 
} 

private void ResolveGBuffer() { 
    if(DeviceContext9 == null || DeviceContext9.Device == null) 
     return; 
    DeviceContext9.Device.SetRenderTarget(0, _backbuffer); 
    DeviceContext9.Device.SetRenderTarget(1, null); 
    DeviceContext9.Device.SetRenderTarget(2, null); 
} 

private void DrawDirectionalLight(Vector3 lightDirection, Color4 color, SlimMath.Vector3 cameraPosition, SlimMath.Matrix invertedViewProjection) { 
    if(DeviceContext9 == null || DeviceContext9.Device == null) 
     return; 
     DeviceContext9.Device.BeginScene(); 
     _directionalLightShader.Shader.SetTexture(
      _directionalLightShader.Parameters["ColorMap"], 
      _colorTexture); 
     _directionalLightShader.Shader.SetTexture(
      _directionalLightShader.Parameters["NormalMap"], 
      _normalTexture); 
     _directionalLightShader.Shader.SetTexture(
      _directionalLightShader.Parameters["DepthMap"], 
      _depthTexture); 
     _directionalLightShader.Shader.SetValue<Vector3>(
      _directionalLightShader.Parameters["lightDirection"], 
      lightDirection); 
     _directionalLightShader.Shader.SetValue<Color4>(
      _directionalLightShader.Parameters["Color"], 
      color); 
     _directionalLightShader.Shader.SetValue<SlimMath.Vector3>(
      _directionalLightShader.Parameters["cameraPosition"], 
      cameraPosition); 
     _directionalLightShader.Shader.SetValue<SlimMath.Matrix>(
      _directionalLightShader.Parameters["InvertViewProjection"], 
      invertedViewProjection); 
     _directionalLightShader.Shader.SetValue<Vector2>(
      _directionalLightShader.Parameters["halfPixel"], 
      _halfPixel); 

     _directionalLightShader.Shader.Technique = 
      _directionalLightShader.Technique("Technique0"); 

     _directionalLightShader.Shader.Begin(); 
     _directionalLightShader.Shader.BeginPass(0); 
     RenderQuad(SlimMath.Vector2.One * -1, SlimMath.Vector2.One); 
     _directionalLightShader.Shader.EndPass(); 
     _directionalLightShader.Shader.End(); 
     DeviceContext9.Device.EndScene(); 
} 

現在,當我調用替換一些代碼來繪製_colorTexture,_normalTexture和_depthTexture屏幕一切正常到DrawDirectionalLight,但是當我使用DrawDirectionalLight功能,而不是我看到野生閃爍。從PIX的輸出,它看起來像我的紋理沒有獲得通過正確的着色器:

pix_screenshot

繼紋理參數和採樣器被定義爲教程如下:

float3 lightDirection; 
float3 Color; 
float3 cameraPosition; 
float4x4 InvertViewProjection; 
texture ColorMap; 
texture NormalMap; 
texture DepthMap; 

sampler colorSampler = sampler_state{ 
Texture = ColorMap; 
AddressU = CLAMP; 
AddressV = CLAMP; 
MagFilter= LINEAR; 
MinFilter= LINEAR; 
MipFilter= LINEAR; 
}; 

sampler depthSampler = sampler_state{ 
Texture = DepthMap; 
AddressU = CLAMP; 
AddressV = CLAMP; 
MagFilter= POINT; 
MinFilter= POINT; 
MipFilter= POINT; 
}; 

sampler normalSampler = sampler_state{ 
Texture = NormalMap; 
AddressU = CLAMP; 
AddressV = CLAMP; 
MagFilter= POINT; 
MinFilter= POINT; 
MipFilter= POINT; 
}; 

現在我的大問題是爲什麼?沒有打印到調試輸出的錯誤消息。

編輯:

的rendertargets /都是這樣產生的紋理:

_colorTexture = new Texture(DeviceContext9.Device, 
      DeviceContext9.PresentParameters.BackBufferWidth, 
      DeviceContext9.PresentParameters.BackBufferHeight, 
      1, 
      Usage.RenderTarget, 
      Format.A8R8G8B8, 
      Pool.Default); 

     _colorSurface = _colorTexture.GetSurfaceLevel(0); 

     _normalTexture = new Texture(DeviceContext9.Device, 
      DeviceContext9.PresentParameters.BackBufferWidth, 
      DeviceContext9.PresentParameters.BackBufferHeight, 
      1, 
      Usage.RenderTarget, 
      Format.A8R8G8B8, 
      Pool.Default); 

     _normalSurface = _normalTexture.GetSurfaceLevel(0); 

     _depthTexture = new Texture(DeviceContext9.Device, 
      DeviceContext9.PresentParameters.BackBufferWidth, 
      DeviceContext9.PresentParameters.BackBufferHeight, 
      1, 
      Usage.RenderTarget, 
      Format.A8R8G8B8, 
      Pool.Default); 

     _depthSurface = _depthTexture.GetSurfaceLevel(0); 

編輯2:

的問題似乎在directionalLightShader itselft撒謊,因爲通過其他規則紋理也不起作用。

+0

您是否在控制面板中啓用了directx日誌記錄?從我的重新選擇中,當您在調試器中運行時,日誌記錄也可能會顯示。 – 2011-08-28 12:24:36

+0

是的,我確實得到了調試輸出,但它所抱怨的是多餘的「SetSamplerState」哦,我使用DebugView查看輸出 – Gooo

+0

並且您在創建紋理時指定了哪些標誌? – 2011-08-28 12:28:57

回答

0

我的問題的答案就像問題很蠢一樣簡單。奇怪的行爲是由兩個不同的錯誤引起的:

  1. 我只是看着PIX中的錯誤事件。我們正確傳遞給着色器的紋理,但是我沒有看到它,因爲它在BeginPass事件(隱藏在'+'後面)中。
  2. 我是想,因爲我用來渲染全屏四邊形頂點按照順時針方向......我CullMode還設置順時針被吸引到執行從來沒有得到所謂的像素着色器...

謝謝給每個讀過這個問題的人!