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

Unity Shader TexelSize的意义

TexelSize在制作玻璃折射效果时会用到。

// Get the normal in tangent space
fixed3 bump = UnpackNormal(tex2D(_BumpMap, i.uv.zw));	// Compute the offset in tangent space
float2 offset = bump.xy * _Distortion * _RefractionTex_TexelSize.xy;
i.scrPos.xy = offset * i.scrPos.z + i.scrPos.xy;
fixed3 refrCol = tex2D(_RefractionTex, i.scrPos.xy/i.scrPos.w).rgb;

Shader代码中_RefractionTex是GrabPass获得的RenderTexture,_RefractionTex_TexelSize便是它的纹素大小。

下面字太多了,可能有人懒得看,我写个总结吧。
总结:TexelSize本身就是很小的值,因为它的公式是1/分辨率,在1080p下,结果就是(0.000052,0.000093)。如果不使用他那么在分辨率变化的时候视觉上的折射幅度不同,反之,如果使用它就可以保持在所有分辨率下效果的一致,保持一致的原因是它考虑了随着分辨率增大物体在屏幕中占比变小的情况,而变小的比例就是1/分辨率。如果不使用他就没有考虑这种情况,所以在物体占比变小时折射幅度却不会变小,看起来就像折射强度随着分辨率变化而变化。

bump.xy * _Distortion * _RefractionTex_TexelSize.xy的本意是法线的倾斜程度*扭曲值*纹素大小。其中_RefractionTex_TexelSize.xy,就是纹素的大小,也就是(1/宽度,1/高度)。为什么要乘这个值呢?想象一下当我们更改分辨率的时候,场景中的物体在屏幕上的大小是不会变化的,即使位置改变了,他们的比例也不会变化。假设有一根棒子,在放大分辨率的时候,棒子位置可能会变化,但他们的长度不会变化。棒子两端AB两点,在grabPass截取的渲染纹理中,AB两点在贴图的纹理坐标(UV坐标)会发生变化,但是他们的长度不会发生变化。假设棒子水平在贴图中还没有变化,那么它的长度就是n*1。假设是0.6纹理空间长度,A点坐标是(0.2,0.5),B点坐标是(0.8,0.5)。然后我扩大了窗口分辨率,比如分辨率从100x100变化到200x100,棒子在屏幕中的位置便会移动,这具体取决于你拖动的是窗口的哪一个边。假设我拖动右边的边往右边拖,那么有可能棒子位置到了中心附近。此时会发现棒子长度不变,但是在屏幕中的占比却变小了。原来占比0.6,现在拖动后AB点的纹理坐标位置变成了(0.3,0.5)(0.6,0.5).占比变成了0.3。棒子长度没变,变得是窗口的长度罢了。那么我们在制作屏幕的效果时就要考虑到这个占比的变化。如果不考虑的话,也就是bump.xy * _Distortion,那么在同一个点上无论分辨率如何变化,他们都是一个固定的值,假设就是折射的幅度(强度,或者说偏移)计算,在窗口分辨率变化前,bump.xy*1,只考虑水平,取bump.x为0.1,_Distortion为1,那么offset就是0.1,这个值是在纹理坐标空间使用的,那么这个辐射就占了木棒的1/6。而窗口变化后,木棒在纹理空间中只有0.3的长度,那这个0.1就变成了木棒的1/3,在视觉上这个折射在不同分辨率中的偏移距离明显是不同的。所以随着分辨率的更改辐射程度的表现是不同的。我们会发现,在分辨率变化时我们需要乘以木棒占比变小的比例才能等到正确的结果。例子中变小的比例是1/2。而这个比例我们要如何求得呢?其实就是占比变短了多少,假设木棍水平长度正好占满了纹理坐标空间,那么占比就是1,当分辨率变化,木棍的占比逐渐变小,而他变小的比例就是分辨率增长的比例。比如分辨率长度翻倍,那么木棍在空间中的占比就变成了1/2。也就是1/宽度,而这正是纹素的公式。纹素表示的是uv空间(纹理空间)中的每一格大小,但也可以看作单位大小被缩小了多少倍。以上就是为什么要乘以纹素大小的原因。
在不使用纹素大小也就是使用bump.xy * _Distortion的情况下,分辨率不改变的情况下显示效果并看着没有问题但其实数值已经不一定是我们以为的那个数值了,即使改变分辨率,折射的数值会发生变化,但是不仔细看也看不出来。折射看不出来,但其他效果的shader可能就能看出来了。要观察这种情况下的影响需要拖动窗口的某一边才能看到随着窗口宽窄高矮变化折射幅度逐渐发生变化。
而使用了纹素大小也就是使用bump.xy * _Distortion * _RefractionTex_TexelSize.xy的情况下,分辨率变化完全不会影响折射的幅度,拖动窗口的一条边也不会有变化。
 

相关文章:

Unity Shader TexelSize的意义

TexelSize在制作玻璃折射效果时会用到。 // Get the normal in tangent space fixed3 bump UnpackNormal(tex2D(_BumpMap, i.uv.zw)); // Compute the offset in tangent space float2 offset bump.xy * _Distortion * _RefractionTex_TexelSize.xy; i.scrPos.xy offset * i…...

三、STM32MP257系列之定制Yocto Machine

文章目录 STM32MP257系列之定制的Yocto Machine1. TFA 定制2. OPTEE OS定制3. Uboot 定制3.1 创建 board3.2 创建 board的头文件3.3 创建 board的配置文件3.4 添加我们自己的dtb文件3.5 生成新patch打包到uboot recipe中3.6 修改yocto中的配置 4. Kernel 定制4.1 定制设备树 5.…...

