首页 文章 精选 留言 我的

精选列表

搜索[AI原生],共10000篇文章
优秀的个人博客,低调大师

MOSN v0.15.0 发布,云原生网络代理平台

MOSN 发布 V0.15.0 版本,具体变更如下: 我们很高兴的宣布MOSN v0.15.0发布,恭喜邓茜(@dengqian)成为 MOSN Committer,感谢她为 MOSN 社区所做的贡献。 以下是该版本的变更日志。 新功能 路由 Path Rewrite 支持按照正则表达式的方式配置 Rewrite 的内容@liangyuanpeng 配置新增字段: 扩展配置字段,可通过扩展配置字段自定义启动配置;Dubbo 服务发现配置通过扩展的配置字段实现@cch123 支持 DSL 新特性,可以方便的对请求的处理行为进行控制@wangfakang StreamFilter 新增流量镜像功能的扩展实现@champly Listener 配置新增对 UDP 的支持@dengqian 配置格式支持 Yaml 格式解析@GLYASAI 路由支持 HTTP 重定向配置@knight42 优化 支持 istio 的 stats filter,可以根据匹配条件进行 metrics 的个性化记录@wzshiming Metrics 配置支持配置 Histogram 的输出百分比@champly StreamFilter 新增状态用于直接中止请求,并且不响应客户端@taoyuanyuan XProtocol Hijack 响应支持携带 Body@champly Skywalking 升级到 0.5.0 版本arugal Upstream 连接 TLS 状态判断修改,支持通过 TLS 配置的 Hash 判断是否需要重新建立连接@nejisama 优化 DNS cache 逻辑,防止在 DNS 失效时可能引起的 DNS flood 问题@wangfakang Bug 修复 修复开启 TLS 加密场景下,XProtocol 协议在有多个协议的场景下判断协议错误的 BUG@nejisama 修复 AccessLog 中前缀匹配类型的变量不生效的 BUG@dengqian 修复 Listener 配置解析处理不正确的 BUG@nejisama 修复 Router/Cluster 在文件持久化配置类型中,Name 字段包含路径分隔符时会保存失败的 BUG@nejisama New Features Routing Path Rewrite supports configuring the content of Rewrite by regular expression@liangyuanpeng Configure new fields: Extended configuration fields, you can start the configuration by extending the configuration fields; Dubbo service discovery configuration via extended configuration fields@cch123 New DSL feature for easy control of request processing behavior@wangfakang Extended implementation of StreamFilter with new traffic mirroring function@champly Listener configuration adds UDP support@dengqian Configuration format support YAML format parsing@GLYASAI Routing support for HTTP redirect configuration@knight42 Optimization Istio's stats filter for personalizing metrics based on matching criteria@wzshiming Metrics configuration support to configure the output percentage of the Histogram@champly StreamFilter New state for aborting requests directly and not responding to clients@taoyuanyuan XProtocol hijack response support carry body@champly Apache SkyWalking upgrade to version 0.5.0arugal Upstream Connection TLS State Determination Modification to support the determination of whether a connection needs to be re-established via a TLS-configured Hash@nejisama Optimize DNS cache logic to prevent DNS flooding issues that can be caused when DNS fails@wangfakang MOSN简介 MOSN(Modular Observable Smart Network), 是一款采用 GoLang 开发的 Service Mesh 数据平面代理, 功能和定位类似Envoy,旨在提供分布式,模块化,可观察,智能化的代理能力。 MOSN 支持 Envoy 和Istio的 API,可以和 Istio 集成,。MOSN 初始版本由蚂蚁金服和阿里大文娱UC事业部携手贡献,期待社区一起来参与后续开发,共建一个开源精品项目。 核心能力 Istio集成 集成 Istio 1.0 版本与 V4 API,可基于全动态资源配置运行 核心转发 自包含的网络服务器 支持 TCP 代理 支持 TProxy 模式 多协议 支持 HTTP/1.1,HTTP/2 支持 SOFARPC 支持 Dubbo 协议(基于XProtocol支持) 核心路由 支持 Virtual Host 路由 支持 Headers/URL/Prefix 路由 支持基于 Host Metadata 的 Subset 路由 支持重试 后端管理&负载均衡 支持连接池 支持熔断 支持后端主动健康检查 支持 Random/RR 等负载策略 支持基于 Host Metadata 的 Subset 负载策略 可观察性 观察网络数据 观察协议数据 TLS 支持 HTTP/1.1 on TLS 支持 HTTP/2.0 on TLS 支持 SOFARPC on TLS 进程管理 支持平滑 reload 支持平滑升级 扩展能力 支持自定义私有协议 支持在 TCP IO 层,协议层面加入自定义扩展 Bug fixes Fix the bug that XProtocol protocols determine protocol errors in scenarios with multiple protocols when TLS encryption is enabled@nejisama Fix bug in AccessLog where variables of prefix match type don't work@dengqian Fix bug where Listener configuration parsing is not handled correctly@nejisama Fix Router/Cluster bug that fails to save when the Name field contains a path separator in the file persistence configuration type@nejisama

