XNA: ортогональная проекция, соответствующая координатам экрана

Я использую XNA с SpriteBatch и настраиваемыми вершинами параллельно. Цель состоит в том, чтобы иметь одинаковую систему координат для обоих методов. Это означает, что мне нужна матрица проекции, которая сопоставляется с координатами экрана: (0, 0) находится в верхнем левом углу экрана, а ширина и высота определяются разрешением экрана.

Matrix.CreateOrthographicOffCenter(0, width, 0, height, -1, 1);

Работает хорошо, но имеет центр в левом нижнем углу.

Matrix.CreateOrthographicOffCenter(0, width, height, 0, -1, 1);

Вообще ничего не отображает.

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

Любые идеи?

PS: В целях тестирования я рисую вершины далеко за пределами экранных координат, поэтому я бы хоть что-то увидел, если есть какая-то ошибка в переводе.


person Dennis Kempin    schedule 31.08.2011    source источник
comment
Вы должны использовать матрицу просмотра вместе с вашей проекцией.   -  person jv42    schedule 31.08.2011


Ответы (1)


Я использую этот код для инициализации моей 2D-камеры для рисования линий и использую базовый пользовательский эффект для рисования.

    Vector2 center;
    center.X = Game.GraphicsDevice.Viewport.Width * 0.5f;
    center.Y = Game.GraphicsDevice.Viewport.Height * 0.5f;

    Matrix View = Matrix.CreateLookAt( new Vector3( center, 0 ), new Vector3( center, 1 ), new Vector3( 0, -1, 0 ) );
    Matrix Projection = Matrix.CreateOrthographic( center.X * 2, center.Y * 2, -0.5f, 1 );

Эффект

uniform float4x4 xWorld;
uniform float4x4 xViewProjection;

void VS_Basico(in float4 inPos : POSITION,  in float4 inColor: COLOR0,  out float4      outPos: POSITION,    out float4 outColor:COLOR0 )
{
    float4 tmp = mul (inPos, xWorld);
    outPos = mul (tmp, xViewProjection);
    outColor = inColor; 
}

technique Lines
{
    pass Pass0
    {   
        VertexShader = compile vs_2_0 VS_Basico();
        FILLMODE = SOLID;
        CULLMODE = NONE;        
    }  
}
person Blau    schedule 31.08.2011
comment
Спасибо, это работает. Возможно, некоторые из моих экспериментов тоже сработали, но, похоже, в файле эффектов есть ошибка, которая мешает отрисовке. Когда я рисую примитивы с помощью BasicEffect, все в порядке, спасибо! :) - person Dennis Kempin; 01.09.2011