从深度缓冲区和任意视图投影矩阵重建世界坐标

2024-01-02

我正在尝试根据延迟渲染器中的深度值重建 3D 世界坐标,但我遇到了麻烦。我在网上找到的大多数示例都假设标准透视变换,但我不想做出这种假设。

在我的几何传递顶点着色器中,我使用以下方法计算 gl_Position:

gl_Position = wvpMatrix * vec4(vertexLocation, 1.0f);

在我的光照通道片段着色器中,我尝试使用以下方法获取世界坐标:

vec3 decodeLocation()
{
  vec4 clipSpaceLocation;
  clipSpaceLocation.xy = texcoord * 2.0f - 1.0f;
  clipSpaceLocation.z = texture(depthSampler, texcoord).r;
  clipSpaceLocation.w = 1.0f;
  vec4 homogenousLocation = viewProjectionInverseMatrix * clipSpaceLocation;
  return homogenousLocation.xyz / homogenousLocation.w;
}

我认为我是对的,事实上,相机附近的物体似乎被正确照亮。但我最近意识到,当我移得更远时,物体会被照亮,就好像它们距离相机比实际距离更远。我已经尝试过我的光照通道并验证了我的世界坐标是唯一被错误计算的。

我忍不住认为我的clipSpaceLocation.z和clipSpaceLocation.w是问题的根源,但我已经尝试了我能想到的所有变体来计算它们,并且上面的代码产生了最正确的结果。

有什么想法或建议吗?


我只需要做一个小小的修复。该行:

clipSpaceLocation.z = texture(depthSampler, texcoord).r;

应该读:

clipSpaceLocation.z = texture(depthSampler, texcoord).r * 2.0f - 1.0f;

按照我的理解,投影矩阵的设计是为了将近平面和远平面映射到 [-1,1],而不是像我一直假设的 [0,1]。然后 OpenGL 将它们标准化为范围 [0,1](又名“窗口空间”),因此我需要执行该标准化的逆操作。

