当前位置: 首页 > news >正文

Cocos Creator 3.8 修改纹理像素值

修改的代码:

import { _decorator, Component, RenderTexture, Sprite, Texture2D, ImageAsset, SpriteFrame, Vec2, gfx, director, log, math, v2 } from 'cc';const { ccclass, property } = _decorator;@ccclass('GradientTransparency')
export class GradientTransparency extends Component {public readPixels (texture:Texture2D, x = 0, y = 0, width?: number, height?: number) : Uint8Array | null {log('width:', width, ' height:', height);width = width || texture.width;height = width || texture.height;log('texture:', texture);const gfxTexture = texture.getGFXTexture();if (!gfxTexture) {return null;}const bufferViews: ArrayBufferView[] = [];const regions: gfx.BufferTextureCopy[] = [];const region0 = new gfx.BufferTextureCopy();region0.texOffset.x = x;region0.texOffset.y = y;region0.texExtent.width = width;region0.texExtent.height = height;regions.push(region0);const buffer = new Uint8Array(width * height * 4);bufferViews.push(buffer);director.root?.device.copyTextureToBuffers(gfxTexture, bufferViews, regions)return buffer;}public smoothstep(edge0: number, edge1: number, x: number): number {// 将 x 限制在 [edge0, edge1] 范围内//const t = Math.max(0, Math.min(1, (x - edge0) / (edge1 - edge0)));const t = Math.min(Math.max((x - edge0) / (edge1 - edge0), 0.0), 1.0);// 使用三次 Hermite 插值return t * t * (3 - 2 * t);}/*** 修改 Sprite 的透明度* @param sprite 目标 Sprite* @param points 给定的圆心点(UV 坐标,范围 [0, 1])* @param radius1 第一个透明度分界点的半径(完全透明半径)* @param radius2 第二个透明度分界点的半径(渐变透明半径)*/modifySpriteAlpha(sprite: Sprite, points: Vec2[], radius1: number, radius2: number) {const spriteFrame = sprite.spriteFrame;if (!spriteFrame) {console.error("SpriteFrame 不存在!");return;}const texture = spriteFrame.texture;if (!texture) {console.error("Texture 不存在!");return;}// 创建 RenderTextureconst renderTexture = new RenderTexture();renderTexture.reset({width: spriteFrame.width,height: spriteFrame.height,});// 获取像素数据log('spriteFrame:', spriteFrame);const pixels = this.readPixels(spriteFrame.texture as Texture2D, 0, 0, spriteFrame.width, spriteFrame.height);log('pixels:', pixels);const width = spriteFrame.width;const height = spriteFrame.height;// 最大不透明度const maxAlpha = 200;// 遍历每个像素for (let y = 0; y < height; y++) {for (let x = 0; x < width; x++) {const index = (y * width + x) * 4; // 每个像素的起始索引let alpha = pixels[index + 3]; // 当前像素的 alpha 通道// 将像素点转换为 UV 坐标const uv = new Vec2(x / width, y / height);// 计算与每个点的距离并修改透明度points.forEach(point => {const distance = uv.clone().subtract(point).multiply(v2(width, height)).length(); // 距离(按像素计算)//let realPoint = v2(point.x * width, point.y * height);//const distance = Vec2.distance(realPoint, v2(x, y));if (distance < radius1) {alpha = 0; // 完全透明} else if (distance >= radius1 && distance < radius2) {//alpha = alpha = this.smoothstep(radius1, radius2, distance) * maxAlpha;/*const t = (distance - radius1) / (radius2 - radius1); // 计算线性插值const calculatedAlpha = (1 - t) * maxAlpha; // 渐变透明alpha = Math.min(alpha, calculatedAlpha); // 重叠透明度处理,叠加上限为 128*/} else {alpha = Math.min(alpha, maxAlpha); // 超出范围,保持不透明度为 128}});pixels[index + 3] = 255 - alpha; // 更新 alpha 通道}}// 创建新的 ImageAssetconst newImageAsset = new ImageAsset();newImageAsset.reset({_data: pixels,_compressed: false,width: width,height: height,format: Texture2D.PixelFormat.RGBA8888,});// 创建新的 Texture2Dconst newTexture = new Texture2D();newTexture.image = newImageAsset;// 创建新的 SpriteFrameconst newSpriteFrame = new SpriteFrame();newSpriteFrame.texture = newTexture;// 应用新的 SpriteFramesprite.spriteFrame = newSpriteFrame;}
}

调用的代码:

import { _decorator, Component, Sprite, Vec2 } from "cc";
import { GradientTransparency } from "./fogImplement";const { ccclass, property } = _decorator;@ccclass('MainController')
export class MainController extends Component {@property(Sprite)targetSprite: Sprite = null; // 拖入目标 SpriteonLoad() {}onClick(){const gradientTransparency = this.getComponent(GradientTransparency);if (gradientTransparency && this.targetSprite) {// 设置两个 UV 坐标点const points = [new Vec2(0.5, 0.5)];  //, new Vec2(0.7, 0.7)const radius1 = 100; // 第一个分界点(完全透明)const radius2 = 200; // 第二个分界点(渐变透明)gradientTransparency.modifySpriteAlpha(this.targetSprite, points, radius1, radius2);}}
}

相关文章:

Cocos Creator 3.8 修改纹理像素值

修改的代码&#xff1a; import { _decorator, Component, RenderTexture, Sprite, Texture2D, ImageAsset, SpriteFrame, Vec2, gfx, director, log, math, v2 } from cc;const { ccclass, property } _decorator;ccclass(GradientTransparency) export class GradientTrans…...

如何评价deepseek-V3 VS OpenAI o1 自然语言处理成Sql的能力

DeepSeek-V3 介绍 在目前大模型主流榜单中&#xff0c;DeepSeek-V3 在开源模型中位列榜首&#xff0c;与世界上最先进的闭源模型不分伯仲。 准备工作&#xff1a; 笔者只演示实例o1 VS DeepSeek-V3两个模型&#xff0c;大家可以自行验证结果或者实验更多场景&#xff0c;同时…...

SQL左连接的两种不同情况示例和外连接示例

Oracle&#xff1b;有2个表如下&#xff1b; 执行下图选中的左连接&#xff1b; 左表10条记录&#xff0c;右表3条记录&#xff0c;结果是10条记录&#xff1b; 执行下图的左连接&#xff0c; 老师表为左表&#xff0c;学生表为右表&#xff0c;结果会显示每个老师&#xff0c…...

【渗透测试术语总结】

Top 渗透测试常用专业术语 相信大家和我一样&#xff0c;搞不清这些专业名词的区别&#xff0c;所以我来整理一下。 1. POC、EXP、Payload与Shellcode POC&#xff1a;全称 Proof of Concept &#xff0c;中文 概念验证 &#xff0c;常指一段漏洞证明的代码。 EXP&#xf…...

Unity2D初级背包设计后篇 拓展举例与不足分析

Unity2D初级背包设计中篇 MVC分层撰写(万字详解)-CSDN博客、 如果你已经搞懂了中篇&#xff0c;那么对这个背包的拓展将极为简单&#xff0c;我就在这里举个例子吧 目录 1.添加物品描述信息 2.拓展思路与不足分析 1.没有删除只有丢弃功能&#xff0c;所以可以添加垃圾桶 2.格…...

Kafka优势剖析-幂等性和事务

目录 1. 幂等性&#xff08;Idempotence&#xff09; 1.1 什么是幂等性&#xff1f; 1.2 幂等性的实现 1.2.1 生产者 ID 和序列号 1.2.2 重复消息检测 1.2.3 幂等性的优势 1.3 幂等性的配置 2. 事务支持&#xff08;Transactions&#xff09; 2.1 什么是事务支持&…...

MyBatis深入了解

目录 xml 映射文件中&#xff0c;除了常见的select、insert、update、delete 标签之外&#xff0c;还有哪些标签? Dao 接口的工作原理是什么?Dao 接口里的方法&#xff0c;参数不同时&#xff0c;方法能重载吗? MyBatis 是如何进行分页的?分页插件的原理是什么? 简述 …...

语音技术与人工智能:智能语音交互的多场景应用探索

引言 近年来&#xff0c;智能语音技术取得了飞速发展&#xff0c;逐渐渗透到日常生活和各行各业中。从语音助手到智能家居控制&#xff0c;再到企业客服和教育辅导&#xff0c;语音交互正以前所未有的速度改变着人机沟通的方式。这一变革背后&#xff0c;人工智能技术无疑是关键…...

Openwrt @ rk3568平台 固件编译实践(二)- ledeWRT版本

目录 ledeWRT介绍固件编译下载代码修改feed源更新并安装编译第三方软件包制作用于eMMC烧写的rootfs基于lede发行版验证烧写rk3568.img, LEDE wrt启动成功refhttps://blog.csdn.net/zc21463071/article/details/106751361介绍rk3568平台下, lede 大神版 openwrt固件的下载、编译…...

Windows下调试Dify相关组件(1)--前端Web

1. 什么是Dify? 官方介绍&#xff1a;Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务&#xff08;Backend as Service&#xff09;和 LLMOps 的理念&#xff0c;使开发者可以快速搭建生产级的生成式 AI 应用。 这是个组件式框架&#xff0c;即使是非技…...

对话|企业如何构建更完善的容器供应链安全防护体系

对话&#xff5c;企业如何构建更完善的容器供应链安全防护体系 云布道师 随着云计算和 DevOps 的兴起&#xff0c;容器技术和自动化成为软件开发中的必要手段&#xff0c;软件供应链也进入了自动化及 CI/CD 阶段。然而&#xff0c;容器技术和自动化虽然提升了软件的更新速度&…...

HTML5 缩放动画(Zoom In/Out)详解

HTML5 缩放动画&#xff08;Zoom In/Out&#xff09;详解 缩放动画是一种常见的视觉效果&#xff0c;用于使网页元素逐渐放大或缩小&#xff0c;从而吸引用户的注意力。下面将介绍如何使用 CSS 和 JavaScript 实现这种动画效果。 1. 使用 CSS 实现缩放动画 可以通过 CSS 的 …...

C语言——文件IO 【文件IO和标准IO区别,操作文件IO】open,write,read,dup2,access,stat

1.思维导图 2.练习 1&#xff1a;使用C语言编写一个简易的界面&#xff0c;界面如下 1&#xff1a;标准输出流 2&#xff1a;标准错误流 3&#xff1a;文件流 要求&#xff1a;按1的时候&#xff0c;通过printf输出数据&#xff0c;按2的时候&#xff0c;通过p…...

【C++习题】22.随机链表的复制

文章目录 题目&#xff1a;138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09;代码&#xff1a; 题目&#xff1a;138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 链接&#x1f517;&#xff1a;138. 随机链表的复制 - 力扣&#xff08;LeetCode&…...

备考蓝桥杯:数据结构概念浅谈

目录 1数据结构的概念 什么是数据结构: 为什么要有数据结构 2.数据结构的三个组成要素 1.逻辑结构 2.存储结构 3.数据运算 3。算法好坏的度量&#xff08;时间复杂度和空间复杂度&#xff09; 时间复杂度计算 最优和平均和最差时间复杂度 计算时间复杂度例子 空间复…...

【TI毫米波雷达】DCA1000不使用mmWave Studio的数据采集方法,以及自动化实时数据采集

【TI毫米波雷达】DCA1000不使用mmWave Studio的数据采集方法&#xff0c;以及自动化实时数据采集 mmWave Studio提供的功能完全够用了 不用去纠结用DCA1000低延迟、无GUI传数据 速度最快又保证算力无非就是就是Linux板自己写驱动做串口和UDP 做雷达产品应用也不会采用DCA1000的…...

创建型模式3.建造者模式

创建型模式 工厂方法模式&#xff08;Factory Method Pattern&#xff09;抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;建造者模式&#xff08;Builder Pattern&#xff09;原型模式&#xff08;Prototype Pattern&#xff09;单例模式&#xff08;Singleto…...

【集成学习】Boosting算法详解

文章目录 1. 集成学习概述2. Boosting算法详解3. Gradient Boosting算法详解3.1 基本思想3.2 公式推导 4. Python实现 1. 集成学习概述 集成学习&#xff08;Ensemble Learning&#xff09;是一种通过结合多个模型的预测结果来提高整体预测性能的技术。相比于单个模型&#xf…...

【Orca】Orca - Graphlet 和 Orbit 计数算法

Orca&#xff08;ORbit Counting Algorithm&#xff09;是一种用于对网络中的小图进行计数的有效算法。它计算网络中每个节点的节点和边缘轨道&#xff08;4 节点和 5 节点小图&#xff09;。 orca是一个用于图形网络分析的工具&#xff0c;主要用于计算图中的 graphlets&#…...

58. Three.js案例-创建一个带有红蓝配置的半球光源的场景

58. Three.js案例-创建一个带有红蓝配置的半球光源的场景 实现效果 本案例展示了如何使用Three.js创建一个带有红蓝配置的半球光源的场景&#xff0c;并在其中添加一个旋转的球体。通过设置不同的光照参数&#xff0c;可以观察到球体表面材质的变化。 知识点 WebGLRenderer …...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...