优秀的个人博客,低调大师

SOFAMosn v0.14.0 发布,云原生网络代理平台

我们很高兴地宣布MOSN v0.14.0发布,恭喜姚昌宇(@trainyao)成为 MOSN Committer,感谢他为 MOSN 社区所做的贡献。 以下是该版本的变更日志。 新功能 支持 Istio 1.5.X@wangfakang@trainyao@champly go-control-plane 升级到 0.9.4 版本 xDS 支持 ACK,新增 xDS 的 Metrics 支持 Istio sourceLabels 过滤功能 支持 pilot-agent 的探测接口 支持更多的启动参数,适配 Istio agent 启动场景 gzip、strict-dns、original-dst 支持 xDS 更新 移除 Xproxy 逻辑 Maglev 负载均衡算法支持@trainyao 新增连接池实现,用于支持消息类请求@cch123 新增 TLS 连接切换的 Metrics@nejisama 新增 HTTP StatusCode 的 Metrics@dengqian 新增 Metrics Admin API 输出@dengqian proxy 新增查询当前请求数的接口@zonghaishang 支持 HostRewrite Header@liangyuanpeng 优化 升级 tars 依赖,修复在高版本 Golang 下的编译问题@wangfakang xDS 配置解析升级适配 Istio 1.5.x@wangfakang 优化 proxy 的日志输出@wenxuwan DNS Cache 默认时间修改为 15s@wangfakang HTTP 参数路由匹配优化@wangfakang 升级 fasthttp 库@wangfakang 优化 Dubbo 请求转发编码@zonghaishang 支持 HTTP 的请求最大 body 可配置@wangfakang Bug 修复 修复 Dubbo Decode 无法解析 attachment 的 bug@champly 修复 HTTP2 连接建立之前就可能创建 stream 的 bug@dunjut 修复处理 HTTP2 处理 Trailer 空指针异常@taoyuanyuan 修复 HTTP 请求头默认不标准化处理的 bug@nejisama 修复 HTTP 请求处理时连接断开导致的 panic 异常@wangfakang 修复 dubbo registry 的读写锁拷贝问题@champly MOSN简介 MOSN(Modular Observable Smart Network), 是一款采用 GoLang 开发的 Service Mesh 数据平面代理, 功能和定位类似Envoy,旨在提供分布式,模块化,可观察,智能化的代理能力。 MOSN 支持 Envoy 和Istio的 API,可以和 Istio 集成,。MOSN 初始版本由蚂蚁金服和阿里大文娱UC事业部携手贡献,期待社区一起来参与后续开发,共建一个开源精品项目。 核心能力 Istio集成 集成 Istio 1.0 版本与 V4 API,可基于全动态资源配置运行 核心转发 自包含的网络服务器 支持 TCP 代理 支持 TProxy 模式 多协议 支持 HTTP/1.1,HTTP/2 支持 SOFARPC 支持 Dubbo 协议(基于XProtocol支持) 核心路由 支持 Virtual Host 路由 支持 Headers/URL/Prefix 路由 支持基于 Host Metadata 的 Subset 路由 支持重试 后端管理&负载均衡 支持连接池 支持熔断 支持后端主动健康检查 支持 Random/RR 等负载策略 支持基于 Host Metadata 的 Subset 负载策略 可观察性 观察网络数据 观察协议数据 TLS 支持 HTTP/1.1 on TLS 支持 HTTP/2.0 on TLS 支持 SOFARPC on TLS 进程管理 支持平滑 reload 支持平滑升级 扩展能力 支持自定义私有协议 支持在 TCP IO 层,协议层面加入自定义扩展

