使用 GLSL 矩阵应用透视图
Applying perspective with GLSL matrix
我不太确定缺少什么,但我将统一矩阵加载到顶点着色器中,当矩阵是:
GLfloat translation[4][4] = {
{1.0, 0.0, 0.0, 0.0},
{0.0, 1.0, 0.0, 0.0},
{0.0, 0.0, 1.0, 0.0},
{0.0, 0.2, 0.0, 1.0}};
左右,我似乎能够很好地平移顶点,具体取决于我选择更改的值。然而,当交换这个相同的均匀矩阵来应用投影时,图像不会出现。我尝试了几种矩阵,例如:
GLfloat frustum[4][4] = {
{((2.0*frusZNear)/(frusRight - frusLeft)), 0.0, 0.0, 0.0},
{0.0, ((2.0*frusZNear)/(frusTop - frusBottom)), 0.0 , 0.0},
{((frusRight + frusLeft)/(frusRight-frusLeft)), ((frusTop + frusBottom) / (frusTop - frusBottom)), (-(frusZFar + frusZNear)/(frusZFar - frusZNear)), (-1.0)},
{0.0, 0.0, ((-2.0*frusZFar*frusZNear)/(frusZFar-frusZNear)), 0.0}
};
和值,例如:
const GLfloat frusLeft = -3.0;
const GLfloat frusRight = 3.0;
const GLfloat frusBottom = -3.0;
const GLfloat frusTop = 3.0;
const GLfloat frusZNear = 5.0;
const GLfloat frusZFar = 10.0;
顶点着色器,似乎可以很好地应用平移:
gl_Position = frustum * vPosition;
感谢任何帮助。
我首先看到的是 Z 近平面和远平面选择在 5、10。如果您的顶点不在这些平面之间,您将看不到任何东西。
投影矩阵会将金字塔中的所有形状都像形状一样,并将其平移并缩放到每个维度的单位体积 -1,1。
计算 perspective/frustum 矩阵的代码在我看来是正确的。这将设置一个透视矩阵,假设您的视点位于原点,并且您正在向下看负 z 轴。 near 和 far 值指定视图体积内沿负 z 轴 的距离范围 。
因此,near/far 值为 5.0/10.0 时,视图体积内的 z 值范围将从 -5.0 到 -10.0。
如果您的几何图形当前是围绕原点绘制的,请使用类似 (0.0, 0.0, -7.0) 的平移作为您的视图矩阵。这需要在投影矩阵之前应用。
您可以合并视图矩阵和投影矩阵,或者将它们分别传递到顶点着色器中。使用包含上述翻译的单独视图矩阵,您的着色器代码可能如下所示:
uniform mat4 viewMat;
...
gl_Position = frustum * viewMat * vPosition;
我不太确定缺少什么,但我将统一矩阵加载到顶点着色器中,当矩阵是:
GLfloat translation[4][4] = {
{1.0, 0.0, 0.0, 0.0},
{0.0, 1.0, 0.0, 0.0},
{0.0, 0.0, 1.0, 0.0},
{0.0, 0.2, 0.0, 1.0}};
左右,我似乎能够很好地平移顶点,具体取决于我选择更改的值。然而,当交换这个相同的均匀矩阵来应用投影时,图像不会出现。我尝试了几种矩阵,例如:
GLfloat frustum[4][4] = {
{((2.0*frusZNear)/(frusRight - frusLeft)), 0.0, 0.0, 0.0},
{0.0, ((2.0*frusZNear)/(frusTop - frusBottom)), 0.0 , 0.0},
{((frusRight + frusLeft)/(frusRight-frusLeft)), ((frusTop + frusBottom) / (frusTop - frusBottom)), (-(frusZFar + frusZNear)/(frusZFar - frusZNear)), (-1.0)},
{0.0, 0.0, ((-2.0*frusZFar*frusZNear)/(frusZFar-frusZNear)), 0.0}
};
和值,例如:
const GLfloat frusLeft = -3.0;
const GLfloat frusRight = 3.0;
const GLfloat frusBottom = -3.0;
const GLfloat frusTop = 3.0;
const GLfloat frusZNear = 5.0;
const GLfloat frusZFar = 10.0;
顶点着色器,似乎可以很好地应用平移:
gl_Position = frustum * vPosition;
感谢任何帮助。
我首先看到的是 Z 近平面和远平面选择在 5、10。如果您的顶点不在这些平面之间,您将看不到任何东西。
投影矩阵会将金字塔中的所有形状都像形状一样,并将其平移并缩放到每个维度的单位体积 -1,1。
计算 perspective/frustum 矩阵的代码在我看来是正确的。这将设置一个透视矩阵,假设您的视点位于原点,并且您正在向下看负 z 轴。 near 和 far 值指定视图体积内沿负 z 轴 的距离范围 。
因此,near/far 值为 5.0/10.0 时,视图体积内的 z 值范围将从 -5.0 到 -10.0。
如果您的几何图形当前是围绕原点绘制的,请使用类似 (0.0, 0.0, -7.0) 的平移作为您的视图矩阵。这需要在投影矩阵之前应用。
您可以合并视图矩阵和投影矩阵,或者将它们分别传递到顶点着色器中。使用包含上述翻译的单独视图矩阵,您的着色器代码可能如下所示:
uniform mat4 viewMat;
...
gl_Position = frustum * viewMat * vPosition;