为什么人们不使用四面体作为天空盒?

2024-01-09

在3D游戏中渲染固定纹理的天空时,人们通常会先在立方体贴图中创建6个纹理,然后在相机周围渲染一个立方体。在 GLSL 中,您可以使用法线而不是纹理坐标来访问纹理中的像素,并且可以通过标准化相对于相机的片段位置轻松获得该法线。然而,这个过程可以用相机周围的任何形状来完成,因为当你标准化每个位置时,它总是会产生一个球体。现在我想知道:为什么它总是立方体而不是四面体?渲染立方体需要 12 个三角形,四面体只需要 4 个。正如我已经说过的,相机周围的任何形状都可以。那么四面体需要更少的 VRAM 并且渲染速度更快,没有任何缺点?为什么不使用它们呢?


您根本不需要一些环境几何图形。您所需要做的就是画一个四屏全屏,并为其计算正确的纹理坐标。现在有了现代 GL,我们甚至不需要为此提供顶点数据,我们可以使用无属性渲染:

顶点着色器:

#version 330 core
out vec3 dir;
uniform mat4 invPV;
void main()
{
        vec2 pos  = vec2( (gl_VertexID & 2)>>1, 1 - (gl_VertexID & 1)) * 2.0 - 1.0;
        vec4 front= invPV * vec4(pos, -1.0, 1.0);
        vec4 back = invPV * vec4(pos,  1.0, 1.0);

        dir=back.xyz / back.w - front.xyz / front.w;
        gl_Position = vec4(pos,1.0,1.0);
}

where invPV is inverse(Projection*View),因此它将考虑您的相机方向以及投影。原则上,这可以进一步简化,具体取决于您可以对投影矩阵施加多少约束。

片段着色器:

#version 330 core
in vec3 dir;
out color;
uniform samplerCube uTexEnv;
void main()
{
        color=texture(uTexEnv, dir);
}

要使用它,您只需绑定一个空的 VAO 和您的纹理,上传您的invPV矩阵和调用glDrawArrays(GL_TRIANGLE_STRIP, 0, 4).

这种方法当然可以用于球形纹理映射而不是立方体贴图

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