这一切都假设 glDepthRange(0, 1),这是默认的,并且没有理由改变它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从深度缓冲区和任意视图投影矩阵重建世界坐标 的相关文章

  • 将四元数旋转转换为旋转矩阵?

    基本上 给定一个四元数 qx qy qz qw 我如何将其转换为OpenGL旋转矩阵 我也对哪个矩阵行是 向上 向右 向前 等感兴趣 我有一个四元数的相机旋转 我需要在向量中 以下代码基于四元数 qw qx qy qz 其中顺序基于 Boo
  • OpenGL - 两个纹理的幂

    OpenGL 使用二次幂纹理 这是因为由于 MipMapping 某些 GPU 只接受 2 的幂纹理 当绘制比实际更大的纹理时 使用这些二次方纹理会导致问题 我想到了一种方法来解决这个问题 即仅在我们使纹理小于实际大小时使用 PO2 比率
  • Visual Studio 2010 中的 SOIL 设置

    我无法得到SOIL http www lonesock net soil html正确使用 Visual Studio 2010 我远非 VS 专家 但据我所知 只需执行以下步骤即可使环境正常运行 属性 gt gt C C gt 常规 gt
  • 如何仅剪切剪切平面的交集(而不是并集)?

    在 OpenGL JOGL 中 当使用多个剪切平面时 似乎会应用所有剪切平面的并集 我想要的是路口要应用的所有剪裁平面 这可能吗 请参阅下面的简化二维示例 Edit An example of clipping by vertex shad
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 如何使用边缘和内部镶嵌因子完成三角形面片镶嵌?

    I am just learning tessellation and i came across with below example for triangle patch tessellation but i am not sure h
  • 更改 GLUT 调用以与 MFC/C++ 一起使用

    我有一个使用 GLUT 进行 OpenGL 渲染的程序 现在我需要它位于 MFC 项目内部 以便它可以与另一个程序组件一起使用 我已经按照这个教程进行操作 http www codeguru com cpp g m opengl openf
  • 致命错误 gl.h 包含在 glew.h 之前

    include
  • SSBO 是更大的 UBO?

    我目前正在 OpenGL 4 3 中使用 UBO 进行渲染 以将所有常量数据存储在 GPU 上 诸如材料描述 矩阵等内容 它可以工作 但是 UBO 的小尺寸 我的实现为 64kB 迫使我多次切换缓冲区 减慢渲染速度 我正在寻找类似的方法来存
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • 如何在 Visual Studio 2012 中安装 GLUT 和 OpenGL?

    我今天刚安装了Visual Studio 2012 我想知道如何在该平台上安装GLUT和OpenGL OpenGL 应该已经存在 可能会缺少 Freeglut GLUT GLUT 现在已经非常过时并且没有得到积极的支持 所以你当然应该使用
  • 不明确的 OpenGL 默认相机位置

    在我的Opengl程序中 在我应用透视投影矩阵之前 每当我绘制一些对象时 我都会在世界坐标系的原点处绘制它 但是几乎所有Opengl教程都指出相机 我的投影视图 位于原点朝向正 z 轴 这取决于您稍后如何处理投影矩阵中的 z 值 但是如果这
  • 在windows + opengl中选择图形设备

    我知道如何使用 openGL 打开窗口 使用 Win32 或其他工具包 但是当系统有2块显卡时 如何选择要渲染的图形设备 我的编程语言是 C 我专注于 Windows 但任何示例都将受到欢迎 编辑 也许更好地解释我的问题是个好主意 以便添加
  • 如何在不使用 Kinect SDK 函数的情况下将深度空间中的点转换为 Kinect 中的颜色空间?

    我正在做一个增强现实应用程序 将 3D 对象叠加在用户的彩色视频之上 使用 Kinect 1 7 版本 虚拟对象的渲染在 OpenGL 中完成 我已经成功地在深度视频上叠加了 3D 对象 只需使用 NuiSensor h 标头中深度相机的固
  • glVertexAttribDivisor 和 glVertexBindingDivisor 有什么区别?

    我一直在寻找将属性与任意顶点分组关联起来的方法 起初似乎是我实现这一目标的唯一方法 但后来我偶然发现了这个问题 https stackoverflow com questions 14169228 opengl single vertex
  • 为什么 glClear 不清除我的屏幕?

    这是我编写的一个简单的 opengl 程序 我试图在绘制三角形之前清除屏幕 我在 init 函数中调用了 glClear 但是 它似乎无法清除屏幕 include
  • 如何使用现代 OpenGL 在透视投影中绘制对象的正交轴? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有带有透视投影的 3D 场景 我还可以选择场景中的一个对象 我需要为选定的对象绘制轴 问题是轴不会在透视投影中保存其大小 如果物体远离眼睛
  • 如何在 SceneKit 中以编程方式将 png 纹理包裹在立方体周围

    我是 SceneKit 的新手 试图让一些基本的东西工作 但到目前为止还没有取得多大成功 由于某种原因 当我尝试将 png 纹理应用于 CNBox 时 我最终除了黑色之外什么也没有 这是我在 viewDidLoad 中的简单代码片段 let
  • MATLAB 图形渲染:OpenGL 与 Painters?

    当谈到使用哪个渲染器来处理 MATLAB 图形或何时它很重要时 我一无所知 但我遇到过某些示例 其中does matter plot 0 0 ko markersize 50 linewidth 8 set gcf renderer ope
  • GLSL 中统一浮点行为和常量浮点行为的不同

    我正在尝试在 GLSL 中实现模拟双精度 并且观察到一种奇怪的行为差异 导致 GLSL 中出现细微的浮点错误 考虑以下片段着色器 写入 4 浮点纹理以打印输出 layout location 0 out vec4 Output unifor

