C++ 反射矩阵不能正常工作

C++ 反射矩阵不能正常工作,c++,opengl,matrix,C++,Opengl,Matrix,我尝试过,这就是我如何创建和使用反射矩阵(我的水平面为z=0): 着色器: vec4 mvpvertex = MVP_reflection * vec4(vertex, 1.0); vec2 projCoord = mvpvertex.xy / mvpvertex.w; projCoord = vec2(0.5, 0.5) + 0.5 * projCoord; projCoord = clamp(projCoord, 0.0, 1.0); 但整个场景似乎被颠倒了。我应该看到的东西在我面前的倒影

我尝试过,这就是我如何创建和使用反射矩阵(我的水平面为z=0):

着色器:

vec4 mvpvertex = MVP_reflection * vec4(vertex, 1.0);
vec2 projCoord = mvpvertex.xy / mvpvertex.w;
projCoord = vec2(0.5, 0.5) + 0.5 * projCoord;
projCoord = clamp(projCoord, 0.0, 1.0);
但整个场景似乎被颠倒了。我应该看到的东西在我面前的倒影在我身后,反之亦然。我尝试了更多的矩阵变换,但如果我的尝试奏效,就没有了。
我做错了什么?如何修复它?

因为您将从左侧乘以反射矩阵,这意味着它将应用于视图矩阵之后。因此,矩阵定义的z方向的反射将前后翻转

我认为您有两种选择来解决此问题:

  • 在视图转换之前应用反射。当水平面在你的世界空间中处于z=0时,在z方向的反射是正确的。为此,您可以将反射部分作为模型转换的一部分(如果代码中没有显示反射部分),或者交换乘法的顺序:

    camera.setViewMatrix(camera.View(), mReflection);
    
  • 因为你说的是水的反射,我想反射是上下交换的,这(除非你使用的是非常不寻常的投影矩阵)是应用模型和视图变换后的y方向。因此,如果要在视图变换后应用反射,则需要y反射:

    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.0, 0.0, 1.0
    
  • 我还没有详细研究您所遵循的教程,因此我不确定这两个选项中的哪一个在上下文中更有效。从表面上看,看起来它们实际上翻转了两次,在视图转换之前和之后。你必须弄清楚细节,但我希望这能解决你的主要障碍

    以上假设您使用的矩阵库以最标准的方式运行,其中矩阵是为从右侧相乘的向量构造的。如果使用行主矩阵进行操作,然后在将矩阵输入着色器时转置矩阵,则乘法顺序将恢复

    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.0, 0.0, 1.0