1

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

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;

任何帮助表示赞赏。

4

2 回答 2

3

计算透视/截锥矩阵的代码对我来说是正确的。这会设置一个透视矩阵,假设您的视点位于原点,并且您正在向下看负 z 轴。near 和 far 值指定视图体积内沿负 z 轴的距离范围。

因此,对于 5.0/10.0 的近/远值,您的视图体积内的 z 值范围将从 -5.0 到 -10.0。

如果您的几何图形当前是围绕原点绘制的,请使用 (0.0, 0.0, -7.0) 之类的平移作为您的视图矩阵。这需要在投影矩阵之前应用。

您可以组合视图矩阵和投影矩阵,也可以将它们分别传递到顶点着色器中。使用包含上述翻译的单独视图矩阵,您的着色器代码可能如下所示:

uniform mat4 viewMat;
...
gl_Position = frustum * viewMat * vPosition;
于 2015-02-21T16:57:23.293 回答
2

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

投影矩阵将采用金字塔中的所有形状,并将其转换并缩放为每个维度的单位体积 -1,1。

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

于 2015-02-21T16:50:54.430 回答