Shader踩坑笔记UV操作

news2024/12/22 19:43:35

一、UV坐标范围0-1

// 坐标范围 0-1,原点在画布左下角
vec2 uv = FRAGCOORD.xy / iResolution.xy;

有两个变量

1、FRAGCOORD是godot引擎自带的变量表示纹理坐标

2、iResolution我自定义的变量,输入画布尺寸

使用uniform关键词可以创建自定义变量

比如uniform vec3      iResolution;

 

二、UV坐标范围-0.5~0.5

//坐标范围-0.5,0.5,原点在画布中心
vec2 uv = (FRAGCOORD.xy - 0.5 * iResolution.xy) / iResolution.y;

当然也可以使用如下代码:

vec2 uv = FRAGCOORD.xy / iResolution.xy - 0.5;

 因为0~1减去0.5就是-0.5~0.5

三、UV移动

通过加减运算可以移动UV

uv = uv + vec2(1.0, 0.0);

//或者单独对x进行移动
uv.x = uv.x + 1.0;

这样图像也会跟着移动

四、UV缩放

通过乘除运算可以缩放UV

uv = uv * vec2(1.0, 0.0);
uv = uv / vec2(1.0, 0.0);

//或者单独对x进行缩放
uv.x = uv.x * 1.0;
uv.x = uv.x / 1.0;

五、UV旋转

vec2 customRotator(vec2 UVs,vec2 RotationCenter,float RotationAngle){
    //自定义旋转
    //RotationAngle为旋转输入0-1个值。值为1等于360度转弯。
    //RotationCenter输入一个数字作为旋转中心点。
    //UVs插入uv,世界坐标或其他值来旋转。
    vec2 _uv = UVs + RotationCenter * -1.0;
    float angle_cos = cos(RotationAngle);
    float angle_sin = sin(RotationAngle);
    vec2 _a = vec2(angle_cos, angle_sin * -1.0);
    vec2 _b = vec2(angle_sin, angle_cos);

    return vec2(dot(_uv, _a), dot(_uv, _b)) + RotationCenter;
}

这个函数我参考UE4引擎的算法,可以对UV进行旋转

六、UV复制

原理:

0~1的UV乘以一个数n,变成0~n

然后向下取整,所以得到了多个整数,比如2

那么2~3的部分减去2就变成了0~1,所以就还原了之前的uv

uv.x *= 2.;
vec2 id = floor(uv);
vec2 uv2 = uv - id;

 七、UV复制并取反

这里只是x方向操作,y方向不动。

原理:

保存y方向的值,只对x方向进行操作最后需要加上y方向。

上面六介绍了uv复制的原理

使用step函数替代if操作可以更好发挥GPU的计算优势

用1减的方法反转结果

 

// 坐标范围 0-1,原点在画布左下角
vec2 uv = FRAGCOORD.xy / iResolution.xy;
//不管后续如何计算Y方向是不变的
float y = uv.y;

//UV复制方法针对X方向进行复制得到uv2
uv.x *= 2.;
vec2 id = floor(uv);
vec2 uv2 = uv - id;
    
//创建左右两边uv,得到遮罩
vec2 _uv_left = step(uv,vec2(1.0,0.0));
vec2 _uv_right = _uv_left;
_uv_right.x = 1.-_uv_right.x;
    
//乘以遮罩会剔除不需要的部分
_uv_left = uv2 * _uv_left;
    
//反转uv的X方向
uv2.x = 1.- uv2.x;
_uv_right = uv2 * _uv_right;
    
//最后对两个uv进行合并
uv = _uv_left + _uv_right;
uv.y = y;
uv.x = 1. - uv.x;
uv.x = uv.x + offset;//offset为自定义变量控制位置

//确保图片不会有多余无用的像素
if (any(greaterThan(abs(uv - 0.5), vec2(0.5)))) discard;
//COLOR = texture(TEXTURE, uv);
COLOR = vec4(uv, 0.0, 1.0);

 其中_uv_left和_uv_right的图片为上图

