opengl - 点光源的阴影映射
问题描述
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)
针对所有六张脸?
解决方案
为什么不
glm::vec3(0.0, 1.0, 0.0)
针对所有六张脸?
因为那一点意义都没有。如果通过lookAt
函数定义视图变换,则指定相机位置和观察方向。3Dup
矢量实际上定义的是围绕视轴的旋转角度(因此它实际上只有一个自由度)。
考虑将真实相机旋转为横向或纵向,或任意旋转,以获得您想要的图像。
由于lookAt
约定一直是up
向量是一些世界空间向量,应该映射到upward
结果图像中的轴,如果将up
向量定义为与查看方向相同的方向(或者它是否定方向) ,则会出现问题. 根本不可能将相同的向量映射到结果图像中的观察方向和向上,而且它根本不描述任何方向。
因此,对于 6 张面孔中的 2 张面孔,数学将简单地崩溃。在其他 4 个面的情况下,您可以在技术上(0,1,0)
用于所有这些。但是,通常,您使用这些配置来渲染立方体贴图纹理的 6 个面。对于立方体贴图,每个面的实际方向在 GL 规范中定义。因此,为了直接渲染到立方体贴图,您必须相应地调整相机的方向,否则立方体贴图的各个面将被错误地旋转并且根本无法组合在一起。
推荐阅读
- flutter - 如何在页面上制作 Navigator.of(context).pop 并在 Flutter 上重置它
- c# - 成功认证后,Asp MVC URL 不重定向到索引
- javascript - 如何在javascript中找到数组中最小数字的索引
- javascript - 为什么 console.log() 和 alert() 返回不同的信息?
- ios - 带有 Firebase 身份验证和收入 cat 的 IAP 的 Flutter 应用程序未连接
- node.js - 将 Testcafe 连接到 AWS Devicefarm
- database - 我可以在数据库中编写逻辑吗?
- sql - 我对 SQL 和 Access 很陌生。我有所有这些语句来创建表,但我得到语法错误或“找不到表或约束
- excel - 使用excel在powershell中打开SLK文件不保留公式
- python - 如何创建允许同义词的 Python Enum?