比较在 Three.js 中创建天空盒材质的方法

2023-12-12

当谈到在 Three.js 中制作天空盒时,我看到了两种不同的思想流派。假设我们有代码

var imagePrefix = "images/mountains-";
var directions  = ["xpos", "xneg", "ypos", "yneg", "zpos", "zneg"];
var imageSuffix = ".jpg";
var skyGeometry = new THREE.CubeGeometry( 10000, 10000, 10000 );    

在这两种方法中,我们都会创建一个非常大的立方体并应用纹理。区别在于是否使用着色器。例如:

不使用着色器的材质:

var materialArray = [];
for (var i = 0; i < 6; i++)
    materialArray.push( new THREE.MeshBasicMaterial({
        map: THREE.ImageUtils.loadTexture( imagePrefix + directions[i] + imageSuffix ),
        side: THREE.BackSide
    }));
var skyMaterial = new THREE.MeshFaceMaterial( materialArray );
var skyBox = new THREE.Mesh( skyGeometry, skyMaterial );
scene.add( skyBox );

使用着色器的材质:

var imageURLs = [];
for (var i = 0; i < 6; i++)
    imageURLs.push( imagePrefix + directions[i] + imageSuffix );
var textureCube = THREE.ImageUtils.loadTextureCube( imageURLs );
var shader = THREE.ShaderLib[ "cube" ];
shader.uniforms[ "tCube" ].value = textureCube;
var skyMaterial = new THREE.ShaderMaterial( {
    fragmentShader: shader.fragmentShader,
    vertexShader: shader.vertexShader,
    uniforms: shader.uniforms,
    depthWrite: false,
    side: THREE.BackSide
} );
var skyBox = new THREE.Mesh( skyGeometry, skyMaterial );
scene.add( skyBox );

我自己的非正式性能测试显示,使用 2048x2048 图像作为纹理时,FPS 没有显着差异。无着色器代码更容易理解(至少对我来说)。在某些情况下使用基于着色器的纹理是否有优势?


你有一个概念上的误解。

对于 WebGL,两种方法都涉及着色器。MeshBasicMaterial为了方便起见,有一个为您编写的顶点和片段着色器。

这两个示例之间的主要区别是第二个示例使用立方体贴图作为输入。

例如,如果您已经在反射材质中使用相同的立方体贴图作为环境贴图,则可以使用该方法。

第一个示例只是渲染天空盒的另一种方法,并且是这两种方法中唯一可以使用的方法CanvasRenderer.

三.js r.58

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

比较在 Three.js 中创建天空盒材质的方法 的相关文章

