unity地形之splatalpha研究 地形贴图导出更换与绘制

2023-11-16

unity中的地图贴图的绘制常常使用的是paint texture里面的

但是这个方式往往费时很多,却只能做出很少的效果,这里要介绍的就是通过外部绘制splatalpha

来替换,达到unity中地形更强的效果

使用软件基本有worldmachine,ps,unity




地形一般的流程通常是创建了地形,先刷高度,然后再进行贴图的绘制,

可以看到保存文件之后,project中会生成一个terrain文件,并且可以点开

里面通常会至少有一个splatalpha,这个存储的就是你画贴图的位置

其实这个地形贴图相当于组合而成的四个mask,分别表示了4种贴图所占的位置以及混合程度

每4种会产生一个新的splatalpha,这其实一个texture格式,包含了4个通道,红绿蓝和alpha通道


然后大家可能发现这些图片是不能导出也不能在外部修改的,

如果是外部软件比如worldmachine生成的就只能当成一张大的texture贴上去,会造成很大的性能浪费,

而且不能当场mask使用新的更细致的纹理

所以这里给出一种新的方式,当然也是worldmachine官网的方式

可以替换splatalpha达到使用外部生成的地形纹理mask的目的

https://www.world-machine.com/learn.php?page=workflow&workflow=wfunity

下面是我组合好了官网的脚本ReplaceSplatmap.js

import System.IO;
//combine by shenmifangke  
class ReplaceSplatmap extends ScriptableWizard
{
var Splatmap: Texture2D;
var New : Texture2D;
var FlipVertical : boolean;

 function OnWizardUpdate(){
        helpString = "Replace the existing splatmap of your terrain with a new one.\nDrag the embedded splatmap texture of your terrain to the 'Splatmap box'.\nThen drag the replacement splatmap texture to the 'New' box\nThen hit 'Replace'.";
        isValid = (Splatmap != null) && (New != null);
    }
	
function OnWizardCreate () {
   
   	if (New.format != TextureFormat.ARGB32 && New.format != TextureFormat.RGB24) {
		EditorUtility.DisplayDialog("Wrong format", "Splatmap must be converted to ARGB 32 bit format.\nMake sure the type is Advanced and set the format!", "Cancel"); 
		return;
	}
	
	var w = New.width;
	if (Mathf.ClosestPowerOfTwo(w) != w) {
		EditorUtility.DisplayDialog("Wrong size", "Splatmap width and height must be a power of two!", "Cancel"); 
		return;	
	}  

    try {
    	var pixels = New.GetPixels();	
		if (FlipVertical) {
			var h = w; // always square in unity
			for (var y = 0; y < h/2; y++) {
				var otherY = h - y - 1;	
				for (var x  = 0; x < w; x++) {
					var swapval = pixels[y*w + x];					
					pixels[y*w + x] = pixels[otherY*w + x];
					pixels[otherY*w + x] = swapval;
				}		
			}
		}
		Splatmap.Resize (New.width, New.height, New.format, true);
		Splatmap.SetPixels (pixels);
		Splatmap.Apply();
    }
    catch (err) {
		EditorUtility.DisplayDialog("Not readable", "The 'New' splatmap must be readable. Make sure the type is Advanced and enable read/write and try again!", "Cancel"); 
		return;
	}			
}
//http://blog.csdn.net/shenmifangke
@MenuItem("Terrain/Replace Splatmap...")
static function Replace (){
    ScriptableWizard.DisplayWizard(
        "ReplaceSplatmap", ReplaceSplatmap, "Replace");
}


@MenuItem("Terrain/Export Texture")
    static function Apply()
{
    var texture : Texture2D = Selection.activeObject as Texture2D;
    if (texture == null)
    {
        EditorUtility.DisplayDialog("Select Texture", "You Must Select a Texture first!", "Ok");
        return;
    }

    var bytes = texture.EncodeToPNG();
    File.WriteAllBytes(Application.dataPath + "/exported_texture.png", bytes);
}
}
放在Editor目录下,就会发现多出来terrain菜单里面两项

