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

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

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

Параметры PresentParameters устанавливаются прямо сейчас следующим образом. Я понимаю, что это 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: Invalid call (-2005530516)"}). Каковы правильные параметры настройки?

EDIT: класс 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;
}

1 Ответ

1 голос
/ 17 января 2010

Где он возвращает неверный вызов?

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

Редактировать 2: Включили ли вы отладку в панели управления DirectX, чтобы увидеть, говорит ли она, что это за ошибка?

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

PS Я предполагаю, что здесь я являюсь родным C ++ DX9-кодером, а не CLR SlimDX-кодером ...

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

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

...