我不太确定缺少什么,但是我将一个均匀的矩阵加载到顶点着色器中,当矩阵是:
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;
任何帮助表示感谢。
答案 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中。