您可以将原始 WebGL 纹理与 Three.js 一起使用吗

2024-01-26

我有一个相当复杂的架构,我在 Three.JS 中完成大部分工作,但我也有一个特殊的渲染器,可以直接渲染到原始 WebGL 纹理。是否可以在 Three.js“纹理”中使用此 WebGL 纹理?看起来 Three.JS 纹理类只是图像、视频或画布的容器,而在 Three.js 内部深处的某个地方,它会将其上传到真正的 webgl 纹理。如何让 Three.js 将我的 WebGL 纹理渲染到网格上?


@Brendan 的答案不再有效。

不知道什么时候改变的,也懒得去查,但从 r102 开始

const texture = new THREE.Texture();
renderer.setTexture2D(texture, 0);  // force three.js to init the texture
const texProps = renderer.properties.get(texture);
texProps.__webglTexture = glTex;

自 r103 起setTexture2D不复存在。你可以用这个代替

  const forceTextureInitialization = function() {
    const material = new THREE.MeshBasicMaterial();
    const geometry = new THREE.PlaneBufferGeometry();
    const scene = new THREE.Scene();
    scene.add(new THREE.Mesh(geometry, material));
    const camera = new THREE.Camera();

    return function forceTextureInitialization(texture) {
      material.map = texture;
      renderer.render(scene, camera);
    };
  }();

  const texture = new THREE.Texture();
  forceTextureInitialization(texture);  // force three.js to init the texture
  const texProps = renderer.properties.get(texture);
  texProps.__webglTexture = glTex;
'use strict';

/* global THREE */

function main() {
  const canvas = document.querySelector('#c');
  const renderer = new THREE.WebGLRenderer({
    canvas: canvas
  });
  
  const fov = 75;
  const aspect = 2; // the canvas default
  const near = 0.1;
  const far = 5;
  const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
  camera.position.z = 2;

  const scene = new THREE.Scene();

  const boxWidth = 1;
  const boxHeight = 1;
  const boxDepth = 1;
  const geometry = new THREE.BoxGeometry(boxWidth, boxHeight, boxDepth);
  
  const forceTextureInitialization = function() {
    const material = new THREE.MeshBasicMaterial();
    const geometry = new THREE.PlaneBufferGeometry();
    const scene = new THREE.Scene();
    scene.add(new THREE.Mesh(geometry, material));
    const camera = new THREE.Camera();

    return function forceTextureInitialization(texture) {
      material.map = texture;
      renderer.render(scene, camera);
    };
  }();

  const cubes = []; // just an array we can use to rotate the cubes

  {
    const gl = renderer.getContext();
    const glTex = gl.createTexture();
    gl.bindTexture(gl.TEXTURE_2D, glTex);
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 2, 2, 0,
        gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([
          255, 0, 0, 255,
          0, 255, 0, 255,
          0, 0, 255, 255,
          255, 255, 0, 255,
        ]));
    gl.generateMipmap(gl.TEXTURE_2D);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
  
    const texture = new THREE.Texture();
    forceTextureInitialization(texture);
    const texProps = renderer.properties.get(texture);
    texProps.__webglTexture = glTex;
    
    const material = new THREE.MeshBasicMaterial({
      map: texture,
    });
    const cube = new THREE.Mesh(geometry, material);
    scene.add(cube);
    cubes.push(cube); // add to our list of cubes to rotate
  }

  function render(time) {
    time *= 0.001;

    cubes.forEach((cube, ndx) => {
      const speed = .2 + ndx * .1;
      const rot = time * speed;
      cube.rotation.x = rot;
      cube.rotation.y = rot;
    });

    renderer.render(scene, camera);

    requestAnimationFrame(render);
  }

  requestAnimationFrame(render);
}

main();
<canvas id="c"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/103/three.min.js"></script>

注意:在 Three.js 中不存在“不支持的行为”之类的东西。 Three.js 不保证您今天所做的任何事情明天都会起作用。Three.js 随时随地破坏它想要的任何东西 https://github.com/mrdoob/three.js/wiki/Migration-Guide

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

