2014-09-23 3 views
1

Я пытаюсь перенести старую игру SDL, которую я написал некоторое время назад, в 3.3+ OpenGL, и у меня есть несколько вопросов, получающих правильную ортогональную матрицу, и это соответствующее представление.Ортогональная проекция для 2D-рендеринга с использованием современного OpenGL

glm::mat4 proj = glm::ortho(0.0f, static_cast<float>(win_W), static_cast<float>(win_H), 0.0f,-5.0f, 5.0f); 

Если я просто использовать эту проекцию и попытаться оказать сказать четырехъядерный в границах win_W и win_H, это работает. Однако, если вместо этого я попытаюсь имитировать камеру, используя:

glm::mat4 view = glm::lookAt(
    glm::vec3(0.0f, 0.0f, 1.0f),//cam pos 
    glm::vec3(0.0f, 0.0f, 0.0f),//looking at 
    glm::vec3(0.0f, 0.0f, 1.0f)//floored 
); 

Я ничего не получаю. Даже при размещении четверного в центре, то же самое, если вместо этого я центрировать вид:

glm::mat4 view = glm::lookAt(
    glm::vec3(static_cast<float>(win_W), static_cast<float>(winH), 1.0f),//cam pos 
    glm::vec3(static_cast<float>(win_W), static_cast<float>(winH), 0.0f),//looking at 
    glm::vec3(0.0f, 0.0f, 1.0f)//floored 
); 

Учитывая, что SDL обычно вычитает значение камеры из вершин в игре, чтобы имитировать вид, это просто лучше заменить мой операция MVP в затенении, как это:

#version 150 

in vec2 position; 
in vec3 color; 

out vec3 Color; 

uniform mat4 model; 
uniform mat4 view; 
uniform mat4 projection; 
uniform mat4 camera; 

void main() 
{ 
Color = color; 
//faulty view 
//gl_Position = projection *view * model * vec4(position, 0.0, 1.0); 
//new SDL style camera 
    mat4 newPosition = projection * model * vec4(position, 0.0, 1.0); 
gl_Position = newPosition - camera; 
} 

к сожалению, источник я учусь из (ArcSynthesis книги) не распространяется на вид, что включает в себя систему координат, кроме по умолчанию НДЦ. И почему-то даже сегодня большинство обсуждений о opengl о устаревших версиях. Итак, каков наилучший способ настройки вида на ортогональную матрицу проецирования для простой 2D-рендеринга в современном opengl?

+4

Я бы не стал использовать 'lookAt' для 2D-рендеринга; матрица перевода и масштабирования намного проще и работает так же хорошо. –

+0

Я играю с той же проблемой в течение последних нескольких дней. Есть ли реальная польза от перехода от OpenGL 2.1 к OpenGL 3.x для 2D-игр? – Zammalad

ответ

1

Ваш поисковый вызов на самом деле не имеет смысла, поскольку ваш вектор up (0,0,1) является коллинеарным для направления просмотра (0,0, -1). Это не приведет к использованию пригодной матрицы.

Возможно, вы хотите (0,1,0) как up вектор. Однако, даже если вы измените это, вы можете быть удивлены результатом. В сочетании с установленной матрицей проекции точка, указанная вами как цель поиска, не будет отображаться в центре, а на углу экрана. Ваша проекция не отображает (0,0) в центр, который обычно предполагается при использовании некоторой функции LookAt.

Я согласен с комментарием полковника Тридцать два: Не используйте LookAt в этом сценарии, если у вас нет веских оснований.

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