Unity Shader实现裁切效果

Unity Shader学习:裁切效果,供大家参考,具体内容如下

之前看到有人问关于物体裁切方面的问题,初学shader的话可能搞得不是很明白,这里提供下比较简单的思路,有需要的话可以直接使用。(关于切面缝合还没有找到比较好的方法)

裁切原理:将世界空间中像素y值(垂直裁切)大于物体自身坐标y值一定范围的直接discard。

c#部分:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DiscardTest : MonoBehaviour {
 private Material m;
 private void Start()
 {
 m = GetComponent<MeshRenderer>().material;
 }
 void Update () {
 m.SetFloat("_YFactor", transform.position.y);
 }
}

shader部分:

Shader "Unlit/3DdiscardTest"
{
 Properties
 {
 _MainTex ("Texture", 2D) = "white" {}
 //裁切的范围(根据实际物体大小而定,通过C#赋值)
 _DiscardFactor("DiscardFactor",Range(-0.51,0.55)) = 0.0
 //切口光的颜色
 _LightColor("LightColor",Color) = (1,1,1,1)
 //光的宽度
 _LightWidth("LightWidth",Range(0.0,0.1))=0.05
 }
 SubShader
 {
 Tags { "RenderType"="Opaque" }
 //不关闭背面剔除的话看不到物体内侧
 Cull off
 Pass
 {
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag
 #include "UnityCG.cginc"
 struct v2f
 {
 float2 uv : TEXCOORD0;
 float4 vertex : SV_POSITION;
 float3 worldPos:TEXCOORD1;
 };

 sampler2D _MainTex;
 float _YFactor;
 float _DiscardFactor;
 float4 _LightColor;
 float _LightWidth;

 v2f vert (appdata_base v)
 {
 v2f o;
 o.vertex = UnityObjectToClipPos(v.vertex);
 o.worldPos= mul(unity_ObjectToWorld, v.vertex).xyz;
 o.uv = v.texcoord;
 return o;
 }

 fixed4 frag (v2f i) : SV_Target
 {
 float factor = _YFactor-i.worldPos.y + _DiscardFactor;
 //_YFactor-i.worldPos.y=0时像素为物体中心,大于0像素在下面,小于0像素在上面,_DiscardFactor越小,factor越小,下面保留的就越少
 if (factor<0)
 {
 discard;
 }
 float4 color = tex2D(_MainTex, i.uv);
 //factor<0的部分已经被裁减,剩下的部分在加个边界做切面的描边
 if (factor < _LightWidth)
 {
 return _LightColor;
 }
 return color;
 //优化了上面if的写法,等价,但是看起来比较绕
 //float lerpFactor=saturate(sign(_LightWidth -factor));
 //return color * (1 - lerpFactor) + lerpFactor * _LightColor;
 }
 ENDCG
 }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • c#图片处理之图片裁剪成不规则图形

    为了让大家知道下面内容是否是自己想要的,我先发效果图. 好了,那就开始贴代码了 以下为一个按钮的事件,为裁剪准备图片.裁剪路径.保存路径 复制代码 代码如下: private void button1_Click(object sender, EventArgs e)        {            GraphicsPath path = new GraphicsPath();            Point[] p = {                            new

  • C#裁剪,缩放,清晰度,水印处理操作示例

    前言 需求源自项目中的一些应用,比如相册功能,通常用户上传相片后我们都会针对该相片再生成一张缩略图,用于其它页面上的列表显示.随便看一下,大部分网站基本都是将原图等比缩放来生成缩略图.但完美主义者会发现一些问题,比如显示排版时想让相片缩略图列表非常统一.整齐.和美观,比如要求每张缩略图大小固定为120 x 90且不拉伸变形怎么办?再比如用户头像如何让缩略图比原图更清晰?或是如何在上传的图片下加一个半透明的LOGO水印? OK,本文根据自己的项目代码描述以上问题的解决方案,全部基于.Net Fra

  • c#利用Grahics进行图片裁剪

    最开始用了 复制代码 代码如下: /// <summary>        /// 裁剪图片        /// </summary>        /// <param name="imagePath"/>        /// <param name="savePath">"c:\images\"</param>        private List<string>

  • c#裁剪图片后使用zxing生成二维码示例分享

    复制代码 代码如下: /// <summary>/// 生成二维码/// </summary>/// <param name="fileName">生成二维码路径</param>/// <param name="url">生成的内容</param>/// <param name="width">二维码宽</param>/// <param nam

  • C#实现图片切割、切图、裁剪

    本文实例为大家分享了C#实现图片切割.切图的具体代码,供大家参考,具体内容如下 前台准备两个Image控件.上面是显示原图,下面显示切割后的效果. <StackPanel Orientation="Vertical"> <Image Width="450" Height="383" Source="C:\Users\Administrator\Documents\Visual Studio 2015\Projects\

  • C#实现缩放和剪裁图片的方法示例

    本文实例讲述了C#实现缩放和剪裁图片的方法.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Text; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; namespace Project { class ImageOperation { /// <summary> //

  • C#实现对图片文件的压缩、裁剪操作实例

    本文实例讲述了C#对图片文件的压缩.裁剪操作方法,在C#项目开发中非常有实用价值.分享给大家供大家参考.具体如下: 一般在做项目时,对图片的处理,以前都采用在上传时,限制其大小的方式,这样带来诸多不便.毕竟网站运维人员不一定会对图片做处理,经常超出大小限制,即使会使用图片处理软件的,也由于个人水平方面原因,处理效果差强人意. 于是采用C#为我们提供的图像编辑功能,实现一站式上传,通过程序生成所需大小.尺寸的目标图片. 具体步骤如下: 先说图片压缩: 第一步:需要读取一个图片文件,读取方法: //

  • C#实现在服务器端裁剪图片的方法

    本文实例讲述了C#实现在服务器端裁剪图片的方法.分享给大家供大家参考.具体实现方法如下: //图片路径 String oldPath = Server.MapPath("~/62223231.jpg"); //新图片路径 String newPath = System.IO.Path.GetExtension(oldPath); //设置截取的坐标和大小 int x = 0, y = 20, width = 200, height = 2400; //计算新的文件名,在旧文件名后加_n

  • C#实现鼠标裁剪图像功能

    本文实例为大家分享了C#实现鼠标裁剪图像的具体代码,供大家参考,具体内容如下 C#的图像裁剪很容易操作,这里给个实现的例子. 关键是需要处理鼠标的事件和一些更新 实现鼠标移动的代码.注意更新不要全部重画,只有选择矩形部分重画 private void Form1_MouseMove(object sender, MouseEventArgs e) { if (Track_move) endpoint = new Point(e.X, e.Y); else { return; } rect1 =

  • C#如何实现图片的剪裁并保存

    最近需要将一张图片上传并按指定位置剪裁,后来在网上找了一个剪裁图片的插件,但是只有前台没有后端,然后我各种百度,并最终完成,特此写一篇博客略表纪念. 前台我就不说了,用的cropper插件,有兴趣的自己去百度找找吧.我们 有这个插件. 下面是代码: HttpPostedFile file = context.Request.Files["avatar_file"]; string datasize = context.Request.Params["avatar_data&q

随机推荐