小程序信息收集(小迪网络安全笔记~

免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!!! 附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,…...

使用 Docker 搭建 Drogon 框架

使用 Docker 搭建 Drogon 框架 Drogon 是一个基于 C 的高性能 Web 框架,支持异步 I/O 和协程。使用 Docker 可以快速搭建 Drogon 开发环境,避免依赖冲突和配置问题。 以下是使用 Docker 搭建 Drogon 框架的详细步骤: 1. 准备工作 安装 Doc…...

【Linux报告】实训一:GNME桌面环境的设置及应用

实训一:GNME桌面环境的设置及应用 【练习1】在图形模式和文本模式下登录Linux系统。 1、开启Linux虚拟机。 答:打开此虚拟机如图所示 2、观察屏幕上显示的启动信息。 3、当系统启动到图形界面时,用普通用户身份登录。 答:如图…...

活动预告 |【Part1】Microsoft Azure 在线技术公开课:基础知识

课程介绍 参加“Azure 在线技术公开课:基础知识”活动,培养有助于创造新的技术可能性的技能并探索基础云概念。参加我们举办的本次免费培训活动,扩充自身的云模型和云服务类型知识。你还可以查看以计算、网络和存储为核心的 Azure 服务。 活…...

vulnhub靶场【Hogwarts】之bellatrix

前言 靶机:hotwarts-dobby,ip地址为192.168.1.69 攻击:kali,ip地址为192.168.1.16 都采用虚拟机,网卡为桥接模式 主机发现 使用arp-scan -l或netdiscover -r 192.168.1.1/24扫描发现主机 信息收集 使用nmap扫描端…...

移动 APP 设计规范参考

一、界面设计规范 布局原则: 内容优先:以内容为核心进行布局,突出用户需要的信息,简化页面导航,提升屏幕空间利用率.一致性:保持界面元素风格一致,包括颜色、字体、图标等,使用户在…...

HarmonyOS:@Require装饰器:校验构造传参

一、前言 Require是校验Prop、State、Provide、BuilderParam和普通变量(无状态装饰器修饰的变量)是否需要构造传参的一个装饰器。 说明 从API version 11开始对Prop/BuilderParam进行校验。 从API version 11开始,该装饰器支持在元服务中使用。 从API version 12开…...

github提交不上去,网络超时问题解决

问题出现的原因: DNS服务器数据不同步,github的服务器发送迁移,在本地缓存的ip地址现在无效了。 解决方案: 1)点击这里,查询github.com最新的ip地址 2.0)编辑linux系统地址缓存文件&#x…...

国产数据库OceanBase从入门到放弃教程

1. 介绍 是由蚂蚁集团(Ant Group,原蚂蚁金服)自主研发的分布式关系型数据库。它旨在解决海量数据存储和高并发访问的问题,特别适合金融级应用场景,如支付宝等对数据一致性、可靠性和性能有极高要求的服务。以下是关于…...

风力涡轮机缺陷检测数据集,91.4%准确识别率,18912张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注

风力涡轮机缺陷检测数据集,91.4%准确识别率,18912张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注 数据集下载: yolo v&#…...

Rabbitmq追问2

分析rabbitmq 默认使用姿势是什么 direct fanout还是什么 public void convertAndSend(String exchange, String routingKey, Object object, CorrelationData correlationData) throws AmqpException { this.send(exchange, routingKey, this.convertMessageIfNecessary(obje…...

郑州时空-TMS运输管理系统 GetDataBase 信息泄露漏洞复现

0x01 产品简介 郑州时空-TMS运输管理系统是一款专为物流运输企业设计的综合性管理软件,旨在提高运输效率、降低运输成本,并实现供应链的协同运作。系统基于现代计算机技术和物流管理方法,结合了郑州时空公司的专业经验和技术优势,为物流运输企业提供了一套高效、智能的运输…...

如何使用React,透传各类组件能力/属性?

在23年的时候,我主要使用的框架还是Vue,当时写了一篇“如何二次封装一个Vue3组件库?”的文章,里面涉及了一些如何使用Vue透传组件能力的方法。在我24年接触React之后,我发现这种扩展组件能力的方式有一个专门的术语&am…...

汇编点灯练习

要求: 1、轮流将LED1、LED2、LED3及蜂鸣器点亮 2、基于STM32MP157AAA,阅读原理图和STM32MP157芯片手册 3、ARM汇编指令点灯 1、运行效果 汇编点灯 2、通过查询原理图和芯片手册,得到以下结论: 3、汇编源码 .text .global _start…...

数据结构与算法之动态规划: LeetCode 213. 打家劫舍 II (Ts版)

打家劫舍 II https://leetcode.cn/problems/house-robber-ii/description/ 描述 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的同时&#…...

Git工具

安装教程 详细安装教程 基本命令...

SpringBoot3.3.3+shardingsphere-jdbc5.5.0读写分离、自定义生成主键策略

最近在开发项目搭建框架时,考虑后期支付模块的订单数据量可能会比较大,于是使用现在主流的shardingsphere的读写分离、水平分表来解决后期数据量大影响查询效率的问题。 项目技术栈:jdk17Springboot3.3.3shardingsphere-jdbc5.5.0mybatis-pl…...

开发运维基本功:无需复杂配置快速实现本地Nginx的公网远程访问

文章目录 前言1. 本地连接测试2. 飞牛云安装Cpolar3. 配置公网连接地址4. 飞牛云APP连接测试5. 固定APP远程地址6. 固定APP地址测试 前言 现在生活和工作中的各种设备都变得越来越智能,而数据存储的需求也随之剧增。想象一下:你正在外地出差&#xff0c…...

XCTF-web-easyupload

试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...