Three.js 中同一网格面上的多个透明纹理

2023-12-13

是否可以在 Three.js 中将多个纹理叠加在同一个面上,以便在 webGL 中通过 GPU 加速完成 alpha 混合?

这些纹理(或应该)应用于同一个面,以便底部纹理(纹理 1)没有 Alpha 通道,并且上面的纹理以类似于下图示例中的纹理 2 的方式进行 Alpha 通道。

这种混合可以使用 HTML5 Canvas 作为预处理来实现,但由于纹理位图可能很大,所以我更喜欢跳过 Canvas 混合操作。

我通过创建网格的副本并对每个网格应用一个纹理进行测试,并使其他网格透明并稍微移动它,这几乎成功了,但是存在一些闪烁,并且因为对象不能完全处于同一位置,所以存在一些闪烁纹理之间有空间,这不是正确的效果。它们看起来应该像是混合在一起的,例如。 Photoshop(如下图所示)。

enter image description here


使用 ShaderMaterial 并将两个纹理设置为制服,然后在着色器中将它们混合。

我做了这个例子:http://abstract-algorithm.com/ Three_sh/这真的应该足够了。

所以,你制作 ShaderMaterial:

var vertShader = document.getElementById('vertex_shh').innerHTML;
var fragShader = document.getElementById('fragment_shh').innerHTML;

var attributes = {}; // custom attributes

var uniforms = {    // custom uniforms (your textures)

  tOne: { type: "t", value: THREE.ImageUtils.loadTexture( "cover.png" ) },
  tSec: { type: "t", value: THREE.ImageUtils.loadTexture( "grass.jpg" ) }

};

var material_shh = new THREE.ShaderMaterial({

  uniforms: uniforms,
  attributes: attributes,
  vertexShader: vertShader,
  fragmentShader: fragShader

});

并使用该材质创建网格:

var me = new THREE.Mesh( new THREE.CubeGeometry(80,80,80), material_shh );

您可以放置​​最简单的顶点着色器:

varying vec2 vUv;

void main()
{
    vUv = uv;
    vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
    gl_Position = projectionMatrix * mvPosition;
}

片段着色器实际上会进行混合:

#ifdef GL_ES
precision highp float;
#endif

uniform sampler2D tOne;
uniform sampler2D tSec;

varying vec2 vUv;

void main(void)
{
    vec3 c;
    vec4 Ca = texture2D(tOne, vUv);
    vec4 Cb = texture2D(tSec, vUv);
    c = Ca.rgb * Ca.a + Cb.rgb * Cb.a * (1.0 - Ca.a);  // blending equation
    gl_FragColor= vec4(c, 1.0);
}

如果您需要混合更多纹理,您可以使用相同的方程式进行多次混合。

结果如下:

enter image description here

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

Three.js 中同一网格面上的多个透明纹理 的相关文章