第一个是替换splatalpha,第二个是把splatalpha贴图导出成png图片,会保存在工程目录assets里

这两个是极其有用的地形扩展脚本

下面具体来说说方式和我研究的过程


首先从第二个导出aplatalpha说起

导出png,这里导出的png不是一般的png,而是带有四个通道“完整”png,类似于存储了透明通道的32位tga之类的格式

我们通常会用图像处理软件比如ps等来处理图片,但是它有个问题,就是打开这个png的时候

会把alpha通道视为透明通道从而让颜色通道里的信息损失

比如下面一张图片,直接看会发现只有半个三角形(这张图是处理过的含有4个完整通道的png 地形导出png也会导出类似的png)


你可以保存下来在ps里打开,但是同样是这样,左侧半边的颜色信息缺失了,

但我可以告诉你实际上左侧三角形是有颜色信息的,只是ps里没有办法把png显示成4个通道,所以只能把最后一个非rgb通道识别成透明通道(什么,还有ps没法办到的事0 0,其实真有,不过这个可以用某些ps插件来解决)

这只是ps等常用软件无法分离四个通道的png而已,其他软件是可以的

比如unity本身,ae,nuke等等中,如下面就是用nuke处理分离颜色和透明通道


或者这里做了个确认性的测试,用的是openframeworks

#include "ofApp.h"
ofImage temp;
ofImage temp2;
//--------------------------------------------------------------
void ofApp::setup(){
temp.loadImage("a.png");
temp2.loadImage("a.png");
ofPixels pixels = temp.getPixelsRef();

ofPixels noAlpha;
noAlpha.allocate(temp.getWidth(),temp.getHeight(),OF_IMAGE_COLOR);
noAlpha.setChannel(0,pixels.getChannel(0));
noAlpha.setChannel(1,pixels.getChannel(1));
noAlpha.setChannel(2,pixels.getChannel(2));

temp.setFromPixels(noAlpha);
}

//--------------------------------------------------------------
void ofApp::update(){

}

void ofApp::draw(){
temp.draw(0,0);
temp2.draw(512,0);
}
void ofApp::keyPressed(int key){}
void ofApp::keyReleased(int key){}
void ofApp::mouseMoved(int x, int y ){}
void ofApp::mouseDragged(int x, int y, int button){}
void ofApp::mousePressed(int x, int y, int button){}
void ofApp::mouseReleased(int x, int y, int button){}
void ofApp::windowResized(int w, int h){}
void ofApp::gotMessage(ofMessage msg){}
void ofApp::dragEvent(ofDragInfo dragInfo){}


可以看到png中透明部分确实还有rgb信息


然后就是替换splatalpha

新的作为splatalpha的图片记得要在unity中设置如下,否则无法成功替换



用terrain菜单的中第一个替换图片后,然后会发现似乎是成功了(这里随意加了4种纹理)



然而随意画一笔就会发现好像有方块的效果,这不是我们想要的


其实这个问题是由你的png造成的,一般从unity里导出的png就不会有这个问题,

所以在此分析了下,发现splatalpha还有其他的限定条件

那就是所有通道每个像素白色亮度的加成必须是1,如果不是就会产生这种问题,

因为地形上你每画一笔贴图,那个层上的亮度(就是对应的rgba值)就会增加,但其他层会相应的减少,总和维持不变,所以我们必须想办法把所有通道的值值和不大于1(不足的会是黑色表示)超出的话即便是透明渐变笔刷,刷出来也会是方块效果

修正完后效果就会正常如下(无视黑色地方吧),就可以在unity中进一步加工了



当然外部处理的地形贴图最好还是以tga之类的格式存储,防止有人不知道这个

tga也要注意存成32位的还要勾选alpha通道才行






