Three.js 点云、BufferGeometry 和不正确的透明度

2023-12-07

问题:我有一个包含大量数据点(大约一百万个)的点云。当我对渲染点应用透明度时,透明度以某种方式不显示渲染点后面的内容

incorrect rendering

正如您在标记点的示例中看到的那样,它没有显示应有的内容,就好像缓冲存在问题一样。

我使用 Three.js 使用以下“设置”创建点云:

渲染器:

this.renderer = new THREE.WebGLRenderer({
    canvas: this.canvas,
    antialias: true
});

材料:

this.pointMaterial = new THREE.ShaderMaterial( {
    uniforms: {
        time:       { type: "f", value: 1.0 }
    },
    vertexShader:   document.getElementById('vertexShader').textContent,
    fragmentShader: document.getElementById('fragmentShader').textContent,
    transparent:    true
});

顶点着色器:

attribute float size;
attribute float opacity;
attribute vec3 color;
varying vec3 vColor;
varying float vOpacity;

void main() {
    vColor = color;
    vOpacity = opacity;
    vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
    gl_PointSize = size * (500.0 / length(mvPosition.xyz));
    gl_Position = projectionMatrix * mvPosition; 
}

片段着色器:

uniform float time;
varying vec3 vColor;
varying float vOpacity;

void main() {
    gl_FragColor = vec4(vColor, vOpacity);
}

几何形状(我省略了填充数组的部分):

var bufferGeometry = new THREE.BufferGeometry();

var vertices = new Float32Array(vertexPositions.length * 3);
var colors = new Float32Array(vertexColors.length * 3);
var sizes = new Float32Array(vertexSizes.length);
var opacities = new Float32Array(vertexOpacities.length);

bufferGeometry.addAttribute('position', new THREE.BufferAttribute(vertices, 3));
bufferGeometry.addAttribute('color', new THREE.BufferAttribute(colors, 3));
bufferGeometry.addAttribute('size', new THREE.BufferAttribute(sizes, 1));
bufferGeometry.addAttribute('opacity', new THREE.BufferAttribute(opacities, 1));

this.points = new THREE.Points(bufferGeometry, this.pointMaterial);
this.scene.add(this.points);

我用内置的点材质尝试了这个,同样的情况发生

this.pointMaterial = new THREE.PointsMaterial({
    size: this.pointSize,
    vertexColors: THREE.VertexColors,
    transparent: true,
    opacity: 0.25
});

这是预期的行为还是我做错了什么?


Alpha 混合方程的工作方式是,后面的几何体的源颜色被前面的几何体的目标颜色覆盖。这意味着您需要按从后到前的排序顺序渲染透明几何体,以便前面的几何体能够与后面的几何体正确混合。

如果您拥有的只是透明几何体,那么您只需禁用深度测试,以相反的深度排序顺序渲染,它就会起作用。如果您也有不透明几何体,那么您需要首先正常渲染所有不透明几何体,然后禁用深度写入(不是测试)并以相反的深度排序顺序渲染透明几何体,然后重新启用深度写入。

Here are some的答案similar如果您有兴趣了解更多信息,请提问。

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

Three.js 点云、BufferGeometry 和不正确的透明度 的相关文章