优秀的个人博客,低调大师

SOFAMosn v0.13.0 发布,云原生网络代理平台

MOSN v0.13.0 发布报告如下: 新功能 支持 Strict DNS Cluster@dengqian 支持 GZip 处理的 Stream Filter@wangfakang Dubbo 服务发现完成 Beta 版本@cch123 支持单机故障隔离的 Stream Filter@NeGnail 集成 Sentinel 限流能力@ansiz 优化 优化 EDF LB 的实现,使用 EDF 重新实现 WRR LB@CodingSinger 配置获取 ADMIN API 优化,新增 Features 和环境变量相关 ADMIN API@nejisama 更新 Host 时触发健康检查的更新从异步模式修改为同步模式@nejisama 更新了 Dubbo 库,优化了 Dubbo Decode 的性能@zonghaishang 优化 Metrics 在 Prometheus 中的输出,使用正则过滤非法的 Key@nejisama 优化 MOSN 的返回状态码@wangfakang Bug 修复 修复健康检查注册回调函数时的并发冲突问题@nejisama 修复配置持久化函数没有正确处理空配置的错误@nejisama 修复 ClusterName/RouterName 过长时,以文件形式 DUMP 会失败的问题@nejisama 修复获取 XProtocol 协议时,无法正确获取协议的问题@wangfakang 修复创建 StreamFilter 时,获取的 context 错误的问题@wangfakang MOSN简介 MOSN(Modular Observable Smart Network), 是一款采用 GoLang 开发的 Service Mesh 数据平面代理, 功能和定位类似Envoy,旨在提供分布式,模块化,可观察,智能化的代理能力。 MOSN 支持 Envoy 和Istio的 API,可以和 Istio 集成,。MOSN 初始版本由蚂蚁金服和阿里大文娱UC事业部携手贡献,期待社区一起来参与后续开发,共建一个开源精品项目。 核心能力 Istio集成 集成 Istio 1.0 版本与 V4 API,可基于全动态资源配置运行 核心转发 自包含的网络服务器 支持 TCP 代理 支持 TProxy 模式 多协议 支持 HTTP/1.1,HTTP/2 支持 SOFARPC 支持 Dubbo 协议(基于XProtocol支持) 核心路由 支持 Virtual Host 路由 支持 Headers/URL/Prefix 路由 支持基于 Host Metadata 的 Subset 路由 支持重试 后端管理&负载均衡 支持连接池 支持熔断 支持后端主动健康检查 支持 Random/RR 等负载策略 支持基于 Host Metadata 的 Subset 负载策略 可观察性 观察网络数据 观察协议数据 TLS 支持 HTTP/1.1 on TLS 支持 HTTP/2.0 on TLS 支持 SOFARPC on TLS 进程管理 支持平滑 reload 支持平滑升级 扩展能力 支持自定义私有协议 支持在 TCP IO 层,协议层面加入自定义扩展

优秀的个人博客,低调大师

SOFAMosn v0.12.0 发布,云原生网络代理平台

