用于透视投影的 Opengl 顶点坐标
Opengl vertex coordinates for perspective projection
我需要使用透视变换,但我不明白如何定义精灵的模型坐标。如果我使用正交投影,我可以将每个顶点的坐标定义为屏幕上的数字像素。但是用透视投影我做不到。
正交投影:
glm::ortho<GLfloat>(0.0f, screen_width, screen_height, 0.0f, 1.0f, -1.0f));
视角:
glm::perspective(glm::radians(45.f), (float)screen_width / (float)screen_height, 0.1f, 100.f);
顶点着色器:
#version 330 core
layout (std140) uniform Matrices
{
mat4 ProjectionMatrix;
mat4 ViewMatrix;
mat4 ModelMatrix;
};
layout (location = 0) in vec2 position;
layout (location = 1) in vec2 inTexCoords;
out vec2 TextureCoords;
void main()
{
TextureCoords = inTexCoords;
gl_Position = ProjectionMatrix * ViewMatrix * ModelMatrix * vec4(position, 1.f, 1.0);
}
例如
vertices[1] = 0.f;
vertices[8] = 0.f;
vertices[12] = 0.f;
vertices[13] = 0.f;
for (GLuint i = 0; i < m_totSprites; ++i) {
// Vertex pos
vertices[0] = m_clips[i].w;
vertices[4] = vertices[0];
vertices[5] = m_clips[i].h;
vertices[9] = vertices[5];
// Texture pos
vertices[2] = (m_clips[i].x + m_clips[i].w) / tw;
vertices[3] = (m_clips[i].y + m_clips[i].h) / th;
vertices[6] = (m_clips[i].x + m_clips[i].w) / tw;
vertices[7] = m_clips[i].y / th;
vertices[10] = m_clips[i].x / tw;
vertices[11] = m_clips[i].y / th;
vertices[14] = m_clips[i].x / tw;
vertices[15] = (m_clips[i].y + m_clips[i].h) / th;
它适用于正交投影。如何定义透视的顶点坐标?
正交投影和透视模型坐标有什么不同?为什么在第一种情况下很容易将顶点坐标设置为像素大小,但在所有具有透视的示例中它们都在 -0.5 到 0.5 之间归一化?有必要吗?
如果你有投影矩阵,你也需要一个视图矩阵。
ex
有 glm::lookAt()
我经常使用这个组合
glm::lookAt(glm::vec3(-1.2484,0.483,1.84384), glm::vec3(-0.3801, -0.4183,-3.15),glm::vec3( 0., 0.2,-00.))
glm::perspective(45., 1., 1.2, 300.)
glm::mat4(1.)
最初我被误解了正交投影和透视投影之间的区别。据我所知,所有顶点最初都在 NDC 中映射以进行透视投影。然后他们用模型矩阵移动、缩放等。像素完美渲染只能通过一些恒定的深度或正交来实现。我对透视投影的 3D 没用。
我需要使用透视变换,但我不明白如何定义精灵的模型坐标。如果我使用正交投影,我可以将每个顶点的坐标定义为屏幕上的数字像素。但是用透视投影我做不到。
正交投影:
glm::ortho<GLfloat>(0.0f, screen_width, screen_height, 0.0f, 1.0f, -1.0f));
视角:
glm::perspective(glm::radians(45.f), (float)screen_width / (float)screen_height, 0.1f, 100.f);
顶点着色器:
#version 330 core
layout (std140) uniform Matrices
{
mat4 ProjectionMatrix;
mat4 ViewMatrix;
mat4 ModelMatrix;
};
layout (location = 0) in vec2 position;
layout (location = 1) in vec2 inTexCoords;
out vec2 TextureCoords;
void main()
{
TextureCoords = inTexCoords;
gl_Position = ProjectionMatrix * ViewMatrix * ModelMatrix * vec4(position, 1.f, 1.0);
}
例如
vertices[1] = 0.f;
vertices[8] = 0.f;
vertices[12] = 0.f;
vertices[13] = 0.f;
for (GLuint i = 0; i < m_totSprites; ++i) {
// Vertex pos
vertices[0] = m_clips[i].w;
vertices[4] = vertices[0];
vertices[5] = m_clips[i].h;
vertices[9] = vertices[5];
// Texture pos
vertices[2] = (m_clips[i].x + m_clips[i].w) / tw;
vertices[3] = (m_clips[i].y + m_clips[i].h) / th;
vertices[6] = (m_clips[i].x + m_clips[i].w) / tw;
vertices[7] = m_clips[i].y / th;
vertices[10] = m_clips[i].x / tw;
vertices[11] = m_clips[i].y / th;
vertices[14] = m_clips[i].x / tw;
vertices[15] = (m_clips[i].y + m_clips[i].h) / th;
它适用于正交投影。如何定义透视的顶点坐标?
正交投影和透视模型坐标有什么不同?为什么在第一种情况下很容易将顶点坐标设置为像素大小,但在所有具有透视的示例中它们都在 -0.5 到 0.5 之间归一化?有必要吗?
如果你有投影矩阵,你也需要一个视图矩阵。
ex
有 glm::lookAt()
我经常使用这个组合
glm::lookAt(glm::vec3(-1.2484,0.483,1.84384), glm::vec3(-0.3801, -0.4183,-3.15),glm::vec3( 0., 0.2,-00.))
glm::perspective(45., 1., 1.2, 300.)
glm::mat4(1.)
最初我被误解了正交投影和透视投影之间的区别。据我所知,所有顶点最初都在 NDC 中映射以进行透视投影。然后他们用模型矩阵移动、缩放等。像素完美渲染只能通过一些恒定的深度或正交来实现。我对透视投影的 3D 没用。