【问题标题】:How I can I get the mirror reflection of a glm::mat4?如何获得 glm::mat4 的镜面反射?
【发布时间】:2021-10-11 23:51:25
【问题描述】:

所以我使用着色器在 OpenGL 中绘制一个到目前为止看起来像这样的 2D 场景

为了得到这个图像,我有一个相机,我在着色器中使用它来乘以顶点的坐标。

相机代码:

glm::mat4 projection =
  glm::perspective(glm::radians(45.0f), app.aspectRatio, 0.0f, 100.0f);
glm::vec3 camera = glm::vec3(0.0f, 0.0f, -2.0f);
glm::mat4 uCameraView = glm::translate(world.projection, world.camera);

着色器代码:

#version 330 core

layout(location = 0) in vec2 vPosition;

layout(std140) uniform ubo
{
  mat4 uCameraView;
};

void main()
{
  gl_Position = uCameraView * vec4(vPosition.x, vPosition.y, 0.0f, 1.0f);
}

如果我在着色器中乘以 -1 vPosition.y,我会得到以下图像,这就是我想要的结果

能否以某种方式将此“镜像翻转转换”应用于glm::mat4 uCameraView,以避免在每个着色器上都执行此操作?

【问题讨论】:

    标签: c++ opengl glm-math


    【解决方案1】:

    glm::scale 镜像相机的y 轴。比例必须是 (1, -1, 1):

    glm::mat4 projection = 
        glm::perspective(glm::radians(45.0f), app.aspectRatio, 0.0f, 100.0f);
    
    glm::mat4 view = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -2.0f));
    view = glm::scale(view, glm::vec3(1.0f, -1.0f, 1.0f));
    
    glm::mat4 uCameraView = projection * view;
    

    【讨论】:

      【解决方案2】:

      你只需要一个翻转变换矩阵,它的一般版本是shown here

      在您的情况下,您想翻转L = (1, 0),因此转换矩阵A 变为:

      [1  0 0 0]
      [0 -1 0 0]
      [0  0 1 0]
      [0  0 0 1]
      

      正如@Rabbid76 指出的那样,实际上也可以看作是一个缩放矩阵

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多