Проблема проецирования и отсечения? - PullRequest
1 голос
/ 02 февраля 2012

В настоящее время я занимаюсь разработкой механизма визуализации Direct3D 11 с использованием C #.

Мне уже удалось нарисовать треугольники, применить цвет, текстуры и т. Д. Объект, который я сейчас пытаюсь отобразить, представляет собой повернутый куб сдлина стороны 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);

Тест A

Простой вектор просмотра с начала координат в положительном направлении z.Проекция не используется.Вы можете видеть, что задняя часть куба обрезается.

matrices.View = Matrix.CreateLookAt(new Vector3(0, 0, 0), new Vector3(0, 0, 1), Vector3.Up);
matrices.Projection = Matrix.Identity;

Cube with back corners clipped


Тест B

Просмотреть матрицуостается прежним, но сейчас я использую матрицу ортографической проекции.На этот раз передняя часть куба исчезает.Части, которые вы видите, это те, которые были вырезаны в тесте A.

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);

Cube with front corner clipped


Тест C

Снованет проекции, как в тесте А. На этот раз сцена просматривается с точки три единицы в отрицательном направлении z.Куб выглядит искаженным, когда положение камеры не установлено в исходную точку системы.Я думаю, что есть также некоторые отсечения.

matrices.View = Matrix.CreateLookAt(new Vector3(0, 0, -3), new Vector3(0, 0, 1), Vector3.Up);
matrices.Projection = Matrix.Identity;

Distorted cube


Тест 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);

No visible parts of the cube


Первое, что я хочу сделать, это нарисовать полный куб - без отсечения.Я пробовал разные комбинации значений ближней / дальней плоскости, но не смог найти приемлемого решения.Моей конечной целью было бы иметь перспективную проекцию.Но, как вы видите, я даже не могу получить хороший ортогональный обзор сцены.

1 Ответ

0 голосов
/ 03 февраля 2012

Матрицы должны быть транспонированы в некоторой точке.

Причина:

Структура структуры Microsoft.Xna.Framework.Matrix: на основе строк ,Матрицы в HLSL на основе столбцов .

Из Документации XNA :

Матрицы используют макет вектора строки в платформе XNA Framework.

Из статьи Википедии о порядке расположения матриц :

Порядок по главному столбцу - это аналогичный метод уплощения массивов в линейную память, ностолбцы перечислены в последовательности.[...] Языки затенения GLSL и HLSL используют упорядочение по главному столбцу.


Решение A:

Транспонировать все матрицы до их преобразованияотправлено в шейдер:

var projection = Matrix.CreatePerspectiveFieldOfView(1, 1, 0.1f, 100);
projection = Matrix.Transpose(projection);

Решение B:

Введите эту строку в свой код шейдера:

#pragma pack_matrix( row_major )
...