您可以将原始 WebGL 纹理与 Three.js 一起使用吗 的相关文章

  • 使用三个 JS 和 React JS 加载 GLTF 模型

    我使用 React JS 加载从 sketchfab 下载的 GLTF 文件时遇到问题 当我尝试在不使用React 使用常规index html和index js 的情况下执行此操作时 它可以工作 但是当我将代码带入React应用程序时 它
  • 将球体 a 旋转到自身的 b 点

    我试图弄清楚如何将球体从 A 点旋转到 B 点 我找到了一些Unity3d代码 Quaternion rot Quaternion FromToRotation pointA pointB sphere transform rotation
  • 如何在 Three.js 中将 geoJSON 绘制为网格而不是线条,并填充颜色?

    我正在使用 Three js 制作一个地球仪 并将添加一些数据层 所有图层都将从 geoJSON 创建 我已将其设置为使地球仪 第一个数据文件 包含国家 地区 显示为线条 这使用三GeoJSON https github com jdomi
  • 扩展 Three.js 类

    我想扩展 Three js Object3D 类 但不知道该怎么做 有一个 Stackoverflow 问题 我已经阅读 重新阅读和尝试过 但无法让它为我工作 有没有办法扩展 ThreeJS 对象 https stackoverflow c
  • 在 React 中渲染 Three.js 元素?

    我正在尝试制作一个渲染 Three js 场景的 React 组件 但是 每当我尝试安装组件而不是看到正在渲染的任何类型的场景时 我只看到文本 object HTMLCanvasElement 正在显示 这是我的组件 import Reac
  • 可点击的精灵标签?

    我一直在玩精灵文本标签 更具体地说是这个例子 http stemkoski github io Three js Sprite Text Labels html http stemkoski github io Three js Sprit
  • 在 Three.js 中渲染具有大量对象的多个场景的最佳方式

    想象一下 您想要绘制两个场景 每个场景都有数百个球体 并提供在这些场景之间切换的功能 做到这一点的最佳方法是什么 目前 一个开关大约需要 4 到 5 秒 因为我要删除 创建和绘制每个开关上的所有球体 下面是在场景切换上运行的代码示例 cle
  • Three.js:基于图像的光照(IBL)

    I m searching to add an IBL to my scene and objects But I can t find anything on the web There are some examples with an
  • ThreeJS bufferGeometry 位置属性在应用翻译时不会更新

    我使用 STLLoader 将 stl 加载到返回 BufferGeometry 的 ThreeJS 场景中 然后我用了 myMesh position set x y z myMesh rotation setFromQuaternion
  • VS CODE 中的 WEBGL 自动完成

    我有一个学校项目 我需要使用 WEBGL 但是在没有自动补全的情况下编写所有代码是相当困难的 我没有找到合适的扩展名 你有想法吗 为了让 Visual Studio 代码能够自动完成 它需要知道变量的类型 例如 如果你有这个 const g
  • 三.JS Shadow 到对象

    我想添加castShadow and receiveShadow在一个物体上 但是下面的代码有什么问题吗 var mtlLoader new THREE MTLLoader mtlLoader setPath objects Tree mt
  • THREE.JS,忽略父级的轮换

    我试图使子对象跟随父级位置并表现得像一个普通的子对象 但是我希望它保持其旋转不变 在不影响性能的情况下 最好的方法是什么 我的CPU预算很紧张 已经运行了2个工作线程并且有很多对象 是否有设置只允许孩子的位置受到影响 同样重要的是 当父级旋
  • Three.js :face4 生成三角形而不是正方形

    我正在尝试使用 tree js 自定义几何图形生成一个正方形 但是这段代码 var cubeGeo new THREE Geometry cubeGeo vertices push new THREE Vector3 25 25 25 cu
  • Three.js canvas.toDataURL 有时为空

    我正在尝试使用 html2canvas js 渲染 THREE js 场景 一些覆盖的 HTML 元素 有用大多数时候 但并非一直如此 在失败的情况下 将渲染 HTML 元素 背景 覆盖层等 但不会渲染其他元素 THREE js 场景表现得
  • webgl中绑定缓冲区的逻辑是什么?

    有时我发现自己在以不同顺序声明缓冲区 使用 createBuffer bindBuffer bufferdata 和在代码的其他部分 通常在绘制循环中 重新绑定它们之间挣扎 如果我在绘制数组之前不重新绑定顶点缓冲区 控制台会抱怨尝试访问超出
  • 如何使用 HTML 元素阻止 THREE.js 光线投射?

    我希望页面上的 HTML 元素阻止 THREE js 光线投射 我该如何执行此操作 我遇到的问题是 当用户单击打开的 DIV 元素时 光线投射会检索场景中的对象 它会检索 DIV 后面的对象 我不想在 DIV 打开时禁用光线投射 我纯粹希望
  • 在 Chrome 18 中检测 SwiftShader WebGL 渲染器

    我有一个 2D HTML5 游戏引擎 www scirra com http www scirra com 并且确实想检测 WebGL 是否将使用 Chrome 18 的 Swiftshader 软件渲染器进行渲染 如果是这样我们会much
  • 三个JS,给纹理添加镜面反射(光泽)

    我有一个纹理应用于 Three js 中的对象 我想为其添加一些镜面反射或光泽 我看到这样的例子 new THREE MeshPhongMaterial color 0x996633 specular 0x050505 shininess
  • Three.js点击单个粒子

    In this example http jsfiddle net agqq96bq 2 您可以看到 2 个可点击的粒子 但它们都受到点击的影响 另外 我只想检测粒子上的点击 而不将它们过滤出场景 像这儿 if intersects len
  • 三.js如何通过id(name)获取场景

    我创造了一个场景 如何通过 id name 获取它 喜欢jquery test In three js医生 我刚刚找到scene getObjectById 获取子对象 有一个getObjectByName方法用于此这里在Object3D

