В настоящее время я разрабатываю механизм рендеринга Direct3D 11 с использованием С#.
Мне уже удалось нарисовать треугольники, применить цвет и текстуру и т. д. Объект, который я сейчас пытаюсь отобразить, представляет собой повернутый куб с длиной стороны 1, помещенный в начало координат мирового пространства. Но я получаю неудовлетворительные результаты при применении представления и особенно матрицы проекции. Поскольку это сложно объяснить, я просто покажу вам, какой результат я получаю для разных комбинаций вида/проекции:
Фрагмент HLSL из моего вершинного шейдера:
float4x4 wvpMatrix = mul(World, mul(View, Projection));
output.Position = mul(input.Position, wvpMatrix);
Матрица мира, которую я использую:
// Static rotation around all three axes
matrices.World = Matrix.Identity * Matrix.CreateFromYawPitchRoll(0.5f, 0.6f, 1.0f);
Тест А
Простой вектор вида от начала координат в положительном направлении z. Проекция не используется. Вы можете видеть, что задняя часть куба обрезается.
matrices.View = Matrix.CreateLookAt(new Vector3(0, 0, 0), new Vector3(0, 0, 1), Vector3.Up);
matrices.Projection = Matrix.Identity;
Тест Б
Матрица вида остается прежней, но теперь я использую матрицу орфографической проекции. На этот раз передняя часть куба исчезает. Части, которые вы видите, это те, которые были вырезаны в тесте А.
matrices.View = Matrix.CreateLookAt(new Vector3(0, 0, 0), new Vector3(0, 0, 1), Vector3.Up);
matrices.Projection = Matrix.CreateOrthographic(2, 2, 0.01f, 100.0f);
Тест С
Снова без проекции, как и в тесте A. На этот раз сцена просматривается из точки на три единицы в отрицательном направлении по оси z. Куб выглядит искаженным, когда положение камеры не установлено в исходное положение системы. Я думаю, что есть также некоторые отсечения.
matrices.View = Matrix.CreateLookAt(new Vector3(0, 0, -3), new Vector3(0, 0, 1), Vector3.Up);
matrices.Projection = Matrix.Identity;
Тест D
Наконец, я использую перспективную проекцию. До сих пор я не нашел положения камеры, из которого видна какая-либо часть куба. Все, что я получаю, это полноэкранный васильковый цвет.
matrices.View = Matrix.CreateLookAt(new Vector3(0, 0, -3), new Vector3(0, 0, 1), Vector3.Up);
matrices.Projection = Matrix.CreatePerspectiveFieldOfView(1, 1, 0.1f, 100);
Первое, что я хочу сделать, это нарисовать полный куб без обрезки. Я пробовал разные комбинации значений ближней/дальней плоскости, но не смог найти приемлемого решения. Моей конечной целью было бы иметь перспективную проекцию. Но, как видите, я даже не могу получить хороший ортогональный обзор сцены.