渲染透明外壳

2023-12-05

假设我正在渲染神奇女侠驾驶她的隐形喷气机。射流由多个网格组成,大部分是透明的。在透明网格重叠的地方,它变得更加不透明。我不想有这种重叠,这样透明部分仍然有阴影,但材质会丢弃其他片段后面的透明片段,就好像神奇女侠坐在透明的外壳内一样。

也许一个好的表达方式是我想要像不透明网格一样渲染透明网格,但仍然允许它们是透明的。

举个例子,这里是普通女性驾驶她最引人注目的汽车:http://jsfiddle.net/TheJim01/e6ccfo24/

我已经完成了深度测试和编写的不同排列,并尝试了所有各种深度测试功能。我还尝试了不同的混合设置(我看到了一些建议THREE.NoBlending,但这不是我想要的,因为我失去了透明度)。如果我必须为此编写一个自定义着色器,我会走这条路,但我不知道从哪里开始。

HTML:

<script>
// INITIALIZE
var WIDTH = window.innerWidth,
    HEIGHT = window.innerHeight,
    FOV = 35,
    NEAR = 1,
    FAR = 1000;

var renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(WIDTH, HEIGHT);
document.getElementById('host').appendChild(renderer.domElement);

var stats= new Stats();
stats.domElement.style.position = 'absolute';
stats.domElement.style.top = '0';
document.body.appendChild(stats.domElement);


var camera = new THREE.PerspectiveCamera(FOV, WIDTH / HEIGHT, NEAR, FAR);
camera.position.z = 250;

var trackballControl = new THREE.TrackballControls(camera, renderer.domElement);
trackballControl.rotateSpeed = 5.0; // need to speed it up a little

var scene = new THREE.Scene();

var light = new THREE.PointLight(0xffffff, 1, Infinity);
light.position.copy(camera.position);

scene.add(light);

function draw(){
    light.position.copy(camera.position);
    renderer.render(scene, camera);
  stats.update();
}
trackballControl.addEventListener('change', draw);

function navStartHandler(e) {
  renderer.domElement.addEventListener('mousemove', navMoveHandler);
  renderer.domElement.addEventListener('mouseup', navEndHandler);
}
function navMoveHandler(e) {
  trackballControl.update();
}
function navEndHandler(e) {
  renderer.domElement.removeEventListener('mousemove', navMoveHandler);
  renderer.domElement.removeEventListener('mouseup', navEndHandler);
}

renderer.domElement.addEventListener('mousedown', navStartHandler);
renderer.domElement.addEventListener('mousewheel', navMoveHandler);
</script>

CSS:

html *{
    padding: 0;
    margin: 0;
    width: 100%;
    overflow: hidden;
}

#host {
    width: 100%;
    height: 100%;
}

JavaScript:

// NOTE: To run this demo, you MUST use the HTTP protocol, not HTTPS!

var msh = new THREE.Mesh(new THREE.SphereGeometry(10, 20, 20), new THREE.MeshLambertMaterial({color: "red"}));
msh.position.set(0, 10, 0);
scene.add(msh);

var mat = new THREE.MeshLambertMaterial({
    color: "silver",
  transparent: true,
  opacity: 0.5
});

msh = new THREE.Mesh(new THREE.CylinderGeometry(15, 15, 75, 20), mat);
msh.rotation.set(0, 0, Math.PI / 2);
msh.position.set(0,10,0);
scene.add(msh);

msh = new THREE.Mesh(new THREE.CylinderGeometry(15, 15, 50, 20), mat);
msh.rotation.set(Math.PI / 2, 0, 0);
msh.position.set(-20,-10,0);
scene.add(msh);

msh = new THREE.Mesh(new THREE.CylinderGeometry(15, 15, 50, 20), mat);
msh.rotation.set(Math.PI / 2, 0, 0);
msh.position.set(20,-10,0);
scene.add(msh);

draw();

如果你想渲染重叠的透明面,但不希望重叠区域变暗,你可以实现一个技巧:首先渲染面

material.colorWrite = false;

然后再次渲染它们

material.colorWrite = true;

您可以使用Object3D.renderOrder属性以确保渲染面colorWrite = false发生在渲染之前colorWrite = true.

三.js r.144

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

渲染透明外壳 的相关文章