为什么人们不使用四面体作为天空盒? 的相关文章

  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • 如何用PHP进行有向图绘制?

    我正在寻找一种在 PHP 中绘制有向图的方法 如http upload wikimedia org wikipedia commons 0 08 Directed acirclic graph png http upload wikimed
  • 如何向 3D 表面添加文本

    我使用plot surface 创建了具有平行四边形底座的矩形棱柱 我需要向其中一个表面添加一些文本 我试过ax text 3 0 5 1 red 1 1 0 color red 但文本在表面上不可见 import matplotlib p
  • 如何使用 ggplot2 对曲线下的区域进行着色

    我一直在尝试使用 ggplot2 生成类似于此 R 图形的绘图 xv lt seq 0 4 0 01 yv lt dnorm xv 2 0 5 plot xv yv type l polygon c xv xv lt 1 5 1 5 c y
  • 如何使用 Java2D 创建硬件加速图像?

    我正在尝试创建一个快速图像生成器 它可以执行大量 2d 转换和形状渲染 因此我尝试使用 BufferedImage 然后获取 Graphics2D 对象来执行所有绘图 我现在主要关心的是 make 速度非常快 所以我创建一个像这样的 Buf
  • 使用 glGetFloatv 检索 pyglet 中的模型视图矩阵

    我正在使用 pyglet 在 python 中进行 3D 可视化 并且需要检索模型视图和投影矩阵来进行一些选择 我使用以下方式定义我的窗口 from pyglet gl import from pyglet window import wi
  • 在 3D 场景中实现“抓取”相机平移工具

    在我的场景中 我有想要 抓取 的地形 然后在移动光标时让相机平移 其高度 视图向量 视野等全部保持不变 因此 最初的 抓取 点将是世界空间中的工作点 我希望在拖动时该点保留在光标下方 我当前的解决方案是获取前一个和当前的屏幕点 取消投影它们
  • 渲染 TTF SDL2.0 opengl 3.1

    我正在使用 SDL2 0 并使用 半现代 opengl 3 1 我希望向我的应用程序添加文本叠加 并在应用程序中呈现 TTF 我将如何使用现代 OpenGL 来解决这个问题 编辑 根据 genpfault 的建议 我尝试使用 SDL TTF
  • 如何使用 matplotlib 将 3d 数据单位转换为显示单位?

    这可能有点疯狂 但我正在尝试使用 matplotlib v1 1 0 创建 3d 散点图的可点击图像图 我已经阅读了如何对二维图进行操作 参见这个博客 http hackmap blogspot com 2008 06 pylab matp
  • Windows下使用GLEW使用OpenGL扩展

    我一直在 Windows 上使用 OpenGL 扩展痛苦的方式 https stackoverflow com questions 14413 using opengl extensions on windows GLEW 是更简单的方法吗
  • 帮我用光线追踪器解决这个错误

    我不会针对这个问题发布任何代码 因为它需要太多的上下文 但我将从概念上解释我正在做什么 我正在构建一个使用仿射变换的简单光线追踪器 我的意思是 我将来自相机坐标的所有光线与通用形状相交 这些形状都具有关联的仿射变换 并且光线在与场景对象相交
  • 延迟阴影映射 GLSL

    我目前正在实施延迟渲染管道 但我仍坚持使用阴影贴图 我已经成功地将其实施到前向管道中 我所做的步骤是 获取灯光视图中的位置 转换为光视图剪辑空间 使用 0 5 0 5 获取阴影纹理坐标 检查深度 编辑 使用新结果图像更新代码 float c
  • 实例着色器矩阵的设置

    我想绘制实例立方体 我可以打电话GL DrawArraysInstanced PrimitiveType Triangles 0 36 2 成功地 我的问题是所有立方体都绘制在相同的位置和相同的旋转 我如何为每个立方体单独更改它 要创建不同
  • 如何在opengl中使用四元数绕屏幕中心旋转?

    我正在尝试实现轨迹球 轨迹球旋转 但我的中心有问题 回转 无论如何 我希望中心成为屏幕的中心 让我解释一下到目前为止我所做的事情 我创建了一个四元数 旋转轴 向量起点x向量结束 角度 向量起点 向量结束 从该四元数中 我创建了一个旋转矩阵
  • 在 libgdx 中批处理多维数据集时出现问题

    我正在尝试开发一款游戏 在屏幕上渲染多达 300 个立方体 为每个多维数据集创建新的 modelInstance 时 modelBatch 的性能非常糟糕 据我所知 没有 3d 批处理可以将所有立方体批处理到一次绘制调用 所以我拼命地尝试以
  • 具有交错缓冲区的 openGL glDrawElements

    到目前为止 我只使用了 glDrawArrays 并希望转向使用索引缓冲区和索引三角形 我正在绘制一个有点复杂的对象 其中包含纹理坐标 法线和顶点坐标 所有这些数据都收集到一个交错的顶点缓冲区中 并使用类似于以下的调用进行绘制 假设所有血清
  • 如何为 glDrawElements() 指定每个图元的颜色

    我想渲染一个索引几何体 所以 我有一堆顶点和关联的排序索引 我在用glDrawElements 渲染 2 个四边形 如下所示 现在 我知道我可以使用glColorPointer 用于指定每个顶点的颜色 我的问题是 我可以指定吗每个基元的颜色
  • 我可以在 WebGL 的 GLSL 中使用什么作为数组索引?

    是否只允许使用常量 或者我可以将其用于循环索引或任何其他动态值 In WebGL GLES2 是的 只允许使用常量 但是 如果您的代码可以展开 无论是由您自己还是由编译器 那么它就被视为一个常量 并且您有一个解决方法 例如 问题 unifo
  • 如何使 CSS 动画/过渡以固定速度而不是固定持续时间播放? [复制]

    这个问题在这里已经有答案了 我有一个 CSS 动画 可以使元素沿直线移动未定义的距离 据我所知 动画具有固定的持续时间 因此无论元素必须移动多远 动画始终需要相同的时间来运行 我该如何制作才能使动画没有固定的duration 但有固定的运动
  • 为什么 cudaGLSetGLDevice 失败,即使它是在 main 函数的第一行中调用的

    我想使用 OpenGL 和 CUDA 之间的互操作性 我知道 正如一些教程所说 第一步是选择设备 但是 当我在主函数的第一行中调用 cudaGLSetGLDevice 0 时 程序退出并显示信息 cudaSafeCall 运行时 API 错