随机推荐

  • 使用 boto3 和 python 将 AWS EC2 详细信息导出到 xlsx/csv

    我是 python 和 boto3 的新手 我需要使用 python 获取以下详细信息 我使用 bash 来获取这些详细信息 bin bash aws ec2 describe instances query Reservations In
  • 为什么从移动设备触发时我的触发状态为“已暂停”

    我使用 Google 表格中的数据验证实现了按钮单击解决方法功能 并且每当从移动设备执行触发器时 它都处于 暂停 状态 当执行此触发器时 我将显示对话框 当从浏览器执行时 该对话框工作得非常好 代码片段 function onSheetEd
  • Python3 PIL Pillow Ubuntu 安装

    我正在运行 Ubuntu 14 04 LTS 我安装了 Python 2 7 和 Python 3 4 在 Linux 中安装 Python 包方面我还算新手 我只是想安装并访问PIL sPython 3 4 中的图像库 据我了解 这是通过
  • DocumentDB 性能问题

    当在我的本地计算机上通过 C 代码运行 DocumentDB 查询时 一个简单的 DocumentDB 查询平均需要大约 0 5 秒 另一个例子 获取对文档集合的引用平均大约需要 0 7 秒 这是可以预料的吗 下面是我用于检查集合是否存在的
  • 如何使用 C++ 11 创建计时器事件?

    如何使用 C 11 创建计时器事件 我需要这样的东西 从现在起 1 秒后给我打电话 有图书馆吗 做了一个简单的实现 我相信这是你想要实现的目标 您可以使用该类later具有以下参数 int 等待运行代码的毫秒数 bool 如果为 true
  • Zend Framework 2 - 翻译路线

    我想知道是否可以在 zf2 中使用路由 uri 的翻译工具 我想要例如路线en domain tld article show 1例如翻译为de domain tld artikel anzeigen 1 我不认为正则表达式是这里的方法 因
  • Gradle tomcat 插件和属性文件

    我想使用 gradle tomcat 插件来与 gradle 进行集成测试 当前项目依赖于正在运行的 tomcat 的 catalina base 目录下的一些 properties 文件 无法更改 因为另一个依赖项目也依赖于它们 有人知道
  • 如果一个元素满足 dplyr 中的条件,则过滤所有组

    我有以下数据 df1 lt data frame id c 1 1 2 a c a b c gt df1 id a 1 1 a 2 1 b 3 2 c 如果组中至少一个元素满足给定条件 我想过滤 删除 在变量上定义的组的所有元素 此处 如果
  • 在Airflow中创建动态池

    我有一个 DAG 它创建一个集群 启动计算任务 并在完成后拆除该集群 我想将该集群上执行的计算任务的并发限制为固定数量 因此从逻辑上讲 我需要一个由任务创建的集群专用的池 我不希望干扰其他 DAG 或同一 DAG 的不同运行 我认为我可以通
  • 为 Angular 2 中的 mat-table 中实现的 mat-select 分配所需的值

    我在 Angular 2 中创建了一个简单的垫子表 有两列acc id and acc desc 我正在从我的帐户详细信息 json使用以下命令将文件放置在资产文件夹中accountdetails service ts 我已经在下拉菜单中选
  • 链接器脚本 .relocate 部分的第一个符号 _srelocate 不正确(GCC Bug?)

    Problem 我的问题是 当我使用以下脚本将代码放入 RAM 时 重定位部分会填充虚假数据 我的问题是 为什么是 srelocate符号比 4 个字节大 etext象征 它们不应该是一样的吗 另外 如果 1 的答案是否定的 我不应该复制
  • 改造2:无虚方法 newJsonReader(Ljava/io/Reader;) NoSuchMethodException

    我正在整个互联网上寻找这个错误 但是 只有一个 stackoverflow 条目没有答案或评论 我正在尝试使用Retrofit 2 这是我第一次使用它 这是我的依赖项 compile com squareup retrofit2 retro
  • 升级 Android Studio 后 Android Studio 构建错误

    升级到Android Studio后1 3 1昨天 在构建项目时出现此错误 我无法创建新项目 添加错误和 build gradle 文件如下 已经尝试改变compileSdkVersion and buildToolVersion to 2
  • 获取有关已安装网络适配器的信息

    我在 Windows XP sp3 上使用 Delphi XE2 Update 4 我希望从已安装的网络适配器中获取尽可能多的信息 特别是广播 IP 为此 我使用了 Jan Schulz 提供的代码从这篇文章 Unit Unit USock
  • GROUP_CONCAT 更改 GROUP BY 顺序

    我有一个视图 很多连接 输出按日期 ASC 排序的数据 按预期工作 输出类似于 ID date tag1 other data 1 25 03 2011 blue fff lt 1 26 03 2011 red ggg 1 27 03 20
  • android webview pdf查看

    我正在构建一个应用程序 该应用程序应该允许用户单击 Web 视图中指向 pdf 文档的链接并将其显示在视图中 我使用谷歌文档查看pdf文件有效 但我的问题是我只希望该方法适用于pdf链接而不是每个链接 这是我的代码 public class
  • 在 Python 3 中将十进制数转换为二进制数

    当我尝试将十进制转换为二进制时 代码执行时没有错误 但结果为 无 有时它只是不显示任何东西 我觉得有一些逻辑错误 任何人都可以帮助我纠正错误吗 Code def bin no global rem n int input Enter Num
  • 检测用户何时开始视频录制

    我有一个 UIImagePickerController 用来录制视频 现在我想检测用户何时点击录制按钮 委托不提供任何此类回调 有没有什么好办法可以知道视频什么时候录制的 您是对的 代表不会收到有关视频捕获何时发生的任何信息 简单的解决方
  • 没有使用 android 从服务器获取值到我的 Textview 中

    我是 Android 新手 如果我选择忘记密码链接 它应该进入下一个活动 如果我写了正确的电子邮件 那么它应该从服务器设置正确的密码 但我没有从服务器获取价值 这是我的 ForgotPassword java public class Fo
  • Three.js 点云、BufferGeometry 和不正确的透明度

    问题 我有一个包含大量数据点 大约一百万个 的点云 当我对渲染点应用透明度时 透明度以某种方式不显示渲染点后面的内容 正如您在标记点的示例中看到的那样 它没有显示应有的内容 就好像缓冲存在问题一样 我使用 Three js 使用以下 设置