本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity地形之splatalpha研究 地形贴图导出更换与绘制 的相关文章

  • 【UGUI】2D头顶血条制作

    前言 近期因为需要制作玩家和敌人头顶的2D血条 查找了很多博客 发现很多都拘束于Canvas的渲染模式必须要设定为ScreenSpace Overlay 还有应该是版本原因 我的是unity2019 1 11f1 用RecttTransfo
  • Unity 分块延迟渲染01 (TBDR)

    现代移动端图形体系结构的概述 现代SoC通常会同时集成CPU和GPU CPU被用于处理需要低内存延迟的序列 大量分支的数据集 其晶体管用于流控制和数据缓存 GPU为处理大型 未分支的数据集 如3D渲染 晶体管专用于寄存器和算术逻辑单元 而不
  • Unity中级客户端开发工程师的进阶之路

    上期UWA技能成长系统之 Unity高级客户端开发工程师的进阶之路 得到了很多Unity开发者的肯定 通过系统的学习 可以掌握游戏性能瓶颈定位的方法和常见的CPU GPU 内存相关的性能优化方法 UWA技能成长系统是UWA根据学员的职业发展
  • Unity 粒子特效、材质发光 HDR ShaderGraph图文教程[完成lit发光设置]

    效果如图 准备工作 在hdr模式下 关闭Directional Light 相机设置 移动球挂一个点光源作为子节点 设置自行调节 0 创建移动球的材质及shader shader gt 在Project Create Shader Grap
  • Unity动画控制器animator.CrossFade

    需要特别注意 1 CrossFade虽然可以不用任何逻辑来链接而直接跳转 但是CrossFade只能覆盖其他动画 当当前动画播放完毕而没有跳出这个动画时再次调用CrossFade将会失败 造成动画依旧停在原位 参数animator Cros
  • UnityVR--组件3--Line Renderer--线性渲染

    目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1 使用Line Renderer绘制线段 应用1实现 使用系统工具或自定义工具绘制线段 应用2 Trail Render
  • Unity3d 插件 系列——DoTweenPro介绍(图文详细+案例)

    Unity3d 插件 系列 DoTweenPro介绍 图文详细 案例 前言 一 DoTweenPro简介 二 DoTweenPro安装 三 DoTweenPro主要组件 1 DoTweenAnimation 2 DoTweenPath 3
  • Unity与Android的Back键冲突解决

    Unity与Android的Back键冲突解决 上一篇的最后留下了两个问题 Unity视图下横屏闪退 Unity视图下Android无法响应back返回上一activity 对于第一个问题 应该是Unity横屏下视图的某些设置跟Androi
  • unity3d大型互动照片墙

    1 本次应客户需求 制作一个大型照片墙互动 输出分辨率为9600 4320 注 unity3d官方推荐最大分辨率为8192 3686 4 经过现场长达24小时暴力测试中途未发生问题 姑且判定可以达到正常标准 废话不多说 先上效果 unity
  • unity: C#的Action Event Delegate的异同

    目录 一 Action 二 Event 三 Action和Event区别 四 Delegate 总结 Action Event Delegate的异同 前言 Action Event和Delegate都是C 语言中的重要概念 分别用于管理函
  • Unity打包WebGL的优化常用操作?

    1 贴图部分优化 如果贴图格式时2048 在不影响画面效果的情况下 改成1024或者5 12 还可以缩小包体 2 压缩和解压缩问题 WebGL打包的时候分三种压缩情况 gzip 比Brotli文件打 但打包快 http和https都支持 B
  • unity dots jobSystem 记录

    Looking for a way to get started writing safe multithreaded code Learn the principles behind our Job System and how it w
  • 【原神游戏开发日志1】缘起

    原神游戏开发日志1 缘起 版权声明 本文为 优梦创客 原创文章 您可以自由转载 但必须加入完整的版权声明 文章内容不得删减 修改 演绎 相关学习资源见文末 大家好 最近看到原神在TGA上频频获奖 作为一个14年经验的游戏开发行业的老兵 我就
  • 【Unity】如何让Unity程序一打开就运行命令行命令

    背景 Unity程序有时依赖于某些服务去实现一些功能 此时可能需要类似打开程序就自动运行Windows命令行命令的功能 方法 using UnityEngine using System Diagnostics using System T
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • 获取 glFrustum 的坐标

    我刚刚开始阅读有关OpenGL主题 特别是关于Viewing http glprogramming com red chapter03 html以满足我目前的需求 我试图理解glFrustum根据我的理解 对我在屏幕上绘制的对象进行透视投影
  • 应用程序启动时录制 Callback() 时间歇性崩溃

    我的 iOS 应用程序 使用 openFrameworks 在启动时有 30 40 的时间崩溃 if soundInputPtr NULL soundInputPtr gt audioIn tempBuffer ioData gt mBuf
  • U3D游戏开发中摇杆的制作(UGUI版)

    在PC端模拟摇杆 实现玩家通过控制摇杆让玩家移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine using Unity
  • 游戏开发常见操作梳理之NPC任务系统

    多数游戏存在任务系统 接下来介绍通过NPC触发任务的游戏制作代码 using System Collections using System Collections Generic using UnityEngine
  • 游戏开发常见操作梳理之小地图的制作

    游戏中一般存在小地图系统 实际上就是设置一个新的摄像机放置在玩家的正上方 然后在小地图上显示新摄像机看见的东西就可以了 在小地图上一般存在放大地图和缩小地图的按钮可以方便放大和缩小地图 这些操作是如何实现的呢 接下来直接上核心代码 usin