随机推荐

  • Grails 2.3.x 支持 JDK 8

    看起来这个问题应该很简单 但是 Grails 的安装要求 http www grails org 安装 http www grails org Installation 已经两年没有更新了 有谁确定 Grails 2 3 会在 JDK 8
  • 将 Vue 部署到 GitHub Pages。 vue-router 错误

    我在使用 vue cli v3 0 部署 Vue 应用程序构建时遇到了一些问题 到 GitHub 页面 我在用着subtree https gist github com cobyism 4730490发送dist文件夹仅gh pages分
  • 为什么express.js在使用res.send()时返回空数组?

    我有一个包含键和值对数组的对象 console log myObject askdasuni com 11111 capsfrom2011 com 22222 defusionet com 33333 当我在应用程序中调用 res send
  • 如何在 React 中的不同文件之间共享变量数据

    我正在尝试在我的股票市场项目中设置图表 我正在尝试显示在 Gatsby 中点击的股票的图表 目前 我可以通过在代码中手动输入股票名称来显示任何股票的股票图表 我想用 api 调用的 url 内的 query 替换股票名称 因为const q
  • 如何使用 protoc 将协议缓冲区字符串编码为二进制

    我一直在尝试使用 protoc cli 实用程序对字符串进行编码 注意到输出仍然包含纯文本 我究竟做错了什么 osboxes osboxes proto bin cat teststring proto syntax proto2 mess
  • 暂停申请

    如何暂停我的应用程序或向我的应用程序发送暂停消息 我想模拟按下主页按钮 UIApplication 有一个私有实例方法 以下代码可以工作 在 iPhone 3GS 中测试 UIApplication app UIApplication sh
  • 如何让selenium等待ajax响应?

    我怎样才能让硒等待日历小部件之类的东西加载 现在我只是在做一个Thread sleep 2500 将测试用例导出到 junit 程序后 我会用 waitForElementPresent locator 这将等到该元素出现在 DOM 中 如
  • iOS 8 横向模式下按钮不显示

    我有一个按钮 我将其约束设置为 水平中心 和 垂直中心 在纵向模式下 它按预期出现在中心 但是当我将设备旋转到横向模式时 按钮消失 状态栏也不可见 Here is a screen which show constraint needed
  • 将数量输入字段更改为 WooCommerce 中的下拉菜单

    我在 function php 中使用以下内容 它在单个产品页面上效果很好 我遇到的问题是在购物车页面上 当您选择不同的数量时 它不会自动更新购物车 有任何想法吗 function woocommerce quantity input ar
  • PHP - 序列化具有静态属性的类

    当用户登录我的网站时 我会创建一个实例User类 获取一些与用户相关的数据并将对象存储在SESSION 我从数据库获取的一些数据应该在整个会话期间保持不变 并且我希望可以从其他对象访问这些数据 我更喜欢使用User static value
  • 如何在AppDomain中执行非托管程序集?

    执行非托管程序集时出现以下错误 无法加载文件或程序集 文件 C 程序 文件 Maxima 5 21 1 lib maxima 5 21 1 binary gcl maxima exe 或其依赖项之一 这 模块预计包含一个 装配清单 我应该怎
  • Tailwind CSS + VueJS 单文件组件与 VS Code 集成

    如何正确配置 Tailwind CSS 和 VS Code 以至少禁用 VueJS 单文件组件 vue cli 内有关 at rule 和空标记错误的错误
  • 用 C++ 编写操作系统[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Python/Pandas:如何从 datetime64[ns] 转换为 datetime

    我有一个处理 Excel 文件的脚本 发送它的部门有一个生成它的系统 我的脚本停止工作 我突然收到错误Can only use str accessor with string values which use np object dtyp
  • atexit() 函数

    有几个教程解释了如何使用atexit 函数如 http linux die net man 3 atexit http linux die net man 3 atexit 示例在 main 函数中给出 很容易理解 但是 我正在我的程序中创
  • 在 Windows 中使用 .Net 手动加载和卸载驱动程序

    我有一个通过 COM USB 转换器使用 USB 端口连接到计算机的设备 并且我使用 FTDI 驱动程序来模拟该 USB 上的虚拟 COM 端口 我的转换器有时会冻结 Windows 驱动程序也是如此 我无法打开 关闭 COM 软件无法通过
  • 获取单选按钮值 [INNO SETUP]

    我正在尝试在 Inno Setup 中创建一个新窗口 在此窗口中 应该有 5 个单选按钮 用户必须仅选择此选项之一 当用户单击下一个按钮时 我必须获取并保存单选按钮的值 在某处 并将该值传递给带有参数的批处理文件 将运行 我认为我应该在 N
  • ASP.NET 中的 Excel 读取:如果列具有不同的数据格式,则不会读取数据

    我有一个 asp net C 应用程序 我正在其中使用 OLEDBConnection 读取电子表格的内容 我正在使用下面的代码行从 Excel 电子表格中读取数据 OleDbConnection con new OleDbConnecti
  • 在负载平衡情况下使用 WCF 4.5 RemoteEndpointMessageProperty 获取客户端 IP 地址

    我在 IIS 中托管了 WCF 4 5 Restful 服务 我正在尝试使用 RemoteEndpointMessageProperty 获取客户端的 IP 地址 消耗该服务 Code 1 private string GetClientI
  • 为什么人们不使用四面体作为天空盒?

    在3D游戏中渲染固定纹理的天空时 人们通常会先在立方体贴图中创建6个纹理 然后在相机周围渲染一个立方体 在 GLSL 中 您可以使用法线而不是纹理坐标来访问纹理中的像素 并且可以通过标准化相对于相机的片段位置轻松获得该法线 然而 这个过程可