三平面映射的技术

news2024/11/26 4:25:49

大家好,我是阿赵。
  之前在做护盾的时候,使用过一种叫做三平面映射的技术,这里来详细的说一下。

一、效果说明

在这里插入图片描述

  在做场景的时候,很多美工都会遇到一个问题,想把一个通用的材质贴图赋予给一个经过拉伸的模型,比如山体之类,会发现贴图也被拉伸了。
在这里插入图片描述

  然后在模型的UV接缝上, 总是不可避免的出现了贴图不连续的情况。
  这些问题,如果是美工自己去解决,一般的方法是,重新展UV,让UV不要有拉伸,不要有接缝。
  不过实际上这两个问题,也可以用另外一种程序方式来解决,比如我接下来要用的三平面映射技术。
在这里插入图片描述

在模型和UV完全一样的情况下,可以达到这样的效果,完全看不出贴图的拉伸。
在这里插入图片描述

然后看UV的接缝,也不会出现不连续的情况。

二、实现原理

  顾名思义,三平面映射,就是在三个平面分别的采样,然后融合在一起。所以实际上这种技术并没有使用模型本身的UV,也就不存在UV接缝的问题了。
下面说一下实现的步骤:
1、用顶点世界坐标减去物体坐标。
2、从1的结果分别取xy、yz、xz作为UV,对贴图进行采样。
3、计算模型的世界法线坐标,取绝对值,再用一个power运算来控制过渡范围。
4、三次采样的结果分别按法线方向和法线分量相乘,再相加
在这里插入图片描述

如果用带数字的网格图来看,其实三平面映射是这样去采样贴图和融合的
在这里插入图片描述

如果不设置过渡范围,其实也比较明显的看得出贴图直接的混合痕迹。
在这里插入图片描述

设置一下过渡之后,基本上就看不出有什么破绽了。

三、代码

Shader "azhao/Triplannar"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
		_falloff("FallOff",float) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
				float3 normal : NORMAL;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
				float3 worldPos :TEXCOORD0;
				float3 worldNormal:TEXCOORD1;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
			float _falloff;
			inline float4 TriplanarSampling44(sampler2D topTexMap, float3 worldPos, float3 worldNormal, float falloff, float2 tiling)
			{
				float3 projNormal = (pow(abs(worldNormal), falloff));
				projNormal /= (projNormal.x + projNormal.y + projNormal.z) + 0.00001;
				float3 nsign = sign(worldNormal);
				half4 xNorm; half4 yNorm; half4 zNorm;
				xNorm = tex2D(topTexMap, tiling * worldPos.zy * float2(nsign.x, 1.0));
				yNorm = tex2D(topTexMap, tiling * worldPos.xz * float2(nsign.y, 1.0));
				zNorm = tex2D(topTexMap, tiling * worldPos.xy * float2(-nsign.z, 1.0));
				return xNorm * projNormal.x + yNorm * projNormal.y + zNorm * projNormal.z;
			}
            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
				o.worldPos = mul(v.vertex, unity_ObjectToWorld);
				o.worldNormal = mul(unity_WorldToObject, v.normal);

                return o;
            }

            half4 frag (v2f i) : SV_Target
            {
                // sample the texture
				half4 col = TriplanarSampling44(_MainTex,i.worldPos,i.worldNormal,_falloff,_MainTex_ST.xy);

                return col;
            }
            ENDCG
        }
    }
}

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

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

相关文章

无涯教程-Perl - my函数

描述 此函数声明LIST中的变量在包围式块内按词法范围。如果指定了多个变量,则所有变量都必须用括号括起来。 语法 以下是此函数的简单语法- my LIST返回值 此函数不返回任何值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perl -wmy $string "We are the w…

【算法学习】高级班九

这种互为旋变串&#xff1a; 给定两个字符串&#xff0c;判断是否互为旋变串 代码&#xff1a; 打表法&#xff1a; 每一层内的数字不互相依赖&#xff0c;只依赖它下面的层但实际上size会约束L1和L2的值&#xff0c;即L1和L2<N-size 思路&#xff1a;设置一个窗口…

phpstorm配置ftp同步文件到服务器

这里的默认快捷键 不是 CtrlS &#xff1b;需要设置快捷键&#xff0c;这里原来是save all操作时上传文件到服务器&#xff1b; ** 设置好快捷键后按 CtrlS就会同步文件&#xff08;添加删除文件后保存&#xff0c;服务器也会同步&#xff09; ** 搜索出save all 后&#xf…

多线程与高并发--------阻塞队列

四、阻塞队列 一、基础概念 1.1 生产者消费者概念 生产者消费者是设计模式的一种。让生产者和消费者基于一个容器来解决强耦合问题。 生产者 消费者彼此之间不会直接通讯的&#xff0c;而是通过一个容器&#xff08;队列&#xff09;进行通讯。 所以生产者生产完数据后扔到…

【Realtek sdk-3.4.14b】RTL8197F+RTL8812F欧洲屏蔽5G天气雷达信道DFS信道120、124、128方法

需求描述 对于欧洲国家来说,默认支持DFS信道,但是有三个信道比较特殊,是天气雷达信道,如下图所示120、124、128,天气雷达信道有个特点就是在信号可以发射之前需要检测静默15min,如果信道自动选择到了天气雷达信道,就会有15min的时间无法连接到WiFi热点,严重影响用户体验…

(MySQL经验)之MySQL单表行数最好低于2000w