随机推荐

  • iOS 应用程序捆绑包 ID 错误和 iTunesConnect

    如本文所述SO entry 我在 iOS 应用程序应用程序上传器中遇到错误 这些是我的价值观 在钥匙串中我有这个证书 iPhone Distribution ExampleCompany DistCertificateID 在我的devel
  • 获取Linux中每个进程的堆和堆栈的大小

    我想知道Linux中每个进程的堆和堆栈的大小 有什么办法可以找到吗 我发现 sbrk 0 会给我堆的结尾 但是如何找到堆的起始位置来获取堆大小呢 另外 关于堆栈大小 是否有任何方法可以通过任何库调用或系统调用找到每个进程的堆栈开头和当前堆栈
  • Spring 4 i18n & l10n(无法更改 HTTP 接受标头)

    我需要帮助来解决此错误消息 我正在使用 spring 4 我想在我的项目中实现 i18n 和 l10n 当我尝试更改语言时 会出现此消息 下面是我的代码 请问 有人可以帮我解决这个问题吗 https i stack imgur com tK
  • didReceiveData 未获取所有数据

    我正在尝试使用 NSURLConnection 下载 JSON 但除非我强制应用程序暂停几秒钟 否则我获得的数据并不完整 它总是在 2600 字节左右 而我的响应应该在 70000 左右 任何线索为什么会发生这种情况 谢谢 void con
  • 未检测到文档的语法约束(DTD 或 XML 模式)

    我有这个 dtd http fast code sourceforge net template dtd但是当我包含在 xml 中时 我收到警告 未检测到文档的语法约束 DTD 或 XML 模式 xml 是
  • 使用正则表达式捕获 html 标签内的内容

    首先 我知道这是一种不好的做法 我已经回答了很多问题 甚至这么说 但需要澄清一下我被迫使用正则表达式 因为该应用程序将正则表达式存储在数据库中并且只能以这种方式运行 我绝对不能改变功能 现在我们已经解决了这个问题 因为我总是使用 DOM 方
  • 无法使 PubNub WebRTC 教程正常工作

    我正在尝试按照 PubNub 教程构建我的第一个 WebRTC 应用程序 https www pubnub com blog 2015 08 25 webrtc video chat app in 20 lines of javascrip
  • 使用 FluentFTP 以最大值同时从 FTP 下载多个文件

    我想从 FTP 目录递归下载多个下载文件 为此我使用 FluentFTP 库 我的代码是这样的 private async Task downloadRecursively string src string dest FtpClient
  • 在本地使用 mpi 安装 fftw-2.1.5

    我正在尝试使用 enable mpi 标志在带有 linux 的 IBM 集群上安装 fftw 2 1 5 库 但此后我一直未能这样做 我需要 fftw 版本 2 1 5 因为 GADGET2 代码需要该版本 并且具有 mpi 支持 首先
  • Python - BeautifulSoup html解析处理gbk编码不佳 - 中文网页抓取问题

    我一直在修改以下脚本 coding utf8 import codecs from BeautifulSoup import BeautifulSoup NavigableString UnicodeDammit import urllib
  • 字典、哈希集的访问时间

    访问时间是多少 在字典中查找值 检查HashSet是否有值 是像C 0x的unordered map那样O 1 吗 是的 当您使用 Contains 方法或字典的索引器时 来自文档 Dictionary Of TKey TValue 泛型类
  • 我可以在 JavaScript 中将新数组重新分配给数组变量吗?

    我对 JavaScript 中的数组以及在函数内操作它们有疑问 这是书上的练习雄辩的 JavaScript 它涉及两个功能 reverseArray 返回一个new与参数数组相反的数组 reverseArrayInPlace 只是反转参数数
  • Ruby:常量查找在instance_eval/class_eval 中如何工作?

    我正在研究 Pickaxe 1 9 并且对 instance class eval 块中的常量查找感到有点困惑 我用的是1 9 2 Ruby 似乎以与方法查找相同的方式处理 eval 块中的常量查找 在receiver singleton
  • Mac OS X:我可以在应用程序包中编写应用程序文件吗?

    该应用程序将位于 Applications 中 该应用程序将通过网络浏览器而不是通过 App Store 下载 使用的语言是 Tcl Tk 答 这适用于所有版本的 OS X 10 5 或更高版本吗 B 有没有更好的地方来存储应用程序文件 L
  • CMake如何将构建目录设置为与源目录不同

    我对 CMake 还很陌生 阅读了一些关于如何使用它的教程 并编写了一些复杂的 50 行 CMake 脚本 以便为 3 个不同的编译器制作一个程序 这可能总结了我对 CMake 的所有知识 现在我的问题是我有一些源代码 当我制作程序时我不想
  • R - deSolve 包(ode 函数):根据时间改变 SIR 模型中的参数矩阵

    我正在尝试使用该函数模拟病毒在人群中的传播ode来自deSolve包裹 我的模型的基础是 SIR 模型 我在这里发布了一个更简单的模型演示 其中仅包含三个状态S 易感 I 传染性 和R 康复 每个状态由一个代表m n 矩阵在我的代码中 因为
  • 将 HTML 传递到 Mat 对话框 [重复]

    这个问题在这里已经有答案了 我正在尝试将 HTML 作为消息参数传递到我的 Mat Dialog 代码中 所以我有以下内容 但不确定如何将 HTML 传递给它 openAlertDialog const dialogRef this dia
  • 修复 Excel 中以整数和字符日期的混合形式导入 R 的日期列

    I am trying to import my excel data sheet and the date column is imported as a character column with some integer date v
  • Nodejs内存分析

    需要分析节点进程 在运行节点进程几天后 我在生产中出现了一些内存泄漏 我尝试过node inspector v8 但它不起作用 在新版本的node inspector中没有 配置文件 选项卡 在旧版本中 当我开始分析错误时 会触发错误并停止
  • Three.js 中同一网格面上的多个透明纹理

    是否可以在 Three js 中将多个纹理叠加在同一个面上 以便在 webGL 中通过 GPU 加速完成 alpha 混合 这些纹理 或应该 应用于同一个面 以便底部纹理 纹理 1 没有 Alpha 通道 并且上面的纹理以类似于下图示例中的