MOSN v0.12.0 发布报告如下: 新功能 支持 Skywalking@arugal Stream Filter 新增了一个 Receive Filter 执行的阶段,可在 MOSN 路由选择完 Host 以后,再次执行 Receive Filter@wangfakang HTTP2 支持流式@peacocktrain@taoyuanyuan FeatureGate 新增接口 KnownFeatures,可输出当前 FeatureGate 状态@nejisama 提供一种协议透明的方式获取请求资源(PATH、URI、ARG),对于资源的定义由各个协议自身定义@wangfakang 新增负载均衡算法 支持 ActiveRequest LB@CodingSinger 支持 WRR LB@nejisama 优化 XProtocol 协议引擎优化@neverhook 修改 XProtocol 心跳响应接口,支持协议的心跳响应可返回更多的信息 优化 connpool 的心跳触发,只有实现了心跳的协议才会发心跳 Dubbo 库依赖版本从 v1.5.0-rc1 更新到 v1.5.0@cch123 API 调整,HostInfo 新增健康检查相关的接口@wangfakang 熔断功能实现优化@wangfakang 负责均衡选择逻辑简化,同样地址的 Host 复用相同的健康检查标记@nejisama@cch123 优化 HTTP 建连逻辑,提升 HTTP 建立性能@wangfakang 日志轮转逻辑从写日志触发,调整为定时触发@nejisama typo 调整@xujianhai666@candyleer Bug 修复 修复 xDS 解析故障注入配置的错误@champly 修复 MOSN HTTP HEAD 方法导致的请求 Hold 问题@wangfakang 修复 XProtocol 引擎对于 StatusCode 映射缺失的问题@neverhook 修复 DirectReponse 触发重试的 BUG@taoyuanyuan MOSN简介 MOSN(Modular Observable Smart Network), 是一款采用 GoLang 开发的 Service Mesh 数据平面代理, 功能和定位类似Envoy,旨在提供分布式,模块化,可观察,智能化的代理能力。 MOSN 支持 Envoy 和Istio的 API,可以和 Istio 集成,。MOSN 初始版本由蚂蚁金服和阿里大文娱UC事业部携手贡献,期待社区一起来参与后续开发,共建一个开源精品项目。 核心能力 Istio集成 集成 Istio 1.0 版本与 V4 API,可基于全动态资源配置运行 核心转发 自包含的网络服务器 支持 TCP 代理 支持 TProxy 模式 多协议 支持 HTTP/1.1,HTTP/2 支持 SOFARPC 支持 Dubbo 协议(基于XProtocol支持) 核心路由 支持 Virtual Host 路由 支持 Headers/URL/Prefix 路由 支持基于 Host Metadata 的 Subset 路由 支持重试 后端管理&负载均衡 支持连接池 支持熔断 支持后端主动健康检查 支持 Random/RR 等负载策略 支持基于 Host Metadata 的 Subset 负载策略 可观察性 观察网络数据 观察协议数据 TLS 支持 HTTP/1.1 on TLS 支持 HTTP/2.0 on TLS 支持 SOFARPC on TLS 进程管理 支持平滑 reload 支持平滑升级 扩展能力 支持自定义私有协议 支持在 TCP IO 层,协议层面加入自定义扩展

优秀的个人博客,低调大师

原生js+WebGL实现3D图片效果

