2010-01-19 2 views
2

Я не увенчался успехом в создании простой геометрии куба с включенным затенением для правильного отображения.В DirectX 9, как заставить zbuffer работать правильно?

Это код C#, но значения передаются через SlimDX непосредственно на C++-код.

  pParams.BackBufferWidth = 0; 
      pParams.BackBufferHeight = 0; 
      pParams.BackBufferCount = 1; 
      pParams.BackBufferFormat = Format::X8R8G8B8; 
      pParams.Multisample = MultisampleType::None; 
      pParams.MultisampleQuality = 0; 
      pParams.DeviceWindowHandle = this.Handle; 
      pParams.Windowed = true; 
      pParams.AutoDepthStencilFormat = Format.D24X8; 
      pParams.EnableAutoDepthStencil = true; 
      pParams.PresentFlags = PresentFlags.None; 
      pParams.FullScreenRefreshRateInHertz = 0; 
      pParams.PresentationInterval = PresentInterval.Immediate; 
      pParams.SwapEffect = SwapEffect.Discard; 

... являются значения в PresentParameter структуры, используемые для настройки моего объекта Direct3D9Device.

Во время рендеринга, SetRenderState называется следующим образом:

 this.D3DDevice.Clear(ClearFlags.Target | ClearFlags.ZBuffer, this.BackColor, 10000.0f, 0); 
     this.D3DDevice.SetRenderState(RenderState.Ambient, false); 
     this.D3DDevice.SetRenderState(RenderState.ZEnable, ZBufferType.UseZBuffer); 
     this.D3DDevice.SetRenderState(RenderState.ZWriteEnable, true); 
     this.D3DDevice.SetRenderState(RenderState.ZFunc, Compare.LessEqual); 
     this.D3DDevice.BeginScene(); 

Опять же, это передается через код C++, который маршалы значения в призывы C++ программист не будет бояться.

Примитивы - это диффузные цветные вершины (D3DFVF_XYZ | D3DFVF_DIFFUSE). Вид каркаса выглядит так: wireframe view http://gallery.me.com/robert.perkins/100045/z-fightingwireframe/web.jpg

Ближайшая пара более крупных треугольников - это ближайшая грань куба.

Заполненного вид выглядит следующим образом: full view 1 http://gallery.me.com/robert.perkins/100045/Z-fighting/web.jpg

Или это, на последующем рендеринг вызове: full view 2 http://gallery.me.com/robert.perkins/100045/zfight2/web.jpg

Я не уверен, как это исправить. С чего начать?

Edit: матрица проекции камеры выглядит примерно так, как это для одного из кадров:

{[[M11:0.6281456 M12:0.7659309 M13:0.1370506 M14:0] 
    [M21:0.7705086 M22:-0.5877584 M23:-0.2466911 M24:0] 
    [M31:-0.1083957 M32:0.2605566 M33:-0.9593542 M34:0] 
    [M41:-3.225646 M42:-1.096823 M43:20.91392 M44:1]]} 

И, вид матрицы выглядит следующим образом:

camera.ViewMatrix = {[[M11:0.6281456 M12:0.7659309 M13:0.1370506 M14:0] 
         [M21:0.7705086 M22:-0.5877584 M23:-0.2466911 M24:0] 
         [M31:-0.1083957 M32:0.2605566 M33:-0.9593542 M34:0] 
         [M41:-3.225646 M42:-1.096823 M43:20.91392 M44:1]]} 
+0

Btw Вы вставили одну и ту же матрицу дважды выше ... – Goz

+0

Возможно, они оба одинаковы. –

ответ

2

Очистить Z-буфер до 1.0f, не 10000.0f.

С Четких документов в SDK:

[in] Clear the depth buffer to this new z value which ranges from 0 to 1.. 

Он также может быть полезно, чтобы увидеть вашу матрицу проекции и настройку окна просмотра ...

Edit: Как построить эту матрицу проекции? Вы установили zNear в 0 и zFar равным 1. Попробуйте установить zNear на 0.001f и zFar на 1000.0f и посмотрите, поможет ли это вам вообще ...

+0

Спасибо, Goz, это получилось. Проблема заключалась в структуре данных объекта Camera, которая вычисляет матрицу проекции. –

0

догадка: Попробуйте включить Z -Буфер перед очисткой.

+0

Я пробовал этот и другой вариант заказа без изменения изображения. –

 Смежные вопросы

  • Нет связанных вопросов^_^