unity3d plane 贴图怎么对贴图进行裁切

扫描二维码,下载文件到手机
用户应遵守著作权法,尊重著作权人合法权益,不违法上传、存储并分享他人作品。举报邮箱:
京网文[0号 京ICP证100780号[Shader]对NGUI的UISprite和UITexture进行裁剪 - 博客频道 - CSDN.NET
游戏开发者
专注手机游戏 网页游戏开发 Unity Java
分类:Unity3D
由于最近比较忙,所以很多我在其它地方发布的博文都没有同步到这里。我会在后面慢慢重新补回来。对各位关注我博客的读者也表示抱歉!版权所有,转载须注明出处!喜欢火影、喜欢Java、喜欢unity3D、喜欢游戏开发的都可以加入木叶村Q群:0、随便聊本人真正学习Shader的时间莫过于今年春节在家的两天时间,虽然短短两天。但是已经深深喜欢上Shader。深受其魅力吸引。但是平常主要做的还是服务端和客户端的开发,偏逻辑向。所以好久也没碰Shader了。但是昨天在一个群里有人讨论NGUI不能对Sprite进行裁剪。比如把一个方形的,显示成一个圆形的。如下图:这个应该是挺常见的,或许你会说,美术直接帮你裁成圆的不就可以吗。有时候可以,有时候不行。什么时候不行呢?当你在游戏中有些地方使用方形的,有些地方使用圆形的。这时候就不能让美术帮你裁了。不然不就有两份资源了。本文读者最好已经知道怎么使用NGUI创建图集,使用它的UISprite和UITexture。本文编写测试环境为:系统:Win7 X64引擎:Unity3D V4.3.3插件:NGUI 3.5.71、开始动手作为一个学习过两天Shader的人,我觉得,这应该难不倒我。因此,我立马在U3D的Project面板中噼里啪啦一阵狂搞。创建一个Shader。2、编写第一版Shader。双击我们上面创建的Shader。因为这个是给NGUI用的。然后我就依照NGUI的Shader命名,给我们的Shader命名为:Unlit/Transparent Colored MaskShader代码如下:Shader &Unlit/Transparent Colored Mask&
Properties
_MainTex (&Base (RGB), Alpha (A)&, 2D) = &black& {}
_Mask (&Mask Alpha (A)&, 2D) = &white& {}
&Queue& = &Transparent&
&IgnoreProjector& = &True&
&RenderType& = &Transparent&
Lighting Off
ZWrite Off
Fog { Mode Off }
Offset -1, -1
Blend SrcAlpha OneMinusSrcAlpha
#pragma vertex vert
#pragma fragment frag
#include &UnityCG.cginc&
struct appdata_t
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
fixed4 color : COLOR;
struct v2f
float4 vertex : SV_POSITION;
half2 texcoord : TEXCOORD0;
fixed4 color : COLOR;
fixed gray : TEXCOORD1;
sampler2D _MainT
sampler2D _M
float4 _MainTex_ST;
float4 _Mask_ST;
v2f vert (appdata_t v)
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.texcoord = v.
o.color = v.
o.gray = dot(v.color, fixed4(1,1,1,0));
fixed4 frag (v2f i) : COLOR
col = tex2D(_MainTex, i.texcoord) * i.
col.a = col.a * tex2D(_Mask, i.texcoord).a;
&Queue& = &Transparent&
&IgnoreProjector& = &True&
&RenderType& = &Transparent&
Lighting Off
ZWrite Off
Fog { Mode Off }
Offset -1, -1
ColorMask RGB
AlphaTest Greater .01
Blend SrcAlpha OneMinusSrcAlpha
ColorMaterial AmbientAndDiffuse
SetTexture [_MainTex]
Combine Texture * Primary
}主要实现裁剪的代码为:fixed4 frag (v2f i) : COLOR
col = tex2D(_MainTex, i.texcoord) * i.
col.a = col.a * tex2D(_Mask, i.texcoord).a;
}相信大家很容易就看懂了,这里是把Mask贴图的Alpha通道的值和原图片的进行相乘。怎么用呢。新建一个UItexture。然后选择一个材质。用上我们上面的Shader。然后设置一个Mask。这个Mask图片为可以看到Alpha通道里面是一个白色的圆圈。记得这个Mask图片的导入设置如下:那么可以看看运行效果:3、欢呼,庆祝?貌似一切都挺顺利的。但是这个Shader能否对UISprite起效果呢?我们来试试。随便搞个图集。然后加个UISprite,然后修改这个图集的材质使用我们的Shader。额。。。效果咋成下面这样啦。。。不太对的赶脚4、停一停想一想难道这是NGUI的bug。。。啊!!!啊!!!!!不行,我要想想看。。。。。。。。。1分钟过去了。为什么col.a = col.a * tex2D(_Mask, i.texcoord).a这个公式对Sprite的效果是错误的呢。难道i.texcoord的范围不是0~1.这么一想,倒好像也有点道理。因为NGUI把要用到的图片做成了图集。因此,每次只是取图集中的一小个区域显示到UI的Mesh上。那么,我只要把i.texcoord的范围重新映射到0~1。然后用于取Mask上面的颜色,不就OK了吗?机智的我立马动起手来。Shader &Unlit/Transparent Colored Mask&
Properties
_MainTex (&Base (RGB), Alpha (A)&, 2D) = &black& {}
_Mask (&Mask Alpha (A)&, 2D) = &white& {}
_WidthRate (&Sprite.width/Atlas.width&, float) = 1
_HeightRate (&Sprite.height/Atlas.height&, float) = 1
_XOffset(&offsetX&, float) = 0
_XOffset(&offsetY&, float) = 0
&Queue& = &Transparent&
&IgnoreProjector& = &True&
&RenderType& = &Transparent&
Lighting Off
ZWrite Off
Fog { Mode Off }
Offset -1, -1
Blend SrcAlpha OneMinusSrcAlpha
#pragma vertex vert
#pragma fragment frag
#include &UnityCG.cginc&
struct appdata_t
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
fixed4 color : COLOR;
struct v2f
float4 vertex : SV_POSITION;
half2 texcoord : TEXCOORD0;
fixed4 color : COLOR;
fixed gray : TEXCOORD1;
sampler2D _MainT
sampler2D _M
float4 _MainTex_ST;
float4 _Mask_ST;
float _WidthR
float _HeightR
v2f vert (appdata_t v)
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.texcoord = v.
o.color = v.
o.gray = dot(v.color, fixed4(1,1,1,0));
fixed4 frag (v2f i) : COLOR
col = tex2D(_MainTex, i.texcoord) * i.
col.a = col.a * tex2D(_Mask, float2((i.texcoord.x-_XOffset)/_WidthRate, (i.texcoord.y-(1-_YOffset))/_HeightRate)).a;
&Queue& = &Transparent&
&IgnoreProjector& = &True&
&RenderType& = &Transparent&
Lighting Off
ZWrite Off
Fog { Mode Off }
Offset -1, -1
ColorMask RGB
AlphaTest Greater .01
Blend SrcAlpha OneMinusSrcAlpha
ColorMaterial AmbientAndDiffuse
SetTexture [_MainTex]
Combine Texture * Primary
}好了。那么怎么使用这个Shader。我们需要多一个脚本来设置这个shader的参数。using UnityE
using System.C
[ExecuteInEditMode]
public class ScaleTexcoord : MonoBehaviour
private float offX;
private float offY;
private UIS
void Awake()
s = GetComponent&UISprite&();
wr = s.GetAtlasSprite().width * 1.0f / s.atlas.spriteMaterial.mainTexture.
offX = s.GetAtlasSprite().x * 1.0f / s.atlas.spriteMaterial.mainTexture.
hr = s.GetAtlasSprite().height * 1.0f / s.atlas.spriteMaterial.mainTexture.
offY = (s.GetAtlasSprite().y + s.GetAtlasSprite().height) * 1.0f / s.atlas.spriteMaterial.mainTexture.
public void Update()
s.atlas.spriteMaterial.SetFloat(&_WidthRate&, wr);
s.atlas.spriteMaterial.SetFloat(&_HeightRate&, hr);
s.atlas.spriteMaterial.SetFloat(&_XOffset&, offX);
s.atlas.spriteMaterial.SetFloat(&_YOffset&, offY);
}只要把这个脚本附在UISprite上即可。可以发现现在正常了。NGUI图集的材质变成了好了。这次真的可以好好庆祝下啦~~整个效果其实只用上面的Shader和那个ScaleTexcoord.cs即可。:
kakashi8841
排名:第1876名
投资与合作
二次创业中
喜欢火影、喜欢Java、喜欢Unity3D、喜欢游戏开发的都可以加入木叶村Q群:
(1)(39)(1)(2)(4)(17)(15)(20)(1)(3)(3)(39)(9)(2)(9)(2)(43)(2)(2)(2)(1)(4)(2)Unity3D学习笔记(一) 模型和贴图导入学习
发布时间: 10:32:36
  ( 19:41:57)