作为在后端开发&#xff0c;是不是经常听到过&#xff0c;mysql 单表最好不要超过 2000w,单表超过 2000w 就要考虑数据迁移了&#xff0c;表数据都要到 2000w &#xff0c;查询速度变得贼慢。 1、建表操作 建一张表 CREATE TABLE person( id int NOT NULL AUTO_INCREMENT PRI…

DNSPod十问王强:小厂做大模型,套壳赚快钱?

本期嘉宾 王强 ZelinAI、考考创始人 王强&#xff0c;ZelinAI、考考创始人兼CEO。ZelinAI成立于2023年&#xff0c;零代码构建AI应用&#xff0c;大模型落地最后一公里&#xff0c;累计获得1万开发者、4万智能体、4000AI应用&#xff0c;服务建发集团、京港地铁、58同城等知名…

儿童学python语言能做什么,小孩学python到底好不好

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;儿童学python语言能做什么&#xff0c;小孩学python课程需要多久&#xff0c;现在让我们一起来看看吧&#xff01; 对于刚开始学习编程的孩子来说&#xff0c;图形化的Scratch是很好的启蒙语言。它用类似于拼图的模式&a…

【jackson】自定义字段注解完成序列化逻辑

目录 背景本文开发环境介绍新建一个注解新建一个JavaBean新建一个JsonSerializer新建一个AnnotationIntrospector单元测试总结 背景 Spring默认的JSON序列化工具使用的是jackson&#xff0c;GitHub项目地址: https://github.com/FasterXML/jackson 我们在处理前后端接口交互的…

Redis系列(一):深入了解Redis数据类型和底层数据结构

Redis有以下几种常用的数据类型&#xff1a; redis数据是如何组织的 为了实现从键到值的快速访问&#xff0c;Redis 使用了一个哈希表来保存所有键值对。 Redis全局哈希表&#xff08;Global Hash Table&#xff09;是指在Redis数据库内部用于存储所有键值对的主要数据结构。…

单参数构造函数的隐式类型转化

单参数构造函数的隐式类型转化 如果你不想发生隐式类型的转化&#xff0c;可以在默认构造函数前加上关键字&#xff1a;explicit 多参数的玩法和单参数的是不一样的 c98 不支持多参数隐式类型的转化 c11 支持多参数隐式类型的转化 举个例子&#xff1a; 多参数可以这样写&…

PhotoShop学习笔记

PhotoShop学习笔记 对图像进行缩放拉伸自动选中像素相近的同一个区域分离图层的选中区域分离图层的非选中区域处理不自然的缝合痕迹 记录一些PhotoShop中用到的操作&#xff0c;主要是在处理AI图像时遇到的需求。 对图像进行缩放拉伸 CTRLT 自动选中像素相近的同一个区域 魔…

24届近3年青岛理工大学自动化考研院校分析

今天给大家带来的是青岛理工大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、青岛理工大学 学校简介 青岛理工大学是一所以工为主&#xff0c;土木建筑、机械制造、环境能源学科特色鲜明&#xff0c;理工经管文法艺等学科协调发展的多科性大学。是国家首批地方…

金蝶云星空与巨益OMS对接集成采购退料查询打通退换货单创建

金蝶云星空与巨益OMS对接集成采购退料查询打通退换货单创建 来源系统:金蝶云星空 金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上&#xff0c;提供了标准的管理模式&#xff1b;通过标准的业务架构&#xff1a;多会计准则、多币别、多地点、多组织、多税制应用框架等&#…

无涯教程-Perl - length函数

描述 此函数返回EXPR值的长度(以字符为单位),如果未指定,则返回$_。如果要确定相应的大小,请在数组或哈希上使用标量context。 语法 以下是此函数的简单语法- length EXPRlength返回值 此函数返回字符串的大小。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perl$o…

多线程与高并发--------线程池

线程池 一、什么是线程池 在开发中&#xff0c;为了提升效率的操作&#xff0c;我们需要将一些业务采用多线程的方式去执行。 比如有一个比较大的任务&#xff0c;可以将任务分成几块&#xff0c;分别交给几个线程去执行&#xff0c;最终做一个汇总就可以了。 比如做业务操…

浅谈LLAMA2核心函数generate源码

在学习LLAMA2的generate源码之前&#xff0c;先介绍Temperature超参数及sample_top_p的原理。 Temperature Temperature 是一个超参数&#xff0c;可用于控制生成语言模型中生成文本的随机性和创造性。用于调整模型的softmax输出层中预测词的概率。 softmax函数: p ( x i )…

JDK内置SPI机制、服务提供发现机制

SPI的全称是Service Provider Interface服务提供接口&#xff0c;是JDK内置的一种 服务提供发现机制&#xff0c;例如我们常用的数据库驱动Driver&#xff0c;就是基于SPI来做的。 运行机制&#xff1a; 服务的调用方需要调用服务提供方的服务&#xff0c;如果在调用方中直接…

插入、希尔、归并、快速排序(java实现)

目录 插入排序 希尔排序 归并排序 快速排序 插入排序 排序原理&#xff1a; 1.把所有元素分为两组&#xff0c;第一组是有序已经排好的&#xff0c;第二组是乱序未排序。 2.将未排序一组的第一个元素作为插入元素&#xff0c;倒序与有序组比较。 3.在有序组中找到比插入…

大语言模型之一 Attention is all you need ---Transformer

大语言模型已经在很多领域大显身手&#xff0c;其应用包括只能写作、音乐创作、知识问答、聊天、客服、广告文案、论文、新闻、小说创作、润色、会议/文章摘要等等领域。在商业上模型即产品、服务即产品、插件即产品&#xff0c;任何形态的用户可触及的都可以是产品&#xff0c…