相加以后在叠加Y方向本来的值就得到了想要的效果,假如你有一张半边蝴蝶翅膀,可以复制出来一个完整的蝴蝶

 

 

八、UV棋盘格

待续

九、UV旋转矩阵

待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/164571.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

戴尔电脑怎么录屏?这6个方法教你轻松录屏

无论您是需要录制屏幕活动以创建在线发布的演示文稿、录制网络研讨会的屏幕以供日后参考,还是出于任何其他原因——如果您使用的是戴尔或类似 PC,您有多种选择。那么,让我们来谈谈如何在戴尔笔记本电脑上进行屏幕记录。 在戴尔笔记本电脑上录…

机器人介绍、应用、前景

机器人介绍、应用、前景1 介绍1.1 定义1.2 作用1.3 发展历程1.4 分类1.5 三大顾虑1.6 前景2 种类工业机器臂协作机械臂工业移动机器人复合机器人扫地机器人服务机器人机器狗人形机器人无人机3 技术3.1 机器人学分类3.2 功能分类3.2.1 感知3.2.2 决策3.2.3 执行AGV减震机构减速机…

经典问题:Python实现生产者消费者模式的多线程爬虫

Python实现生产者消费者模式的多线程爬虫1. 多组件的Pipeline技术架构2. 生产者消费者爬虫的架构3.多线程数据通信的queue.Queue4. 代码编写实现生产者消费者爬虫1. 多组件的Pipeline技术架构 复杂的事情一般都不会一下子做完,而是会分很多中间步骤一步步完成。 …

二十七、Kubernetes中DaemonSet(DS)控制器详解

1、概述 在kubernetes中,有很多类型的pod控制器,每种都有自己的适合的场景,常见的有下面这些: ReplicationController:比较原始的pod控制器,已经被废弃,由ReplicaSet替代 ReplicaSet&#xff…

LeetCode题目笔记——2293. 极大极小游戏

文章目录题目描述题目难度——简单方法一:模拟代码/Python方法二:优化本地修改代码/python代码/C总结题目描述 给你一个下标从 0 开始的整数数组 nums ,其长度是 2 的幂。 对 nums 执行下述算法: 设 n 等于 nums 的长度&#x…

理论——加密法

前言写C写多了,给大伙换换口味,这篇文章将会给大家带来几种加密法,以后写情书有素材了吧?还不快谢谢我~正文凯撒加密法简介在密码学中,恺撒密码是一种最简单且最广为人知的加密技术。它是一种替换加密的技术&#xff0…

因果推断6--多任务学习(个人笔记)

目录 1多任务学习 1.1问题描述 1.2数据集 1.3网络结构 1.4结果 2因果推断使用多任务方式 2.1DRNet 2.2Dragonet 2.3Deep counterfactual networks with propensity-dropout 2.4VCNet 3思考 1多任务学习 keras-mmoe/census_income_demo.py at master drawbridge/ke…

一种穷人式的内存泄露检测方式

对于检测程序代码中的资源泄露问题,市面上已经有很多工具了,但是今天我再来介绍一种新的方式,这种方式不需要安装任何工具或者特定的编译器开关,也不需要第三方库。 那就是:一直保持程序运行,直到泄露的原因…

【牛客网】HJ99 自守数、OR86 返回小于 N 的质数个数

作者:一个喜欢猫咪的的程序员 专栏:《Leetcode》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 目录 HJ99 自守数 OR86 返回小于 N 的质数个数 HJ99 自守数 自守数_牛客…

Linux系统之安装Linux管理工具inpanel

Linux系统之安装Linux管理工具inpanel一、inpanel介绍1.inpanel简介2.inpanel特点二、检查本地系统环境1.检查系统版本2.检查系统内核版本三、下载inpanel软件包1.创建下载目录2.下载inpanel软件3.查看源码inpanel文件四、部署inpanel应用1.一键安装inpanel2.查看服务端口五、关…

