ВведениеDirectX, масштабирование orthgraphic вершины в мировом пространстве вершин
Скажем, у меня есть следующие вершины:
const VERTEX World::vertices[ 4 ] = {
{ -960.0f, -600.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f }, // side 1 screen coordinates centred
{ 960.0f, -600.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f },
{ -960.0f, 600.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f },
{ 960.0f, 960.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f }
};
Вы уже догадались, что 960 * 2 1920 .. который это ширина моего экрана и то же самое для 600 * 2, равная 1200.
Эти вершины представляют собой прямоугольник, который заполнит мой ENTIRE экран wher e начало координат находится в центре экрана.
Выпуск
Так до сих пор, я использовал с видом Ортографическую без проекции:
matView = XMMatrixOrthographicLH(Window::width, Window::height, -1.0, 1.0);
Любая матрица, которая, посылаемой на экран был умноженный на matView, и, похоже, он отлично работает. В частности, мой образ; используя вышеупомянутый массив вершин, плотно прилегает к моему экрану и составляет 1: 1 пикселя до его первоначальной формы.
К сожалению, мне нужно 3D Теперь ... и я просто понял, я буду нуждаться в какой-то выступ ... так что я подготовил этот маленький щенок:
XMVECTOR vecCamPosition = XMVectorSet(0.0f, 0.0f, -1.0f, 0); // I did try setting z to -100.0f but that didn't work well as I can't scale it back any more... and it's not accurate to the 1:1 pixel I want
XMVECTOR vecCamLookAt = XMVectorSet(0.0f, 0.0f, 0.0f, 0.0f);
XMVECTOR vecCamUp = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
matView = XMMatrixLookAtLH(vecCamPosition, vecCamLookAt, vecCamUp);
matProjection = XMMatrixPerspectiveFovLH(
XMConvertToRadians(45), // the field of view
Window::width/Window::height, // aspect ratio
1.0f, // the near view-plane
100.0f); // the far view-plan
Вы уже знаете, что в проблема ... но если нет, я просто установил свое поле зрения на 45 градусов. Это создаст приятную перспективу и сделает 3D-материал отличным, но мой массив вершин больше не собирается вырезать горчицу ... , потому что аспект fov и screen значительно уменьшен (или увеличен), поэтому вершины будут слишком большими для текущего вида, на который я смотрю (см. Изображение)
Я думал, что мне нужно немного масштабировать матрицу вывода, чтобы масштабировать огромные координаты вплоть до соответствующего размера, о котором теперь спрашивает мой аспект и экран.
Что нужно сделать, чтобы использовать массив вершин как есть (соотношение 1: 1 к исходному размеру изображения), в то же время позволяя 3D-вещам, например, летать вокруг экрана, поворачиваться и приближаться, далее в усеченных и т.д. ...
Цель
Я пытаюсь избежать изменений каждых отдельных объектов вершины массива грубо масштабируется предсказать как будет выглядеть исходное изображение в мировом пространстве.
Некоторые дополнительные информация
Я просто хотел уточнить, какого рода матричных операций я сейчас делаю в мире, а затем, как я рендер с помощью эти изменения ... так что это я делаю некоторые переводы на моем большом старом фоновом изображении:
// flipY just turns the textures back around
// worldTranslation is actually the position for the background, so always 0,0,0... as you can see 0.5 was there to make sure I ordered things that were drawn correctly when using orthographic
XMMATRIX worldTranslation = XMMatrixTranslation(0.0f, 0.0f, 0.5f);
world->constantBuffer.Final = flipY * worldTranslation * matView;
// My thoughts are on this that somehow I need to add a scaling to this matrix...
// but if I add scaling here... it's going to mean every other game object
// (players, enemies, pickups) are going to need to be scaled... and really I just want to
// have to scale the whole lot the once.. right?
И, наконец, это где он обращается к экрану:
// Background
d3dDeviceContext->PSSetShaderResources(0, 1, world->textures[ 0 ].GetAddressOf()); // Set up texture of background
d3dDeviceContext->IASetVertexBuffers(0, 1, world->vertexbuffer.GetAddressOf(), &stride, &offset); // Set up vertex buffer (do I need the scaling here?)
d3dDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); // How the vertices be drawn
d3dDeviceContext->IASetIndexBuffer(world->indexbuffer.Get(), DXGI_FORMAT_R16_UINT, 0); // Set up index buffer
d3dDeviceContext->UpdateSubresource(constantbuffer.Get(), 0, 0, &world->constantBuffer, 0, 0); // set the new values for the constant buffer
d3dDeviceContext->OMSetBlendState(blendstate.Get(), 0, 0xffffffff); // DONT FORGET IF YOU DISABLE THIS AND YOU WANT COLOUR, * BY Color.a!!!
d3dDeviceContext->DrawIndexed(ARRAYSIZE(world->indices), 0, 0); // draw
, а затем то, что я сделал, чтобы применить свои matProjection который сверхъизбыточных все мои вершины
world->constantBuffer.Final = flipY * worldTranslation * matView * matProjection; // My new lovely projection and view that make everything hugeeeee... I literally see like 1 pixel of the background brah!
Пожалуйста не стесняйтесь брать копию моей игры и запускать ее как есть (приложение для Windows 8 Visual Studio 2013 express project) в надежде, что вы можете помочь мне с помещением всего этого в 3D:https://github.com/jimmyt1988/FlyGame/tree/LeanerFramework/Game
Можете ли вы опубликовать код для рендеринга прямоугольника? Решение, вероятно, простое, но мне нужен код, прежде чем я его выброшу и буду выглядеть идиотом, если это не проблема. Я ищу, как бы вы отображали прямоугольник без матрицы перспективы и что бы вы изменили, чтобы визуализировать его с помощью перспективной матрицы. – Proxy
Надеюсь, это то, что вам нужно (добавлено в OP) – Jimmyt1988