首页 > 解决方案 > 点光源的阴影映射

问题描述

OpenGL中的视图矩阵主要由glm::lookAt()函数定义,具有 3 个参数:位置向量、目标向量向上向量

那么,为什么这些代码行用于点光的阴影映射定义了最后一个参数(我的意思是向上矢量),如下所示:

float aspect = (float)SHADOW_WIDTH/(float)SHADOW_HEIGHT;
float near = 1.0f;
float far = 25.0f;
// This is the projection matrix
glm::mat4 shadowProj = glm::perspective(glm::radians(90.0f), aspect, near, far); 

// This is for view matrix
std::vector<glm::mat4> shadowTransforms;
shadowTransforms.push_back(shadowProj * 
                 glm::lookAt(lightPos, lightPos + glm::vec3( 1.0, 0.0, 0.0), glm::vec3(0.0,-1.0, 0.0));
shadowTransforms.push_back(shadowProj * 
                 glm::lookAt(lightPos, lightPos + glm::vec3(-1.0, 0.0, 0.0), glm::vec3(0.0,-1.0, 0.0));
shadowTransforms.push_back(shadowProj * 
                 glm::lookAt(lightPos, lightPos + glm::vec3( 0.0, 1.0, 0.0), glm::vec3(0.0, 0.0, 1.0));
shadowTransforms.push_back(shadowProj * 
                 glm::lookAt(lightPos, lightPos + glm::vec3( 0.0,-1.0, 0.0), glm::vec3(0.0, 0.0,-1.0));
shadowTransforms.push_back(shadowProj * 
                 glm::lookAt(lightPos, lightPos + glm::vec3( 0.0, 0.0, 1.0), glm::vec3(0.0,-1.0, 0.0));
shadowTransforms.push_back(shadowProj * 
                 glm::lookAt(lightPos, lightPos + glm::vec3( 0.0, 0.0,-1.0), glm::vec3(0.0,-1.0, 0.0))

为什么不glm::vec3(0.0, 1.0, 0.0)针对所有六张脸?

标签: openglmappingshadowpointlight

解决方案


为什么不glm::vec3(0.0, 1.0, 0.0)针对所有六张脸?

因为那一点意义都没有。如果通过lookAt函数定义视图变换,则指定相机位置和观察方向。3Dup矢量实际上定义的是围绕视轴的旋转角度(因此它实际上只有一个自由度)。

考虑将真实相机旋转为横向或纵向,或任意旋转,以获得您想要的图像。

由于lookAt约定一直是up向量是一些世界空间向量,应该映射到upward结果图像中的轴,如果将up向量定义为与查看方向相同的方向(或者它是否定方向) ,则会出现问题. 根本不可能将相同的向量映射到结果图像中的观察方向和向上,而且它根本不描述任何方向。

因此,对于 6 张面孔中的 2 张面孔,数学将简单地崩溃。在其他 4 个面的情况下,您可以在技术上(0,1,0)用于所有这些。但是,通常,您使用这些配置来渲染立方体贴图纹理的 6 个面。对于立方体贴图,每个面的实际方向在 GL 规范中定义。因此,为了直接渲染到立方体贴图,您必须相应地调整相机的方向,否则立方体贴图的各个面将被错误地旋转并且根本无法组合在一起。


推荐阅读