用GLSL矩阵应用透视

时间:2015-02-21 15:50:52

标签: opengl matrix glsl frustum

我不太确定缺少什么,但是我将一个均匀的矩阵加载到顶点着色器中,当矩阵是:

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;

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:3)

计算透视/平截头体矩阵的代码对我来说是正确的。这将设置一个透视矩阵,假设您的眼点位于原点,并且您向下看负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;

答案 1 :(得分:2)

我看到的第一件事是Z近和远的平面选择在5,10。如果你的顶点不在这些平面之间,你将看不到任何东西。

投影矩阵将金字塔中的所有内容都视为形状,并将其平移并缩放到每个维度的单位体积-1,1中。

http://www.lighthouse3d.com/tutorials/view-frustum-culling/