2014-09-23 135 views
1

我正嘗試移植一些前段時間用於3.3+ OpenGL的舊SDL遊戲,並且我有幾個問題得到了正確的正交矩陣,並且它是相應的視圖。使用現代OpenGL進行2D渲染的正交投影

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書)學習源不包括涉及除默認NDC其他的座標系的視圖。由於某種原因,即使在今天,關於opengl的大多數討論都是關於不推薦使用的版本。 所以簡而言之,在現代opengl中,爲簡單的2D渲染設置正交投影矩陣的視圖的最佳方式是什麼?

+4

我不打擾使用'lookAt'進行2D渲染;翻譯和比例矩陣要簡單得多,而且工作起來也一樣。 – 2014-09-23 12:42:22

+0

過去幾天我一直在玩關於同樣的問題。從OpenGL 2.1到2D遊戲的OpenGL 3.x有沒有真正的好處? – Zammalad 2014-09-23 14:44:24

回答

1

因爲您的up矢量(0,0,1)與查看方向(0,0,-1)共線,所以您的查找調用實際上根本沒有意義。這不會產生可用的矩陣。

您可能想要(0,1,0)作爲up向量。但是,即使您改變了這一點,您可能會對結果感到驚訝。結合您設置的投影矩陣,您指定爲查看目標的點不會出現在中心,而是出現在屏幕的角落處。您的投影不會將(0,0)映射到中心,在使用某些LookAt函數時通常會採用這種中心。

我同意三十二號上校的評論:在這種情況下不要使用LookAt,除非你有很好的理由。