三平面映射的技术

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

一、效果说明

在这里插入图片描述

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

  然后在模型的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 100Pass{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 texturehalf4 col = TriplanarSampling44(_MainTex,i.worldPos,i.worldNormal,_falloff,_MainTex_ST.xy);return col;}ENDCG}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3 vue的if语法

vue的if语法是相当于一个标签的属性来写进去的&#xff0c;比如说<h1 v-if“”>。要注意的是if语句里可以自动从数据层取值的&#xff0c;比如<h1 v-if"message">&#xff0c;这里就会自动把key为message的值取过来&#xff0c;而如果要传一个字符串&…

BpBinder与PPBinder调用过程——Android开发Binder IPC通信技术

在Android系统中&#xff0c;进程间通信&#xff08;IPC&#xff09;是一个非常重要的话题。Android系统通过Binder IPC机制实现进程间通信&#xff0c;而Binder IPC通信技术则是Android系统中最为重要的进程间通信技术之一。本文将介绍Binder IPC通信技术的原理&#xff0c;并…

【Pytorch】P0 Windows 安装 Pytorch

Windows安装Pytorch 前言PyTorch&#xff0c;CUDA与GPUCUDA ToolkitSo...总而言之 整体流程一&#xff1a;安装 CUDA Toolkit步骤一&#xff1a;获取CUDA版本信息步骤二&#xff1a;下载安装 CUDA Toolkit步骤三&#xff1a;按照默认步骤安装步骤四&#xff1a;检查CUDA安装成功…

FFmpeg 编码详细流程

介绍 FFmpeg的 libavcodec 模块完成音视频多媒体的编解码模块。FFmpeg 本身不具有音视频编码的功能和底层能力&#xff0c;只是对各类第三方的编码器API 进行封装调用。老版本的 FFmpeg 将avcodec_encode_video2()作为视频的解码函数 API&#xff0c;将avcodec_encode_audio2(…

Win7累积补丁更新包_UpdatePack7R2-23.8.10

UpdatePack7是最新的Win7补丁累积更新包&#xff0c;Windows 7更新补丁安装包&#xff0c;Win7累积更新离线安装包包括所有关键更新和安全更新及Internet Explorer所有版本的更新&#xff0c;此外还集成了NVMe驱动和USB3.0驱动&#xff0c;使用它还可以将累积更新封装到系统内&…

linux安装ftp

一、安装 参考博客 https://blog.csdn.net/dafeigecsdn/article/details/126518069 rpm -qa |grep vsftpd # 查看是否安装ftp yum -y install vsftpd # 安装vsftpuseradd -d /home/lanren312 lanren312 # 指定在/home目录下创建用户 passwd lanren312 # 给用户设置密码 # 输…

zookeeper和kafka

目录 一、zookeeper理论 1.1、zookeeper定义 1.2、zookeeper工作机制 1.3、zookeeper特点 1.4、zookeeper的数据结构 1.5、zookeeper应用场景 1.6、zookeeper的选举机制 二、部署Zookeeper 集群 2.1、环境准备 2.2、安装 Zookeeper 2.3、修改配置文件 2.4、配置…

【MATLAB第67期】# 源码分享 | 基于MATLAB的morris全局敏感性分析

【MATLAB第67期】# 源码分享 | 基于MATLAB的morris全局敏感性分析 一、代码展示 clear all npoint100;%在分位数超空间中要采样的点数(计算次数iternpoint*(nfac1) nfac20;%研究函数的不确定因素数量 [mu, order] morris_sa1((x)test_function(x), nfac, npoint)for t1:size…

DOM的节点操作+事件高级+DOM事件流+事件对象

一.节点操作 1.父节点: node.parentNode 得到的是离元素最近的父级节点 2.子节点: parentNode.childNodes 所有的子节点 包含元素节点 文本节点等等parentNode.children (非标准) 获取所有的子元素节点,实际开发常用 parentNode.firstChild 获取…

【c语言】通讯录(静态)

小张刚学习完结构体&#xff0c;枚举&#xff0c;联合相关的知识&#xff0c;实践实践&#xff0c;写一个通讯录呗&#xff01; 通讯录的功能 1.通讯录可存放100的信息 2.信息的内容姓名&#xff0c;性别&#xff0c;年龄&#xff0c;电话&#xff0c;地址 3.支持增加联系人 4.…

【LeetCode】1572.矩阵对角线元素的和

题目 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&#xff1a; 输入&#xff1a;mat [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;25 解释&#xff1a;对角线的和为&a…

零基础看懂免费开源的Stable Diffusion

文章目录 前言Diffusion模型推理过程训练过程 Stable Diffusion模型参考 前言 前面一篇文章主要讲了扩散模型的理论基础&#xff0c;还没看过上篇的小伙伴可以点击查看&#xff1a;DDPM理论基础。这篇我们主要讲一下一经推出&#xff0c;就火爆全网的Stable Diffusion模型。St…