Отсутствует информация о глубине после первой сетки
Я использую 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()