随机推荐

  • AngularJS 密码确认 noMatch 不起作用?

    我这里有这个脚本 angular module UserValidation directive validPasswordC function return require ngModel link function scope elm
  • 在 Chrome 55 中,防止显示 HTML 5 视频的下载按钮 [重复]

    这个问题在这里已经有答案了 I am getting this download button with
  • 通配符 Snakemake 规则的预处理

    我有一个 Snakemake 配方 其中包含一个非常昂贵的准备步骤 对于所有调用来说都很常见 这是用于演示的伪规则 rule sample input name config output name npz run import somem
  • React 中的 refs 是什么?

    我无法理解 React 中的 refs 是什么 我知道它是一个回调函数 你把它放在渲染函数中 但除此之外我无法理解它是什么以及它的目的是什么 引用是您获取已创建组件的句柄的一种方式 ie
  • php Soap - SoapFault 看起来我们没有 XML 文档

    我是一名编程初学者 正在学习使用 Apache2 4 Web 服务器使用 php 和 Soap 进行 Web 服务的教程 本教程使用不带 wsdl 文件的soap Client
  • 文档模板 - 角色设置为亲自或电子邮件签名

    我已经成功创建了一个系统来使用文档模板来创建新信封 该系统具有选项卡式 UI 和 iframe 每次更改选项卡以及 URL 过期时 都会从 Docusign API 获取新 URL 我的问题是现在 一些客户将亲自签名或通过电子邮件签名 阅读
  • 如何在 Mongodb 上对超过 2 个字段进行分页

    如何在 Mongodb 上对超过 2 个字段进行分页 我的数据看起来像这样 id product name price rating search score 要使用 2 个排序字段 价格 id 对下一页进行分页 我正在使用此逻辑 db u
  • scikit-learn 中是否有可用的子空间聚类包

    scikit learn 中是否有任何类型的子空间聚类包可用 如果有人还有兴趣的话 是的 有一个使用 scikit learn 子空间聚类 https github com ChongYou subspace clustering 它是用于
  • 使用 C# 导出 Azure 数据库

    我的 C 程序可与 Azure 数据库配合使用 我正在使用 Microsoft Rest 和 Microsoft Azure Management 库来做一些事情 数据库复制 操作 删除等 我尝试导出 Azure DB 但找不到如何在 C
  • 登录 Facebook 注册回调未调用

    这是我的 onCreate 方法 Override protected void onCreate Bundle bundle super onCreate bundle setContentView R layout activity s
  • 通用多对多关系

    我正在尝试创建一个消息传递系统 其中消息的发送者和接收者可以是通用实体 这对于发件人来说似乎很好 其中只有要引用的对象 GenericForeignKey 但我不知道如何为收件人解决这个问题 GenericManyToManyKey 下面是
  • 通过将值与列名匹配来填充 data.frame

    我有两个数据框 df1 空 但具有特定的名称 apple orange banana pear grape 0 0 0 0 0 df2 fruit1 count1 fruit2 count2 apple 2 pear 1 grape 4 o
  • 如何比较两个 .NET 对象图的差异?

    在我们的客户端 服务器应用程序中 我们一直使用 BinaryFormatter 进行序列化过程 出于性能原因 我们正在尝试迁移到 protobuf net http code google com p protobuf net http c
  • javax.persistence 字段、getter 或 setter 上的注释?

    我目前正在学习 Hibernate 和 Java Persistence API 我有一个 Entity 类 需要将注释应用于各个字段 我已经在下面的代码中包含了它们可以去的所有三个地方 我应该将它们应用于字段本身 getter 还是 se
  • 有条件地操作数组中元素的属性

    我是 javascript 新手 正在尝试通过玩具示例学习一些基础知识 假设我有一个包含六个人数据的数组 const myArray id 1 value 75 friends 3 id 2 value 40 friends 4 id 3
  • 使用带有闭包映射的failFast会破坏“并行”步骤

    不确定这是我对 Groovy 的有限了解还是 Pipeline 的怪癖parallel步 我无法让它接受failFast如果我使用映射而不是单独传递每个闭包 def map map spam node echo spam map eggs
  • SQL Server:如何在选择期间从另一个表设置列别名?

    我有2张桌子 Table 1 DB1 DB2 DB3 DB4 DB5 Some other identifiers Table 2 EnumText EnumValue Some other identifiers 我想做的是 从表1中选择
  • 异步任务。哪种架构? (或 ZeroMQ 中的模式)

    我希望 Linux 服务器 主机上的一个应用程序与虚拟机中 Win7 客户端 上的应用程序进行通信 选择的库是 ZeroMQ 但如何管理异步任务呢 让我举个例子吧 VM 中的应用程序以任意时间间隔生成任务并将其发送到 Linux 盒子 这将
  • 在Python中定义嵌套字典

    我想在 python 中定义一个嵌套字典 我尝试了以下方法 keyword MyTest Later I want to pull this iterating through a list key test1 sections dict
  • 您可以将原始 WebGL 纹理与 Three.js 一起使用吗

    我有一个相当复杂的架构 我在 Three JS 中完成大部分工作 但我也有一个特殊的渲染器 可以直接渲染到原始 WebGL 纹理 是否可以在 Three js 纹理 中使用此 WebGL 纹理 看起来 Three JS 纹理类只是图像 视频