随机推荐

  • 如何计算日出和日落时间(matlab)?

    我需要在 Matlab 中计算日出和日落时间 但我找不到正确 且简单 的方法来做到这一点 我需要得到与以下内容相同的结果 https www esrl noaa gov gmd grad solcalc https www esrl noa
  • 实现 IEnumerable 时遇到问题

    我正在尝试编写自己的 简单的 List 实现 这就是我到目前为止所做的 using System using System Collections Generic using System Linq using System Text na
  • 限制直接 url 下载图像

    我不久前问过这个问题并得到了我认为可行的答案 但我仍然遇到问题 也许这是我做错的事 但我仍然没有这个权利 我想限制对整个目录的访问 该目录中包含图像和 pdf 文件 我需要创建 pdf 文档的链接并将图像嵌入到锚标记中 有人告诉我为此使用标
  • 将多个属性元数据添加到工作流活动中的依赖属性

    我正在 Windows 工作流中构建许多自定义活动 我需要添加一个 DependencyProperty 它可以list该属性的多个值 用户可以在使用活动时选择这些值 例如对或错 我知道如何使用 PropertyMetadata 简单地传递
  • 使用 JavaScript 循环遍历日期范围

    给定两个Date 对象 其中一个小于另一个 我如何在日期之间每天循环 for loopDate startDate loopDate lt endDate loopDate 1 这种循环会起作用吗 但是如何向循环计数器添加一天呢 Thank
  • ngOnInit 中未定义角度异步输入?

    我有一个父组件通过 API 将数据传递给子组件 如下所示 ts private loadData this data this apiService getData html
  • 在 Scala 中实现多级 Java 接口

    我有以下层次结构java for my interface public interface Identifiable
  • 在 ng-click 上调用超出范围的 javascript 函数

    我有一个 javascript 库 其中包含许多有用的函数 我在网站上使用它们来执行各种操作 我知道我无法通过 ng click 访问这些函数 因为这些函数超出了范围 有没有一种方法可以访问它们 而无需声明仅调用库中函数的作用域函数 Her
  • 如何从合并中排除文件?

    我刚刚开始了解 git 目前正在考虑合并 假设我有一个主分支 并创建一个名为子分支的分支 我在子分支上工作并更改了一些文件 现在我想将这个子分支合并到主分支中 git merge child 然而 子分支中有一些文件 也在主分支中 我不想合
  • swig、python 和 wchar_t 问题

    我是 Python C 绑定 swig 的新手 并且已经尝试解决这个问题有一段时间了 我有一个外部 C 库 Example c 我想从 Python 调用它 我阅读了 Swig 教程并能够立即生成包装器 现在的问题是 当我调用 API 时
  • 如何在最新版本的phonegap 2.9.1中找到cordova.jar?

    我下载了最新版本的phonegap 2 9 1 zip 文件 但它不包含 cordova jar 当我在 google 上搜索时 我得到了答案 例如将文件夹导航到 lib android framework 目录和 fire 命令 andr
  • 使用 iPhone X 的自动调整大小蒙版迁移项目

    我们有一些遗留项目仍在使用自动调整大小遮罩 在 iOS 11 和 iPhone X 之前一切都工作正常 随着安全区域布局指南的引入 支持 iPhone X 的最佳解决方案是什么 我们可以将所有带有自动调整大小蒙版的界面转换为使用自动布局 考
  • Jinja 在 HTML 中渲染文本并保留换行符

    我有一个像这样的简单表格 class RecordForm Form notes TextAreaField Notes 我将数据记录为三段 如下所示 para1 para2 para3 在模板中 我想以只读方式查看该记录的内容 不可编辑的
  • 强制 Tampermonkey 延迟运行/执行脚本

    如何强制 Tampermonkey 在 AJAX 加载每个文档后运行 执行脚本 我希望访问脚本中的这些元素并更改它们 但是 尽管我设定了 run at to document end在设置页面中 它在文档未完全加载时执行 而且 它发生在这个
  • 如何解决 Android Studio 中的意外顶级异常

    我有两个项目共享相同的aidl 文件 在第一个项目中 构建在 Eclipse 和 Android Studio 中运行完成 在第二个项目中 构建在 Eclipse 中运行完成 但在 Android Studio 中我看到 Error Tra
  • 如何在水晶报表中编辑现有查询

    我只能在 数据库 gt 显示 SQL 查询 中看到 SQL 查询 如何在水晶报表中编辑它 您正在寻找Edit Command在数据库专家中 请参见下面的屏幕截图
  • 从 Visual Basic 6 中的所有对象上移除焦点

    是否有一种方法可以让用户单击表单本身 并在此过程中从当前拥有它的任何对象 文本框 组合框等 中删除焦点 基本上 焦点可以同时从所有事物上移开吗 将焦点设置到表单本身不起作用 我想过做旧的 将占位符按钮隐藏在另一个对象后面 的技巧 但我真的不
  • Rails:单击下拉选项时提交(通过 AJAX)

    当选择下拉框的选项时 自动提交 AJAX 表单的最简单 最优雅的方法是什么 我正在创建一个管理页面 管理员可以在其中修改用户权限 其中 权限 存储为整数 并且我希望 权限 字段成为一个下拉框 当管理员单击他希望用户拥有的选项 这是我目前正在
  • 不引人注目的日期时间? MVC4 中的验证

    我将 MVC3 解决方案升级到 MVC4 迁移后 验证器被破坏 如果我选择德语作为语言 我的输入日期是 2013年3月20日 我在 MVC4 中收到验证错误 但在 MVC3 中却没有 如果我将格式从 20 03 2013 替换为 20 03
  • 从深度缓冲区和任意视图投影矩阵重建世界坐标

    我正在尝试根据延迟渲染器中的深度值重建 3D 世界坐标 但我遇到了麻烦 我在网上找到的大多数示例都假设标准透视变换 但我不想做出这种假设 在我的几何传递顶点着色器中 我使用以下方法计算 gl Position gl Position wvp