XNA: Ортогональная проекция, соответствующая координатам экрана - PullRequest
3 голосов
/ 31 августа 2011

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

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

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

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

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

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

Есть идеи?

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

1 Ответ

4 голосов
/ 31 августа 2011

Я использую этот код для инициализации 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;        
    }  
}
...