Отсутствует информация о глубине после первой сетки

Я использую SlimDX для приложений Direct3D 10. В приложениях я загрузил от 2 до более мешей, с изображениями, загруженными в качестве текстуры и использующими код FX для шейдера. Код был изменен из примера SlimDX "SimpleModel10"

Я перемещаю вызов отрисовки, код настройки шейдера в класс, который управляет 1 сеткой, шейдером (эффект) и вызовом отрисовки. Затем я инициализирую 2 копии этого класса, затем вызываю функцию рисования один за другим.

Вывод, независимо от того, как я изменяю Z-позицию меша, тот, который рисуется позже, всегда будет оставаться сверху. Позже, когда я использовал PIX для отладки вызова отрисовки, я обнаружил, что у 2-го меша нет глубины, в то время как у первого есть. Я пробовал с 3 сетками, вторая и третья тоже не будут иметь глубину. Самое смешное, что все они создаются из одного и того же класса с использованием одного и того же вызова.

Что могло вызвать такую ​​проблему?

Ниже приведена часть кода в функции рисования класса, остальное я пропустил, поскольку он занимал несколько классов. Я сохраняю существующие OnRenderBegin() и OnRenderEnd() образца:

        PanelEffect.GetVariableByName("world").AsMatrix().SetMatrix(world);

        lock (this)
        {
            device.InputAssembler.SetInputLayout(layout);
            device.InputAssembler.SetPrimitiveTopology(PrimitiveTopology.TriangleList);
            device.InputAssembler.SetIndexBuffer(indices, Format.R32_UInt, 0);
            device.InputAssembler.SetVertexBuffers(0, binding);

            PanelEffect.GetTechniqueByIndex(0).GetPassByIndex(0).Apply();
            device.DrawIndexed(indexCount, 0, 0);

            device.InputAssembler.SetIndexBuffer(null, Format.Unknown, 0);
            device.InputAssembler.SetVertexBuffers(0, nullBinding);
        }

Изменить: После большой отладки и изоляции кода, я обнаружил, что виновник Font.Draw() в моем DrawString() функция

    internal void DrawString(string text)
    {
        sprite.Begin(SpriteFlags.None);
        string[] texts = text.Split(new string[] {"\r\n"}, StringSplitOptions.None);
        int y = PanelY;
        foreach (string t in texts)
        {
            font.Draw(sprite, t, new System.Drawing.Rectangle(PanelX, y, PanelSize.Width, PanelSize.Height), FontDrawFlags.SingleLine, new Color4(Color.Red));
            y += font.Description.Height;
        }
        sprite.End();
    }

Закомментируйте Font.Draw, чтобы решить проблему. Может быть, он автоматически устанавливает некоторые состояния, что приводит к тому, что при следующем рисовании сетки сбрасывается глубина Изучите исходный код SlimDX сейчас.

1 ответ

Решение

После большой отладки в PIX, это вывод.

призвание Font.Draw() автоматически установит для DepthEnable значение false и DepthFunction для D3D10_COMPARISON_NEVER, это после сравнения деталей PIX в OutputMerger до и после вызова Font.Draw

Решение

            Context10_1.Device.OutputMerger.DepthStencilState = depthStencilState;

Поместите это до того, как следующий вызов Mesh Draw решит проблему.

Ранее я только установил DepthStencilState в OnRenderBegin()

Другие вопросы по тегам