随机推荐

  • Java:如何在抛出异常后继续读取文件

    所以我的教授给我们分配了一个项目 我们必须从文本文件中获取命令并使用它们来驱动程序的流程 这些命令 例如起飞 着陆 装载货物 卸载货物等 旨在模拟类似飞机的物体 有时这些命令执行起来没有意义 例如在飞机飞行时装载货物 因此 为了防止发生类似
  • 是否可以在不使用 EDT 的情况下在 Java Swing 中执行主动渲染?

    我正在考虑使用缓冲策略以及 Javadoc 中描述的以下技术 Main loop while done Prepare for rendering the next frame Render single frame do The foll
  • 我可以使用 Java API 将图像文件存储在 firebase 中吗?

    有没有什么方法可以使用Java api将图像文件存储在firebase中以用于android应用程序 我已阅读此主题我可以使用 Java API 将图像文件存储在 firebase 中吗但仍然没有答案 我知道有一个官方 api 名为 fir
  • TFrecord 比原始 JPEG 图像占用更多空间

    我正在尝试将 Jpeg 图像集转换为 TFrecords 但 TFrecord 文件占用的空间几乎是图像集的 5 倍 经过大量谷歌搜索后 我了解到当 JPEG 被写入 TFrecords 时 它们就不再是 JPEG 了 但是我还没有遇到这个
  • 如何子类化 matplotlib 的图形类?

    我正在尝试向我的图形添加一些自定义行为和属性 但我无法决定有效的 和Pythonic 方法 我的第一个冲动是简单地子类化matplotlib figure Figure但我不知道如何实现这一点 我通常创建新的图形并用类似的东西开始我的绘图
  • .gitattributes:merge=我们的策略与快进合并

    如果我处于这样的 git 情况 da6a750 A Further in A okay for merging back into master bf27b58 Merge branch master into A 86294d1 HEAD
  • 无法使用沙盒帐户

    我真的需要你们的帮助 两个小时以来 我遇到了一个与 Paypal Sandbox 相关的非常奇怪的问题 我在堆栈溢出上阅读了很多答案 但没有一个对我有帮助 我将尝试解释我的问题 当我创建一个新的沙箱帐户 尊重密码强度 负载平衡等所有规则 时
  • 序列化数组以将它们存储在数据库中的意义是什么?

    我看到人们存储数组的方式如下 a 6 i 0 s 5 11148 i 1 s 5 11149 i 2 s 5 11150 i 3 s 5 11153 i 4 s 5 11152 i 5 s 5 11160 为什么他们不能是 11148 11
  • Cython 中数组的总和

    我正在尝试找到使用 Cython 水平求和 numpy 数组数组的最快方法 首先 假设我有一个随机浮点数 10 x 100 000 的二维数组 我可以创建一个object数组 每一列作为数组中的值 如下所示 n 10 5 a np rand
  • 如果名称变量以下划线为前缀,则 Bean 验证不起作用

    我正在尝试一些 bean 验证 但我偶然发现了 奇怪 的行为 我正在使用 Glassfish 和 Primefaces 作为前端 如果有什么区别的话 在我的项目的其他地方 我使用 Hibernate validator 我不确定它是否正在验
  • 垃圾收集器 C#,有关“清除”对象的问题

    我阅读了一些有关垃圾收集的信息 它是如何工作的等 我尝试通过我的示例了解它是如何工作的 但我认为我有问题 我知道垃圾收集器在以下情况下运行 内存不够 你调用GC Collect 这是我的代码 public partial class For
  • 为什么 trySend 会发出假数据?

    我需要在 MVVM 中获取用户身份验证状态 在存储库中我这样做 override fun getAuthResponse callbackFlow val listener AuthStateListener Log d TAG curre
  • 在数据库中保存塞尔维亚拉丁字符

    我在数据库中保存塞尔维亚拉丁字符时遇到问题 但只有当我从 jsf 应用程序保存它时才会出现问题 当我直接使用 SQLyog 在数据库中插入一些行时 一切都很好 当我尝试从应用程序插入某些内容而不是字符时 and 在数据库中插入问号 另一方面
  • jqgrid服务器异常错误消息

    有没有办法在我的 jqGrid 中显示从服务器发送的自定义异常消息 我的一个函数执行 throws 子句并抛出一些异常 我需要显示与此抛出的异常相关的错误消息 有没有办法在 jqGrid 中做到这一点 您没有指定在哪个 jqGrid 操作中
  • START_STICKY 和 START_NOT_STICKY

    有什么区别START STICKY and START NOT STICKY在android中实现服务时 谁能指出一些标准示例 这两个代码仅在手机内存不足并在服务完成执行之前终止服务时才相关 START STICKY告诉操作系统在有足够的内
  • 在scala中序列化优先级队列

    我正在尝试序列化一个可变的PriorityQueue在 scala 2 10 中 我得到了NotSerializableException将对象写入 ObjectOutputStream 时 我做了一个简单的测试用例 import java
  • 如何在 Zend Framework 2 中访问路由、发布、获取等参数

    zf2中如何获取与页面请求相关的各种参数 像 post get 参数 正在访问的路由 发送的标头和上传的文件 最简单的方法是使用参数插件 在 beta5 中引入 它具有实用方法 可以轻松访问不同类型的参数 一如既往 读书测试对于理解某物应该
  • 我应该使用事件、信号量、锁、条件或其组合来管理安全退出多线程 Python 程序吗?

    我正在编写一个多线程Python程序 其中主线程和它生成的其他线程作为守护进程运行 但不是Thread daemon True 它们在某些目录中查找某些文件 并在它们存在时对其执行操作 一个 任何线程中可能会发生错误 这将需要整个程序退出
  • 如何使用 MASM 在控制台上进行输入/输出? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我用谷歌搜索了又搜索 但没有发现任何有用的东西 如何将输出发送到控制台 并通过程序集接受来自控制台的用户输入 我正在使用 MASM32 正如 filofel 所说 使用 Win3
  • 比较在 Three.js 中创建天空盒材质的方法

    当谈到在 Three js 中制作天空盒时 我看到了两种不同的思想流派 假设我们有代码 var imagePrefix images mountains var directions xpos xneg ypos yneg zpos zne