1.一般来说,unity3d中导入3ds max的模型以fbx格式为宜。不过即使3ds max导出.fbx文件时勾选了内嵌媒体,通常也无法在fbx模型导入unity时出现贴图。不过此时一般会生成fbx模型对应的materials文件夹(也即模型对应的材质球),无法出现贴图时,材质球是空的。此时可以把相关材质贴图图片放入unity后,将materials中的材质球赋予对应的材质贴图图片,此时模型即可得到贴图。需要注意的是,材质贴图图片可以为tga,但不可以是dds的,因为unity不能解析,dds文件可以用装了dds相关插件后的ps进行格式转换为tga。
2.轴向不统一问题的一种解决方法&&& 当模型预期的正向位置与引擎坐标轴Z轴位置不相同时要做处理。通常可以设置一个父级(cube和空GO都可以),然后让模型成为子物体。之后再保持父级旋转度不变的情况下改变模型旋转度等参数以正规化。之后脚本就附在父级上控制移动等。&&& 注意父级要手动添加rigidbody组件。模型默认没有collider,要手动添加。不过有时经常不添加模型collider,通过缩放父级的collider(缩放外表形态会改变模型大小,因此应该改collider),使父级collider能包裹住模型外表。
3.子弹洞,子弹血迹,红外光点的特效贴图不是必须要为带透明像素的png图片,一般都是背景为纯黑或者纯白的jpg图片即可。通过某些Shader可以把自动纯黑与纯白消除,使带这种贴图和Shader的平面Prefab出现边缘透明。
来源:/mzdbskipop/archive//3137474怎么任意裁剪图片,不通过采集像素点
如题,裁剪的范围不是横平竖直的。
要评论请先&或者&(原) 解读Unity中的CG编写Shader系列3——表面剔除与剪裁模式 | Imagination中文技术社区}

我要回帖

更多关于 unity3d烘焙光照贴图 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信