随机推荐

  • OException parsing XML document from class path resource [beans.xml]

    项目场景 在学习spring的时候配置xml遇到了一个问题 问题描述 IOException parsing XML document from class path resource beans xml nested exception
  • 通过PAGE生成python GUI界面(用PAGE拖出需要的GUI界面)

    注 当前我的使用环境为windows10 64bit python v3 6 PAGE v4 14 Tcl v8 6 7 0 当前我定义一个目标 最终需要生成一个登录界面的GUI代码 如下 安装好各软件后 就可以运行PAGE来像VB一样所见
  • 【统一解决OpenCV+contrib编译过程中ippicv、face_landmark_model以及boostdesc/vgg_generated文件下载缓慢问题】

    统一解决OpenCV contrib编译过程中ippicv face landmark model以及boostdesc vgg generated文件下载缓慢问题 在编译过程中 ippicv face landmark model以及bo
  • python爬虫之爬取百度翻译

    使用python中requests模块就可以爬取 import requests post url https fanyi baidu com sug headers User Agent Mozilla 5 0 Windows NT 10
  • 【华为机试真题 Python】统计每个月兔子的总数

    目录 题目描述 输入 输出 示例 参考代码 题目描述 有一种兔子 从出生后第3个月起每个月都生一只兔子 小兔子长到第三个月后每个月又生一只兔子 例子 假设一只兔子第3个月出生 那么它第5个月开始会每个月生一只兔子 一月的时候有一只兔子 假如
  • 音视频简易播放器代码范例

    下面是一个简单的音视频播放器代码范例 使用Python语言和PyQt5框架 python import sys from PyQt5 QtCore import Qt QUrl from PyQt5 QtMultimedia import
  • fgets函数的理解

    fget函数的原型如下 char fgets char buf int n FILE fp 功能 从文件流读取一行 送到缓冲区 使用时注意以下几点 1 当遇到换行符或者缓冲区已满 fgets就会停止 返回读到的数据 值得注意的是不能用fge
  • javaweb (一) ——web与servlet

    文章目录 web 1 客户端和服务器 服务器软件 网络协议 虚拟主机 静态和动态内容 安全性 2 URL 3 HTML 4 CSS 5 JavaScript 6 HTTP 请求方法 请求头 请求体 响应状态码 响应头 响应体 7 Web 应
  • 【Spring Boot】Spring Boot框架

    文章目录 Spring Boot 1 概念 特点及其好多 2 springBoot的初体验 2 1 步骤 2 1 1创建项目 2 1 2 加入依赖 2 1 3 启动类 2 1 4 controller类 2 1 5 测试 3 配置文件 3
  • 高标准农田信息化管理平台概要设计

    1 综合信息一张图系统 通过一张图的形式 可视化直观展示地区土地分布 耕地质量 高标准农田建设情况 灌溉情况 设备分布情况及环境监测数据 农业管理者可在一张图上查看农田相关信息 及时了解农田情况 为农田管理者的精准管理和科学决策提供辅助支撑
  • Asp.Net&.Net Core 使用 SonarQube 踩坑记 (使用 MSBuild扫描器篇)

    使用dotnet 需要 搭建 ner core的运行环境 1 首先安装配置java运行环境 且javaJDK 必须是11以上 jdk版本必须大于11 等于11不行 2 java和java JDK后 记得配置java 和jdk建立连接和配置
  • formdata上传文件_关于multipart/formdata上传文件

    最近在做一个文件上传的开放接口 用到Content Type multipart form data这种请求类型 特地做了一些研究和记录 在最初的 http协议中 并没有上传文件方面的功能 RFC1867为 http协议添加了这个能力 常见
  • 深度学习笔试、面试题 二

    1 梯度爆炸问题是指在训练深度神经网络的时候 梯度变得过大而损失函数变为无穷 在RNN中 下面哪种方法可以较好地处理梯度爆炸问题 A 用改良的网络结构比如LSTM和GRUs B 梯度裁剪 C Dropout D 所有方法都不行 正确答案是
  • Linux-写USB键盘驱动(详解)

    1 首先我们通过上节的代码中修改 来打印下键盘驱动的数据到底是怎样的 先来回忆下 我们之前写的鼠标驱动的id table是这样 所以我们要修改id table 使这个驱动为键盘的驱动 如下图所示 然后修改中断函数 通过printk 打印数据
  • 算法与数据结构(七):优先队列

    博主会对算法与数据结构会不断进行更新 敬请期待 如有什么建议 欢迎联系 我们知道队列具有先进先出的特性 栈具有先进后出的特性 那么有没有一种数据结构可以根据自己的需求 以一定的规则从队列中弹出呢 优先队列就是实现这种目标的数据结构 一般情况
  • shell随机读取文件的一行

    bin bash a cat files txt wc l for i 0 i lt 5 i do b RANDOM a b b 1 sed n b p files txt done
  • 微信公众号内嵌H5网页授权步骤

    主要注意点就是回调地址 我是用vue框架开发的 所以单独做了个页面去授权回调 redirectToAuthPage const callbackURL encodeURIComponent https ad jfpays com wcpn
  • Ubuntu 22.04安装Visual Studio Code(VS Code)

    Ubuntu 22 04安装Visual Studio Code 一 下载 打开浏览器 访问VS Code的官方网址 https code visualstudio com 在首页的左侧有两个蓝色的按钮 点击左边的按钮 下载 deb格式的安
  • 全链路压测的“谜”

    前言 对于性能测试来说 全链路压测肯定跑不了的 在昨天上午的 GIAC全球互联网架构大会 上 网易云就进行了全链路压测的议题 对于有性能测试的公司来说 面试往往会被问到什么是全链路压测 如何有效的开展全链路压测等等 我今天也只是高屋建瓴 站
  • unity地形之splatalpha研究 地形贴图导出更换与绘制

    unity中的地图贴图的绘制常常使用的是paint texture里面的 但是这个方式往往费时很多 却只能做出很少的效果 这里要介绍的就是通过外部绘制splatalpha 来替换 达到unity中地形更强的效果 使用软件基本有worldma