【双U-Net残差网络:超分】

Dual U-Net residual networks for cardiac magnetic resonance images super-resolution (心脏磁共振图像超分辨率的双U-Net残差网络) 目前,心脏磁共振(CMR)成像能够提供心脏全方位的结构和功能信息,已成…

难道你也不能放烟花嘛?那就来看看这个吧!

又到了一年一度的春节时期啦!昨天呢是北方的小年,今天是南方的小年,看到大家可以愉快的放烟花,过大年很是羡慕呀!辞旧岁,贺新春,今年我呀要放烟花,过春节!🧨。…

农产品商城简单demo-Android

项目概述 随着科学技术的不断提高和社会经济的不断发展,一些农产品的销售逐渐的落后于社会信息化的潮流之中,尤其是一些年龄较大的中老年人来说是极为不便的,国家大力倡导并十分重视三农问题,倡导推动农村农业的发展,为…

第二章 搜索求解

人工智能中的搜索&#xff1a; 搜索算法的形式化描述&#xff1a;<状态、动作、状态转移、路径、测试目标> 状态&#xff1a;从原问题转化出的问题描述。 动作&#xff1a;从当前时刻所处状态转移到下一时刻所处状态。 状态转移&#xff1a;对某一时刻对应状态进行某一…

泛型的学习

这里写目录标题一、泛型的使用自定义泛型类泛型方法说明泛型在继承方面的体现通配符的使用有限制条件的通配符的的使用每日一考一、泛型的使用 1、jdk5.0新增特性 2、在集合中使用泛型 ①集合接口或集合类在jdk5.0时都修改为带泛型的结构 ②实例化集合时&#xff0c;可以指明具…

是Spring啊!

一.概念spring概念一个包含了众多工具方法的 IoC 容器okk~~分析一下这句话意思,众多方法,IoC 是形容词,容器是名词 -> 众多方法:比如一个类里有许多方法, 容器:存储的东西 重点就是IoC是什么?Ioc2.1解释IoC -> Inversion of Control 控制反转 -> 对象的生命周期 ->…

Git版本控制工具详解

1、版本控制 1.1、认识版本控制&#xff08;版本控制&#xff09; 什么是版本控制&#xff1f; 版本控制的英文是Version control&#xff1b;是维护工程蓝图的标准作法&#xff0c;能追踪工程蓝图从诞生一直到定案的过程&#xff1b;版本控制也是一种软件工程技巧&#xff…

红米 12C earth 秒解锁 跳过168小时 红米note12 note12pro note12pro+系列机型解锁bl root教程步骤Fastboot

最近上手体验了Redmi 12C/红米12C&#xff0c;这是红米新推出的百元机&#xff0c;起售价699元&#xff0c;464G版本&#xff0c;具有不错的性能&#xff0c;具有5000mAh大电池&#xff0c;具有双频wifi&#xff0c;支持双卡双待&#xff0c;支持SD卡扩展等。 如果你近期想要给…

UTF-8和Unicode

文章目录Unicode与网络传输Unicode网络传输UTF&#xff1a;Unicode Transformation Format UTF-8是在网络上传输Unicode的一个转换标准&#xff0c;发送时将字符串Unicode转为UTF-8&#xff0c;接收时将字节转为Unicode&#xff0c;就完成来字符串的传输 Unicode与网络传输 U…

移动端 - 搜索组件(search-list篇)

移动端 - 搜索组件(search-input篇) 移动端 - 搜索组件(suggest篇) 这里我们需要去封装搜索历史组件 这一个组件还是很简单的, 但是逻辑部分需要根据实际的需求来进行书写; 所以这里我不太好去写实际的代码, 不过可以提供我的思路(主要的就是去实现增, 删, 改, 查) 第一步: 首…