我试图将我的场景建模为我的影子映射的准备,但是我非常混乱。
计算我的着色器中位置的线:gl_Position = light_projection_matrix * light_view_matrix * light_model_matrix * position;
,位置是一个模型坐标(在我的情况下等于世界坐标),我将其读为vec4
,并且证明该部分已被证明是有效的。
现在,我使用以下内容,用Java编码为我的矩阵:
lightModelMatrix.identity().multiply(modelMatrix);
lightViewMatrix.identity().lookAt(new Vector3f(-20f, 7.5f, -20f), Vector3f.O, Vector3f.Y);
lightProjectionMatrix.identity().frustum(-1f, 1f, -1f, 1f, -200f, 200f);
其中 modelMatrix
是 identity()
我认为问题是lookAt
矩阵正在更改我的向量的.w
组件,我不确定是否应该发生这种情况,我只知道投影矩阵必须计算.w
组件。
所以这是我的lookAt
的代码:
public Matrix4f lookAt(final Vector3f eye, final Vector3f at, final Vector3f up) {
Vector3f zAxis = at.subtract(eye).normalized();
Vector3f xAxis = up.cross(zAxis).normalized();
Vector3f yAxis = zAxis.cross(xAxis);
return multiply(
xAxis.getX(), xAxis.getY(), xAxis.getZ(), -xAxis.dot(eye), //X column
yAxis.getX(), yAxis.getY(), yAxis.getZ(), -yAxis.dot(eye), //Y column
zAxis.getX(), zAxis.getY(), zAxis.getZ(), -zAxis.dot(eye), //Z column
0.0f, 0.0f, 0.0f, 1.0f //W column
);
}
我的代码中的所有矩阵均按列主要顺序定义。
另外,调试在顶点着色器中计算的gl_Position
的好方法是什么?
在投影矩阵中,近/远值应为正。
在视图矩阵中,您的zAxis
应该向后指向(从目标到眼睛),以便(xAxis, yAxis, zAxis)
是右手的正交基础:
Vector3f zAxis = eye.subtract(at).normalized();
通过此修改,该矩阵的其余计算似乎正确。作为参考,请参阅此答案,以获取" look in"矩阵的完整推导。
另外,在顶点着色器中计算出的GL_Position的好方法是什么?
是否存在问题?
在此上下文中,最简单的方法是从模型中获取一个顶点(或几个顶点或其边界框),然后在软件中应用顶点着色器中完成的转换。然后检查结果以查看是否有意义(在视图内,正确的距离等...)。