花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 96|回复: 49

ThreeJS点材质着色问题

[复制链接]
  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

    发表于 2025-6-29 10:29 | 显示全部楼层 |阅读模式

    请马上登录,朋友们都在花潮里等着你哦:)

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    THREE.PointsMaterial以点云的方式“绘制”缓冲几何体的面片。帖子《中国史诗》变大变小的播放控制器就是使用点材质+THREE.SphereGeometry做成。该帖球体面片上的点材质所有的点都是同一个颜色,里面这么设计:

    const sphereGeometry = new THREE.SphereGeometry();
    const pointsMaterial = new THREE.PointsMaterial({ size: 0.05, color: 0x90ee90 });
    	

    这里,实例化的点材质 PointsMaterial 是一个点云整体(帖子代码将其命名为 pointsMaterial),我们可以在JS对象集合{ ... }里统一配置点材质相关属性,如点材质的个头 size、颜色 color 等等。这很方便,只是,当我们需要每一个点材质个体使用不同的颜色,它无能为力。这需要用到 ThreeJS 已经封装好的webGL顶点着色器等相关技术,我们可以为缓冲几何体设计点云各点的颜色。

    下面是一个完整的绘制示例:首先创建球体缓冲几何体,接着获取几何体的顶点总数,再设计对等数量的RGB颜色数组、使用该数组创建一个颜色体系,最后在点材质中应用顶点着色器——

    <script type="module">
    	import { THREE, scene, camera, renderer, clock, basic3, click3 } from 'https://638183.freep.cn/638183/3dev/3/3basic.js';
    	basic3();
    
    	const sphereGeometry = new THREE.SphereGeometry(); // 创建球体几何体
    	const count = sphereGeometry.attributes.position.count; // 获得顶点数量(多少取决于几何体的配置)
    	const colors = new Float32Array(count * 3); // 每个顶点需要3个值(R, G, B)
    	// 为每一个点生成随机RGB数据并存入colors数组
    	for (let i = 0; i < count; i++) {
    		colors[i * 3] = Math.random();     // R
    		colors[i * 3 + 1] = Math.random(); // G
    		colors[i * 3 + 2] = Math.random(); // B
    	}
    	// 使用缓冲几何体的 setAttribute 创建颜色体系
    	sphereGeometry.setAttribute('color', new THREE.BufferAttribute(colors, 3));
    	// 配置点材质
    	const pointsMaterial = new THREE.PointsMaterial({
    		size: 0.05, // 点的大小
    		vertexColors: true, // 使用顶点着色器(关键)
    	});
    	// 合成点云 THREE.Points 并将其加入到场景
    	const pointsBall = new THREE.Points(sphereGeometry, pointsMaterial);
    	scene.add(pointsBall);
    	renderer.render(scene, camera); // 渲染效果
    </script>
    	

    或许,有必要让点云球转起来。这个不复杂,创建一个动画函数并运行它即可:

    <script type="module">
    	import { THREE, scene, camera, renderer, clock, basic3, click3 } from 'https://638183.freep.cn/638183/3dev/3/3basic.js';
    	basic3();
    
    	const sphereGeometry = new THREE.SphereGeometry(1, 32, 32); // 创建球体几何体
    	const count = sphereGeometry.attributes.position.count; // 获得顶点数量(多少取决于几何体的配置)
    	const colors = new Float32Array(count * 3); // 每个顶点需要3个值(R, G, B)
    	// 为每一个点生成随机RGB数据并存入colors数组
    	for (let i = 0; i < count; i++) {
    		colors[i * 3] = Math.random();     // R
    		colors[i * 3 + 1] = Math.random(); // G
    		colors[i * 3 + 2] = Math.random(); // B
    	}
    	// 使用缓冲几何体的 setAttribute 创建颜色体系
    	sphereGeometry.setAttribute('color', new THREE.BufferAttribute(colors, 3));
    	// 配置点材质
    	const pointsMaterial = new THREE.PointsMaterial({
    		size: 0.05, // 点的大小
    		vertexColors: true, // 使用顶点着色器(关键)
    	});
    	// 合成点云 THREE.Points 并将其加入到场景
    	const pointsBall = new THREE.Points(sphereGeometry, pointsMaterial);
    	scene.add(pointsBall);
    	pointsBall.rotateX(-Math.PI / 6); // 点云球在X轴上倾斜
    	renderer.render(scene, camera); // 渲染效果
    
    	// 动画函数
    	const animate = () => {
    		const delta = clock.getDelta(); // 获取上下帧间隔时差
    		pointsBall.rotation.y += delta / 2; // 点云球在Y轴上旋转
    		renderer.render(scene, camera); // 渲染
    		requestAnimationFrame(animate); // 循环调用函数
    	};
    	
    	animate(); // 运行动画
    </script>
    	

    利用webGL顶点着色器给缓冲几何体着色其实不限于点云材质,任何能着色的材质都可以。本文的示例,将点云材质 THREE.PointsMaterial 更换为 THREE.MeshBasicMaterial 一样可以成立——当然需要将合成语句中的 THREE.Points(..., ...) 的 Points 跟着更换为 Mesh,前者是点云网格,后者是常规网格。

    评分

    参与人数 4威望 +130 金钱 +260 经验 +130 收起 理由
    泡沫 + 20 + 40 + 20 很给力!
    杨帆 + 30 + 60 + 30 精品文章!
    红影 + 50 + 100 + 50 赞一个!
    梦江南 + 30 + 60 + 30 很给力!

    查看全部评分

  • TA的每日心情
    开心
    2025-12-14 08:25
  • 签到天数: 600 天

    [LV.9]以坛为家II

    379

    主题

    1万

    回帖

    3万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪缤纷心情心曲飞扬花好月圆飞龙在天音画大师花潮贵宾

    发表于 2025-6-29 11:58 | 显示全部楼层
    谢谢黑黑老师对代码的详细讲解。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2025-6-29 13:25 | 显示全部楼层
    这个厉害了,可以给点云的每一个点分别着色了。为每一个点生成随机RGB数据,可否加一个透明度?

    获得顶点数量(多少取决于几何体的配置)——这个是自动获得的么,没有具体数字呢。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2025-6-29 13:26 | 显示全部楼层
    看后面的介绍,这个不但能为点云着色,还能为常规网格着色呢,厉害了
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-12-15 13:49
  • 签到天数: 395 天

    [LV.9]以坛为家II

    305

    主题

    2687

    回帖

    1万

    积分

    版主

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生鹰傲苍穹飞龙在天王者至尊大将风范花潮版主

    发表于 2025-6-29 13:30 | 显示全部楼层
    辛苦了!谢谢马老师经典讲授
    ★青春是一个人的精神生命,奋斗是一个人最大的体面,学习是一个人最美的姿态。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-6-30 14:02 | 显示全部楼层
    杨帆 发表于 2025-6-29 13:30
    辛苦了!谢谢马老师经典讲授

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-6-30 14:02 | 显示全部楼层
    红影 发表于 2025-6-29 13:26
    看后面的介绍,这个不但能为点云着色,还能为常规网格着色呢,厉害了

    是的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-6-30 14:03 | 显示全部楼层
    红影 发表于 2025-6-29 13:25
    这个厉害了,可以给点云的每一个点分别着色了。为每一个点生成随机RGB数据,可否加一个透明度?

    获得顶 ...

    支持透明度,使用 opacity 键值对
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-6-30 14:03 | 显示全部楼层
    梦江南 发表于 2025-6-29 11:58
    谢谢黑黑老师对代码的详细讲解。

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2025-6-30 19:55 | 显示全部楼层

    越学越是觉得这里面的东西好多啊。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2025-6-30 19:56 | 显示全部楼层
    马黑黑 发表于 2025-6-30 14:03
    支持透明度,使用 opacity 键值对

    哦哦,用 opacity 就可以啊,那还挺方便。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-1-13 17:25
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    4

    主题

    484

    回帖

    1626

    积分

    金牌会员

    Rank: 60Rank: 60Rank: 60Rank: 60Rank: 60Rank: 60

    多彩人生春风拂面

    发表于 2025-6-30 21:34 | 显示全部楼层
    webGL顶点着色器好厉害。
    第一次看到RGB三色要分开设定的,这样每个点都随机组合就有无数种颜色了。。
    const colors = new Float32Array(count * 3); 这个随机色的设定真是天才算法
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-1-13 17:25
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    4

    主题

    484

    回帖

    1626

    积分

    金牌会员

    Rank: 60Rank: 60Rank: 60Rank: 60Rank: 60Rank: 60

    多彩人生春风拂面

    发表于 2025-6-30 21:35 | 显示全部楼层
    头脑风暴持续中。。。接下来去瞅瞅是怎么炸的。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-6-30 21:35 | 显示全部楼层
    泡沫 发表于 2025-6-30 21:35
    头脑风暴持续中。。。接下来去瞅瞅是怎么炸的。。

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-1-13 17:25
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    4

    主题

    484

    回帖

    1626

    积分

    金牌会员

    Rank: 60Rank: 60Rank: 60Rank: 60Rank: 60Rank: 60

    多彩人生春风拂面

    发表于 2025-6-30 22:25 | 显示全部楼层

    翘太多课,看晕乎是正常滴
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-1-13 17:25
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    4

    主题

    484

    回帖

    1626

    积分

    金牌会员

    Rank: 60Rank: 60Rank: 60Rank: 60Rank: 60Rank: 60

    多彩人生春风拂面

    发表于 2025-6-30 22:25 | 显示全部楼层

    说明炸裂效果深入人心
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-7-1 20:13 | 显示全部楼层
    泡沫 发表于 2025-6-30 22:25
    说明炸裂效果深入人心

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2025-7-1 20:13 | 显示全部楼层
    泡沫 发表于 2025-6-30 22:25
    翘太多课,看晕乎是正常滴

    正常正常
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-1-13 17:25
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    4

    主题

    484

    回帖

    1626

    积分

    金牌会员

    Rank: 60Rank: 60Rank: 60Rank: 60Rank: 60Rank: 60

    多彩人生春风拂面

    发表于 2025-7-1 20:17 | 显示全部楼层

    小猪猪笑得欢快,深入人心这么开心
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-1-13 17:25
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    4

    主题

    484

    回帖

    1626

    积分

    金牌会员

    Rank: 60Rank: 60Rank: 60Rank: 60Rank: 60Rank: 60

    多彩人生春风拂面

    发表于 2025-7-1 20:18 | 显示全部楼层

    看到新效果了。。。天天都有更新换代。。。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2025-12-15 17:06 , Processed in 0.093540 second(s), 26 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表