Отсутствует информация о глубине после первой сетки - PullRequest
0 голосов
/ 25 февраля 2011

Я использую 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);
        }

Edit: После большой отладки и изоляции кода, я обнаружил, что виноват 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 Ответ

1 голос
/ 26 февраля 2011

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

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

Решение

            Context10_1.Device.OutputMerger.DepthStencilState = depthStencilState;

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

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

...