随机推荐

  • tkinter 在 for 循环中创建可点击标签[重复]

    这个问题在这里已经有答案了 我想在 for 循环中创建多个可点击标签 标签的结构类似于网格 具有 row 和 col 属性 如果我单击标签 则应使用 print it 函数打印单击标签的行和列 问题是 如果我单击任何标签 在这种情况下输出始
  • 在等待输入python时更新turtle/gui

    我正在制作一个聊天程序 但遇到一个问题 屏幕仅在输入后更新 我正在使用turtle来显示聊天 我知道 turtle对于这个目的来说并不是那么好 但它非常简单 这是我循环中的代码 while True ind userlist index u
  • 模拟器上的 Ionic3(Angular4) CORS

    我正在 genymotion 模拟器上测试 Ionic 3 应用程序 顺便说一句 由于 CORS http 请求不起作用 我以为服务器有问题 但我用ionic 2应用程序检查后确认服务器没有问题 Ionic 3 应用程序的 Http 请求在
  • 根据所选国家,需要填充州和城市

    HTML
  • 防止反应悬念隐藏内容

    我用谷歌搜索 观看了很多视频来实现类似 YouTube 加载的功能 如下面的屏幕截图所示 因此 我有基于路线的导航 其中有延迟加载 因此一切正常 但在加载内容时 反应悬念将使组件显示 无 因此它在屏幕上变得不可见 只有后备组件可见 我想让内
  • 在没有jquery的情况下更改页面滚动时的背景颜色?

    我试图让过渡工作 以便背景颜色根据页面 即位置淡入另一种颜色 由具有相同类的div触发 在这里找到了一些js http codepen io Funsella pen yLfAG 它在桌面上完全按照我想要的方式工作 但它在 iPad 上崩溃
  • Parallel.ForEach 与 HttpClient 和 ContinuousWith

    我有一个方法尝试从多个 URL 并行下载数据 并返回一个IEnumerable反序列化类型 该方法如下所示 public IEnumerable
  • 如何更改python字符串中最后一个字母的大小写?

    所以我想将字符串中的最后一个字符更改为小写 下面的代码是我用来向后打印字符串的方法 但是列表将最后一个字符保留为大写 我不知道如何解决这个问题 if s 1 x new last index len s 1 for i in range l
  • 插入符中的逻辑回归 - 无截距?

    使用 caret 包在 R 中执行逻辑回归 并尝试强制零截距 使得 x 0 处的概率为 0 5 在其他形式的回归中 似乎您可以使用unegrid关闭截距 但这没有逻辑回归的功能 有任何想法吗 model lt train y 0 x dat
  • 将wpf窗口打印到pdf文件

    我需要从 wpf 窗口构建 pdf 文件 该窗口包含一个带有一些绘图的画布以及一些带有数据的文本框和标签 一位朋友告诉我使用水晶报表 但对我来说似乎不是一个好的解决方案 我想在画布上打印图像并用文本框和标签的数据写入一些行 我需要一个非付费
  • 独立 VS 2010 C++ 程序

    我已经很久没有使用 VS 2010 和 C 了 当我重新开始使用它时 我遇到了去年困扰我的同样的问题 我编译的 exe 运行得不好没有正确的 C 运行时的旧机器 我什至不知道给他们什么链接 我告诉他们安装this他们收到错误消息 该程序无法
  • 如何在 AEM 6.1 中创建系统用户 (rep:SystemUser)?

    在 AEM 6 1 上 我尝试创建一个系统用户 rep SystemUser 谁能帮我 我需要这个系统用户映射到 OSGI 中的一个服务 我想用它来将一些数据写入 aem 内容 我可以在 CRX 中的以下位置看到 系统用户 home use
  • 在 C'# 中以编程方式获取所有 TFS 分支

    我正在尝试以编程方式获取 TFS for Visual Studio 2013 中所有分支的列表 经过一些研究 我发现此博客详细介绍了如何获取分支 显示 TFS 2010 中的所有分支层次结构 我修改了代码 将所有内容存储在列表中 priv
  • MPICH:如何发布_名称以便客户端应用程序可以查找_名称?

    在 Windows 1 4 1p1 中使用 MPICH 学习 MPI 时 我发现了一些示例代码here 最初 当我运行服务器时 我必须复制生成的port name并用它启动客户端 这样 客户端就可以连接到服务器了 我修改它以包括MPI Pu
  • 魔法记录导入(下一步)

    我在标题中添加了下一步 因为这与我之前的问题不同 标题几乎完全相同 我有一个Person entity Person name mappedKeyName FullName email mappedKeyName EmailAddress
  • 每天在两列范围之间的数据框中添加行

    我需要知道按房型划分的预订数量 我有这个 DataFrame 其中包含每个预订的开始和结束及其房间类型 date from date to room type 0 2017 08 07 2017 08 12 SUI 1 2017 08 09
  • 为什么 Xcode 4.3.2 存档时会挂起?

    当我尝试归档构建时 xcode 因彩色旋转死亡之轮而挂起 它曾经工作正常 但我无法再浏览存档 除非我手动删除存档文件 不过 我可以毫无问题地构建一个设备 我手动删除了存档中的所有内容 通过删除实际的存档文件 并且存档 组织器窗格显示正常 因
  • 提供的注册令牌未注册

    我正在尝试通过 Google 云功能发送 iOS 推送通知 但它返回错误The provided registration token is not registered 但我已经通过调试我的应用程序进行了检查 并且 FCM 注册令牌是正确
  • MySQL:选择前n个最大值?

    我对需要返回特定列上具有最大值的前 N 行的查询感到非常困惑 例如 如果行N 1 N N 1具有相同的值 我必须返回吗just top N or top N 1 rows 如果你这样做 select from t order by valu
  • 渲染透明外壳

    假设我正在渲染神奇女侠驾驶她的隐形喷气机 射流由多个网格组成 大部分是透明的 在透明网格重叠的地方 它变得更加不透明 我不想有这种重叠 这样透明部分仍然有阴影 但材质会丢弃其他片段后面的透明片段 就好像神奇女侠坐在透明的外壳内一样 也许一个