海外党玩F***book的时候可能有接触过这个酷炫的3d图片效果: 只要通过客户端的这个入口—— 或者网页版的这个入口—— 就能生成。不知道咋玩的请参考官方的帮助手册。今天就教大家手撸出一个这样的功能,不要担心,所有代码加起来不超过200行并且不使用任何第三方库。虽然canvas2D也能做出这个效果,但是基于这种像素级操作的性能考虑,WebGL显然是更好的方案,我前面的有些教程也用到了WebGL,核心的API我就不做过多介绍,直接详细地注释在最终的代码里面了,代码仍然使用WebGL 1.0版本。 老规矩,还是先介绍原理,推荐有想法的读者略过教程,自己直接根据原理去撸出来,因为我还是秉持着话痨的特色,想到什么说什么,教程中掺杂一些自己的干货,对一些人来说可能过于啰嗦。夹,哈吉咩马修!(工地日语 非死不可客户端在上传图片的时候你有两种可选操作: 一种是上传带深度通道的图片,即图片的每个像素是RGB-D格式,如果你是苹果手机可能在相机里会有人像模式或景深模式,拍出来的照片在本地是heic格式的文件,一般这种就是带深度信息的(有兴趣的可以去维基了解下这种heif编码的图片,可以做到很多神奇的事)。通常有TOF镜头的手机都能拍出这种图片,但是不知道为啥F***book似乎只支持三星系列和自己发布的安卓机? 另一种办法就是上传两张图,一张普通的RGB像素的原图,一张灰度图,只要灰度图的文件名和原图一样,加上_depth的后缀即可。比如666.jpg和666_depth.jpg。这也是F***book网页版唯一支持的方式。这个灰度图的门道可就多了,也是我们后面代码实现的核心。开发过游戏的一定知道深度贴图,或者阴影贴图/光照贴图,其实都是类似的玩意,这种贴图存储了原图每个像素的深度信息,贴图的每个像素的R值就是原图的z轴偏移,因为一般深度贴图的R、G、B通道的值相同,所以表现出来的就是一张灰度图。 如何获取深度贴图呢?如果你有heic格式的带深度信息的照片,可以用PS抽取出z通道的信息(windows上的PS不支持),如果你啥都没有,我会在下个教程尝试“教”你一下如何在PS中绘制出深度贴图,或者使用谷歌提供的一个人工智能程序来生成,我也会写入下个教程,亲测匹配程度还是挺高的~ 具体是怎么产生3D效果的呢?深度贴图中,颜色越浅(值越小)表示深度约低,通过深度贴图的深度值来对原图的采样位置进行偏移,比如当你把贴图往左偏移,然后使用偏移的距离乘上原图的某个坐标在贴图上的深度值得到的结果来对原图进行采样,就会得到不同的点在不同的深度偏移的大小不同的情况,距离越近的偏移越小,距离越远的偏移越大,是不是很符合我们生活中的常识?事实上,抛弃主观感知,从底层角度考虑,最终展现出来的效果其实就是一部分的像素点被压缩了,一部分的像素点被拉伸了。不知道大家有没有用过live2D或者Spine、龙骨等工具做出来的动画,就是这种: 刚刚所说的底层变化是不是和这种网格动画很像,其实都是对图片的变形来达到3D效果,就单张图的变化而言,他们的唯一区别就是蒙皮动画是手动key帧(或者是骨骼绑定——这个以后有机会谈谈),而3D图片是通过深度贴图自动生成。 废话终于说完,下面开始编码,先设置一下基础样式: * { margin: 0; padding: 0; } body { width: 100vw; height: 100vh; position: relative; background-color: #000; } canvas { position: absolute; left: 50%; top: 50%; transform: translate3d(-50%, -50%, 0); } 然后引入glMatrix函数库用于操作矩阵(虽然,之前说好的不依赖第三方库,不过坐标换算确实挺烦~免得程序太长还有写一堆注释~其实换算也不难,看过上一篇教程的应该自己实现问题也不大~~原谅我标题党 ಠᴗಠ) <script src="./gl-matrix-min.js"></script> 我已经下载好了,想要消息了解这个函数库的可以去glMatrix官网,这个库非常小,未压缩前也就100多K。 顶点着色器(shader_vertex.vert)的代码: attribute vec2 a_pos; attribute vec2 a_uv; uniform mat4 u_proj; varying vec2 v_uv; void main() { v_uv = a_uv; // 将纹理坐标传递到片元着色器 gl_Position = u_proj * vec4(a_pos, 0.0, 1.0); } 片元着色器的代码: precision highp float; uniform sampler2D u_sampler; varying vec2 v_uv; void main() { gl_FragColor = texture2D(u_sampler, v_uv); } 直接贴上绘制静态图的代码: init() async function init () { const { mat4 } = glMatrix const PAGE_WIDTH = document.body.clientWidth const PAGE_HEIGHT = document.body.clientHeight // 设置画布宽高 const CANVAS_WIDTH = 900 const CANVAS_HEIGHT = 900 const canvas = document.createElement('canvas') canvas.width = CANVAS_WIDTH canvas.height = CANVAS_HEIGHT document.body.appendChild(canvas) const gl = canvas.getContext('webgl') gl.viewport(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT) // 加载图片(原图和深度图尺寸一致) const image = new Image() image.src = './sennpai.jpg' await new Promise(resolve => image.complete ? resolve() : (image.onload = e => resolve())) // 若图片宽高超出限制,以类似 background-size:contain 的方式将图片缩放居中 let ratio = 1 if (image.height > CANVAS_HEIGHT) { ratio = CANVAS_HEIGHT / image.height } if (image.width * ratio > CANVAS_WIDTH) { ratio = CANVAS_WIDTH / image.width } const imgWidth = image.width * ratio const imgHeight = image.height * ratio // 获取顶点着色器源码 let res = await fetch('./shader_vertex.vert', { method: 'get', }) let shaderSrc = await res.text() // 创建顶点着色器 const vs = gl.createShader(gl.VERTEX_SHADER) gl.shaderSource(vs, shaderSrc) gl.compileShader(vs) // 获取着色器信息 if (!gl.getShaderParameter(vs, gl.COMPILE_STATUS)) { // 打印编译失败日志 console.error(`Error compile shader:\n${shaderSrc}\n=====error log======\n${gl.getShaderInfoLog(vs)}`) gl.deleteShader(vs) return null } // 获取片元着色器源码 res = await fetch('./shader_fragment.frag', { method: 'get', }) shaderSrc = await res.text() // 创建片元着色器 const fs = gl.createShader(gl.FRAGMENT_SHADER) gl.shaderSource(fs, shaderSrc) gl.compileShader(fs) if (!gl.getShaderParameter(fs, gl.COMPILE_STATUS)) { console.error(`Error compile shader:\n${shaderSrc}\n=====error log======\n${gl.getShaderInfoLog(fs)}`) gl.deleteShader(fs) return null } // 创建program const prg = gl.createProgram() gl.attachShader(prg, vs) gl.attachShader(prg, fs) gl.linkProgram(prg) gl.useProgram(prg) // 设置投影矩阵 const projMat4 = mat4.create() /** * ortho(out, left, right, bottom, top, near, far) */ mat4.ortho(projMat4, -CANVAS_WIDTH / 2, CANVAS_WIDTH / 2, -CANVAS_HEIGHT / 2, CANVAS_HEIGHT / 2, 0, 500) // 获取投影矩阵的地址 const uProj = gl.getUniformLocation(prg, 'u_proj') // 将投影矩阵传入 gl.uniformMatrix4fv(uProj, false, projMat4) // 使用顶点数组创建vbo const vertexList = new Float32Array([ // x y u v -imgWidth / 2, imgHeight / 2, 0, 0, -imgWidth / 2, -imgHeight / 2, 0, 1, imgWidth / 2, imgHeight / 2, 1, 0, imgWidth / 2, -imgHeight / 2, 1, 1, ]) // 获取数组每个元素的大小(用于计算步长) const PER_ELEMENT_SIZE = vertexList.BYTES_PER_ELEMENT const buffer = gl.createBuffer() /** * 绑定缓冲区 * @param target 数据类型 * @param buffer 缓冲区对象 */ gl.bindBuffer(gl.ARRAY_BUFFER, buffer) /** * 向缓冲区写入数据 * @param target 数据类型 * @param data 数据(这里是类型化数组) * @param usage 绘制方式(用于帮助webgl优化) */ gl.bufferData(gl.ARRAY_BUFFER, vertexList, gl.STATIC_DRAW) // 获取顶点坐标变量在着色器中的地址 const aPos = gl.getAttribLocation(prg, 'a_pos') /** * 将缓冲区对象分配给attribute变量 * @param location:变量的存储地址 * @param size:每个顶点分量个数,若个数比变量的数量少,则按照gl.vertexAttrib[1234]f的规则来补全 * @param type:指定数据类型 * @param normalized:是否需要归一化 * @param stride:相邻两个顶点之间的字节数(只有一种数据则为0) * @param offset:数据的偏移量(单位字节,只有一种数据则为0) */ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, PER_ELEMENT_SIZE * 4, 0) // 允许aPos访问VBO gl.enableVertexAttribArray(aPos) // 获取纹理坐标变量在着色器中的地址 const aUV = gl.getAttribLocation(prg, 'a_uv') gl.vertexAttribPointer(aUV, 2, gl.FLOAT, false, PER_ELEMENT_SIZE * 4, PER_ELEMENT_SIZE * 2) // 允许aUV访问VBO gl.enableVertexAttribArray(aUV) // 使用完后解绑VBO gl.bindBuffer(gl.ARRAY_BUFFER, null) // 创建纹理对象 const texture = gl.createTexture() // 激活0号纹理单元 gl.activeTexture(gl.TEXTURE0) // 绑定并开启0号纹理单元 gl.bindTexture(gl.TEXTURE_2D, texture) // 指定缩小算法 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) // 指定放大算法 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) // 指定水平方向填充算法 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) // 指定垂直方向填充算法 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) /** * 通过0号纹理单元将图片分配给纹理对象 * target 指定为2D纹理 * level 金字塔纹理 * internalFormat 图片内部格式 * format 纹理格式(必须与internalFormat相同) * type 纹理数据类型 * image 图片 */ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image) // 获取纹理对象在着色器中的地址(使用uniform,因为每个顶点操作的都是同一个纹理) const uSampler = gl.getUniformLocation(prg, 'u_sampler') // 指定从0号纹理单元获取纹理 gl.uniform1i(uSampler, 0) // 渲染循环 function loop () { gl.clearColor(0.0, 0.0, 0.0, 1.0) gl.clear(gl.COLOR_BUFFER_BIT) // 清空颜色缓冲区 gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4) requestAnimationFrame(loop) } loop() } 都是一些常规的操作,具体api的作用写入注释里就不做多解释了。 接下来把我们的深度贴图传入着色器,主要是这几个步骤: ①获取加载完成的图片对象: const depthImage = new Image() depthImage.src = './sennpai_depth.jpg' await new Promise(resolve => depthImage.complete ? resolve() : (depthImage.onload = e => resolve())) 因为如果浏览器如果已经缓存了图片不一定会触发onload事件。所以我们先通过complete属性来判断图片的加载状态是否为已完成。 ②修改片元着色器代码,通过深度贴图对原图来进行采样: precision highp float; uniform sampler2D u_sampler; uniform sampler2D u_sampler_depth;// 深度贴图采样器 uniform vec2 u_offset;// 深度贴图的偏移 varying vec2 v_uv; void main() { float depth = texture2D(u_sampler_depth, v_uv).r;// 获取深度信息 gl_FragColor = texture2D(u_sampler, v_uv + depth * u_offset); } 获取贴图的R通道的值作为深度值 ③通过另一个纹理单元(如1号纹理单元)将贴图传入片元着色器: // 同理,创建深度贴图的纹理 const depthTexture = gl.createTexture() // 绑定并开启1号纹理单元 gl.activeTexture(gl.TEXTURE1) gl.bindTexture(gl.TEXTURE_2D, depthTexture) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, depthImage) const uSamplerDepth = gl.getUniformLocation(prg, 'u_sampler_depth') // 指定从1号纹理单元获取纹理 gl.uniform1i(uSamplerDepth, 1) 这时候看到最后效果没有任何变化,因为我们还没有对贴图进行偏移,u_offset默认值是vec(0.0,0.0)。 接下来可以给页面绑定mousemove事件,我这里限定了u,v最大的偏移量为0.05,把渲染循环函数放到事件回调中: const uOffset = gl.getUniformLocation(prg, 'u_offset') const scale = 0.1 document.body.onmousemove = e => { gl.uniform2f(uOffset, scale * (e.pageX / PAGE_WIDTH - 0.5), scale * (e.pageY / PAGE_HEIGHT - 0.5)) loop() } // 绘制循环 function loop () { gl.clearColor(0.0, 0.0, 0.0, 1.0) gl.clear(gl.COLOR_BUFFER_BIT) // 清空颜色缓冲区 gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4) // requestAnimationFrame(loop) } ok,大功告成,预览一下效果图—— 完整代码戳这里 在线演示

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册