Координаты вершин DirectX 11

Я работаю над своим первым проектом на C ++ и DirectX 11, где моя текущая цель — нарисовать цветной треугольник на экране. Это сработало без проблем. Однако есть одна часть, которую я хотел бы изменить, но я не знаю как. Я пытался найти решение, но пока не нашел, и думаю, что причина в том, что я не знаю, что мне нужно искать.

В настоящее время я настроил свои треугольники 3 вершины, как это:

VertexPos vertices[] =
{
{ XMFLOAT3(  0.5f,  0.5f, 1.0f )},
{ XMFLOAT3(  0.5f, -0.5f, 1.0f )},
{ XMFLOAT3( -0.5f, -0.5f, 1.0f )},
}

Где VertexPos определяется следующим образом:

struct VertexPos
{
XMFLOAT3 pos;
};

В настоящее время моя позиция вершин устанавливается в диапазоне от -1.0F до 1.0F, где 0.0F — центр. Как я могу изменить это так, чтобы я мог расположить свои вершины, используя «реальные» координаты, как это:

VertexPos vertices[] =
{
{ XMFLOAT3(  100.0f,  300.0f, 1.0f )},
{ XMFLOAT3(  200.0f,  200.0f, 1.0f )},
{ XMFLOAT3(  200.0f,  300.0f, 1.0f )},
}

0

Решение

  1. Обычный способ:

    • создать матрицу ортогональной проекции (XMMatrixOrthographicLH() если вы используете XMMATH)
    • создать постоянный буфер с этой матрицей на стороне процессора (код C ++) и на размере GPU (вершинный шейдер)
    • умножить положение вершин на матрицу ортогональной проекции в вершинном шейдере
  2. Более простой способ (из книги Ф.Луна):

    XMFLOAT3 SpriteBatch::PointToNdc(int x, int y, float z)
    {
    XMFLOAT3 p;
    
    p.x = 2.0f*(float)x/mScreenWidth - 1.0f;
    p.y = 1.0f - 2.0f*(float)y/mScreenHeight;
    p.z = z;
    
    return p;
    }
    

    Почти то же самое, но на стороне процессора. Конечно, вы также можете переместить этот код в шейдер.

Постскриптум Вероятно, ваша книга / руководство / учебники узнают вас об этом чуть позже. Таким образом, вам лучше доверять этому и двигаться шаг за шагом.

Удачного кодирования! знак равно

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]