unity float保留_[Unity+shader]重现战场女武神系列的手绘风格(上)

3cf05332b8da9284625d3c17c8768135.png

作者是一条咸鱼,虽然早说要写但是直到游戏都发了一年了才写完这篇文(其实没有,只写了一部分)

虽然四代由于剧情设定极具日式中二风味而受到一些反面评价,目前似乎人气也平平,但实际体验起来还是非常有意思的。这款不用走格子的战棋游戏在视觉方面,使用了一款名为CANVAS的引擎,画面采用了一种手绘的水彩画风。

Valkyria Chronicles 4 | Canvas​valkyria.sega.com
a80eab838957f0f2e182b15f451508d0.png

根据世嘉给出的介绍,其特点包含了若隐若现的描边、渗色、暗部添加阴影线,以及拟声词的文字表现这四点。

4551d6dc18816bff9c9c0dca076a8818.png
懒得重新截图了于是随便找了一张。反应过来了吗,所谓bursts of textual onomatopoeia指的就是这个GRRRRR的效果

这一系列的内容就和描边、渗色(没明白到底指啥,因为好像并没有看到颜色边界不清晰啊。于是这里就当是边缘那个上色没上完的效果了)以及阴影线有关,通过以上三个工序的处理,再现女武神系列的标志性手绘水彩效果。


首先从描边开始。

在5.几版本的unity提供的standard asset中就有提供EdgeDetection

作为image effect https://docs.unity3d.com/540/Documentation/Manual/script-EdgeDetectEffect.html

(5.5之后被收录在legacy-image-effects中 https://assetstore.unity.com/packages/essentials/legacy-image-effects-83913 )。

其思路即将相邻的像素做比较,差别较大的位置被识别为边缘。采样时有直接使用原本的图像纹理、使用深度图、深度及法线图这几种方法。

b6b9e5ce32a82155c183b0012e88ac65.png
直接对图像本身进行检测与使用深度图进行检测的区别在于,使用深度图时,不会将平面上的花纹识别为边缘

所谓深度图,即_CameraDepthTexture,可以在shader中通过声明

sampler2D_float _CameraDepthTexture;

来获取。

e96204f021b4df3d3608604dc2621448.png
也可以看出,同一个物体上的不同位置由于到摄像机的距离没有多少差距而在深度图上无法表现出太多变化

得到的深度是一个0~1的值,如果直接拿来作为纹理使用的话,就是会由于只有r通道有数据而成为一片红红的样子。如果只取r值的话,就能显示出淡淡的灰色,这是因为它是一种非线性空间中的深度值(Pixel values in the Depth Texture range between 0 and 1, with a non-linear distribution.)。

这时,为了方便使用,unity提供了一个Linear01

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Unity自带的RenderTexture来将ToonShader的效果输出为PNG图片。下面是一个简单的示例代码: ```csharp using UnityEngine; public class ToonShaderExporter : MonoBehaviour { public Shader toonShader; public RenderTexture renderTexture; public string outputFileName = "output.png"; private void Start() { // 创建RenderTexture,用于将ToonShader效果渲染到其中 renderTexture = new RenderTexture(Screen.width, Screen.height, 24); renderTexture.format = RenderTextureFormat.ARGB32; renderTexture.Create(); // 将相机的TargetTexture设置为renderTexture Camera.main.targetTexture = renderTexture; // 将ToonShader赋给相机的Material Camera.main.SetReplacementShader(toonShader, ""); // 渲染相机 Camera.main.Render(); // 恢复相机的TargetTexture为空 Camera.main.targetTexture = null; // 从renderTexture中读取像素数据 Texture2D texture = new Texture2D(renderTexture.width, renderTexture.height, TextureFormat.RGB24, false); RenderTexture.active = renderTexture; texture.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0); texture.Apply(); RenderTexture.active = null; // 将像素数据保存为PNG图片 byte[] bytes = texture.EncodeToPNG(); System.IO.File.WriteAllBytes(outputFileName, bytes); // 销毁renderTexture和texture Destroy(renderTexture); Destroy(texture); } } ``` 将上述代码添加到一个空物体上,并将ToonShader赋给toonShader变量。然后运行游戏,代码会将ToonShader的效果渲染到RenderTexture,并将RenderTexture保存为PNG图片。最终的PNG图片会保存在Unity项目的根目录下,文件名为output.png。你可以根据需要修改输出文件名和路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值