2014-01-22 8 views
0

Введение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-вещам, например, летать вокруг экрана, поворачиваться и приближаться, далее в усеченных и т.д. ...


Цель


Я пытаюсь избежать изменений каждых отдельных объектов вершины массива грубо масштабируется предсказать как будет выглядеть исходное изображение в мировом пространстве.


enter image description here


Некоторые дополнительные информация


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

// 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

+0

Можете ли вы опубликовать код для рендеринга прямоугольника? Решение, вероятно, простое, но мне нужен код, прежде чем я его выброшу и буду выглядеть идиотом, если это не проблема. Я ищу, как бы вы отображали прямоугольник без матрицы перспективы и что бы вы изменили, чтобы визуализировать его с помощью перспективной матрицы. – Proxy

+0

Надеюсь, это то, что вам нужно (добавлено в OP) – Jimmyt1988

ответ

0

его снова. Позвольте мне попытаться очистить несколько вещей до

Вот небольшой скриншот из редактора шахты: enter image description here

Я редактировал в маленьких черных ящиков, чтобы показать что-то. Осевые круги, которые вы видите вокруг объектов, отображаются на точно того же размера. Однако они визуализируются с помощью перспективной проекции. Как вы можете видеть, тот, что находится слева, примерно вдвое больше, чем тот, который находится в центре. Это объясняется исключительно природой проекции. Если это неприемлемо, вы должны использовать не перспективную проекцию.

Единственный способ можно поддерживать соотношение к ультрафиолетовому размера рабочего стола пространству 1:1 должен иметь объект вынесенный на 1 пиксель на экране на 1 пиксель на текстуре. Нет ничего более, чем этого. Однако вы можете изменить параметры фильтра текстуры. Параметры фильтра - это проекты конкретно для визуализации не 1:1 коэффициенты. Например, код:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

Сообщает OpenGL: «Если вам говорят, чтобы попробовать пиксель, ничего не интерполировать Просто ближайшее значение на текстуру и вставьте его на экране

..
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

Этот код, однако, делает что-то гораздо лучше: он интерполирует между пикселями. Я думаю, это может быть то, что вы хотите, если вы еще этого не делаете.

Эти фотографии (взятые из http://www.opengl-tutorial.org/beginners-tutorials/tutorial-5-a-textured-cube/) показывают это:

Ближайшие:

enter image description here

Линейные:

enter image description here

Вот что она сводится к тому. Вы запрашиваете, чтобы:

Что нужно сделать, чтобы использовать массив вершин как есть (соотношение 1: 1 к исходному размеру изображения), в то же время позволяя производить 3D-материал, например, летать вокруг экрана вращаются и идут ближе и дальше в фруст и т. д.

То, что вы запрашиваете, по определению невозможно, поэтому вам нужно искать альтернативные решения. Надеюсь, что это поможет.

+0

Что-то, что вы сказали выше или здесь, помогло мне немного ... Я понял, что реальный вопрос, который я хочу задать, заключается в том, как добавить проекцию, не опуская 1: 1 пиксельная шкала орфографического вида, которую я установил. matView = XMMatrixOrthographicLH (Window :: width, Window :: height, -1.0, 100.0f); – Jimmyt1988

+1

Вот что я пытаюсь сказать! Нет НИКАКИХ способов сделать то, что вы просите. Что вам действительно нужно сделать, так это получить настройку фильтра пикселей, чтобы скрыть тот факт, что это не соотношение 1: 1. Посмотрите ANY 3D-программу, и вы обнаружите, что масштаб не 1: 1. Ключ делает это соотношение хорошим. – BWG

+0

Прохладный, ну в этом случае ... Я могу просто применить огромный отрицательный масштаб к вершинам моих объектов, чтобы немного вернуть их – Jimmyt1988

Смежные вопросы