Как мне настроить DirectX 9 так, чтобы отбраковка задней поверхности была отключена, z-буферизация включена и работало затенение Гуро для треугольных сеток без данных нормалей?

StackOverflow https://stackoverflow.com/questions/2082065

  •  21-09-2019
  •  | 
  •  

Вопрос

У меня возникли трудности с определением правильных параметров для PresentParameters и устройства DirectX, так что может быть как затенение Гуро на уровне вершин, так и использование z-буфера.Некоторые треугольные сетки работают нормально, у других фоновые треугольники появляются перед треугольниками, расположенными ближе к камере.

Пример этого можно найти здесь: http://gallery.me.com/robert.perkins/100045/zBufferGone.Входные данные представляют собой простой список вершин в фасетах.Порядок намотки вершин в каждой грани недетерминирован (определяется различными функциями экспорта программного обеспечения САПР), и данные о нормалях отсутствуют.

Текущие параметры настраиваются прямо сейчас следующим образом.Я понимаю, что это C # вместо C ++, но я думаю, что это достаточно описательно, и параметры передаются в код C ++.Это создает изображение на картинке;поведение такое же и на Эталонном устройстве:

             pParams = new PresentParameters()
                    {
                        BackBufferWidth = this.ClientSize.Width,
                        BackBufferHeight = this.ClientSize.Height,
                        AutoDepthStencilFormat = Format.D16,
                        EnableAutoDepthStencil = true,
                        SwapEffect = SwapEffect.Discard,
                        Windowed = true
                    };
            _engineDX9 = new EngineDX9(this, SlimDX.Direct3D9.DeviceType.Hardware, SlimDX.Direct3D9.CreateFlags.SoftwareVertexProcessing, pParams);

            _engineDX9.DefaultCamera.NearPlane = 0;
            _engineDX9.DefaultCamera.FarPlane = 10;
            _engineDX9.D3DDevice.SetRenderState(RenderState.Ambient, false);
            _engineDX9.D3DDevice.SetRenderState(RenderState.ZEnable, ZBufferType.UseZBuffer);
            _engineDX9.D3DDevice.SetRenderState(RenderState.ZWriteEnable, true);
            _engineDX9.D3DDevice.SetRenderState(RenderState.ZFunc, Compare.Always);
            _engineDX9.BackColor = Color.White;
            _engineDX9.FillMode = FillMode.Solid;
            _engineDX9.CullMode = Cull.None;

            _engineDX9.DefaultCamera.AspectRatio = (float)this.Width / this.Height;

Все мои другие попытки настройки, даже на эталонном устройстве, возвращают код ошибки COM ({"D3DERR_INVALIDCALL:Недопустимый вызов (-2005530516)"}).Каковы правильные параметры настройки?

Редактировать:Класс C ++, который взаимодействует с DirectX9, устанавливает значения по умолчанию следующим образом:

PresentParameters::PresentParameters()
{
    BackBufferWidth = 640;
    BackBufferHeight = 480;
    BackBufferFormat = Format::X8R8G8B8;
    BackBufferCount = 1;

    Multisample = MultisampleType::None;
    MultisampleQuality = 0;

    SwapEffect = SlimDX::Direct3D9::SwapEffect::Discard;
    DeviceWindowHandle = IntPtr::Zero;
    Windowed = true;
    EnableAutoDepthStencil = true;
    AutoDepthStencilFormat = Format::D24X8;
    PresentFlags = SlimDX::Direct3D9::PresentFlags::None;

    FullScreenRefreshRateInHertz = 0;
    PresentationInterval = PresentInterval::Immediate;
}
Это было полезно?

Решение

Где он возвращает недопустимый вызов?

Редактировать:Я предполагаю, что в новом вызове EngineDX9?Вы пробовали устанавливать дескриптор окна устройства в текущих параметрах?

Правка 2:Вы включили отладочный поток на панели управления DirectX, чтобы посмотреть, сообщает ли он вам, в чем заключается ошибка?

Редактировать 3:Вы пробовали установить backbufferWidth и Height равными 0?На что установлен backbuffercount?Может быть, также стоит попробовать "Format.D24S8" в обратном буфере?"Возможно", что ваша видеокарта не поддерживает 16-разрядную версию (хотя это маловероятно).Вы проверили в шапках, что режим, который вы пытаетесь создать, является допустимым?Кстати, я полагаю, что язык CLR, который вы используете, автоматически устанавливает параметры, которые вы не устанавливаете в 0?Лично я всегда предпочитаю быть откровенным в таких случаях ....

PS Я предполагаю здесь, потому что я родной программист C ++ DX9, а не CLR SlimDX ...

Редактировать 4:Я уверен , что это из - за отсутствия оконной ручки ...Возможно, я ошибаюсь, но это единственное, что я вижу ДЕЙСТВИТЕЛЬНО неправильным в вашей настройке.Для оконного устройства DX9 требуется окно.Кстати, установите ширину и высоту равными 0, чтобы просто использовать окно, в котором вы устанавливаете размер устройства...

Правка 5:Я действительно шел здесь по неверному пути.Нет ничего плохого в создании устройства, которое породило ваше "неправильное" устройство.Не связывайтесь с текущими параметрами, они в порядке.Основная причина, по которой у вас возникнут проблемы с вашей Z-буферизацией, заключается в том, что вы установили для функции сравнения значение всегда.Это означает, что, независимо от того, что содержит z-буфер, вставьте пиксель и запишите его z в z-буфер, перезаписывая все, что там уже есть.Держу пари, в этом и заключается ваша проблема с Z-буферизацией.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top