unity导入的素材unity怎么把文件导入项目保持原样?

这里稍微解释一下unity导入图片素材的类型Default:默认的材质用贴图类型NormalMap:法线贴图,有一类贴图专门用于法线贴图,显示模型的细节Editor:用于unity编辑器里面自定义组件的按钮等UI的图片Sprite:用于UGUI制作的图片Cursor:光标图片Cookie:用于影子的制作LightMap:光照贴图,即本身加上了高照渲染的贴图,有时可以替代实时渲染的带影子的贴图WrapMode代表当纹理贴图的tiling大于1的时候 即即将缩小的时候 材质将要怎么做Repeat表示使用原图片填补缩小带来的空白区域Clamp代表使用重复的图片边缘像素来填补缩小带来的空白区域Mirror表示使用原图片的镜像图片(相当于原图翻转)填补缩小带来的空白区域MirrorOnce效果和Clamp一致,查看具体详情可以到官方文档PerAxis相当于图片的u方向(横向)和v方向(竖向)都可以进行上述的选项而彼此互不影响FilterMode表示过滤模式,能用来控制在放大的时候图像的清晰度Point模式在放大的时候清晰度是最低的,有点像素化的感觉,可以特意用来做像素游戏,性能当然是最好的Blinear模式是二线性 二线性比Point模式稍微好点 性能差点Trilinear是三线性 成像是最细的 是最耗性能的纹理贴图的代码如下// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader"TsinNing/Texcoord"{
Properties{
_texPlusC("TexPlusC", COLOR) = (1,1,1,1)
//指定纹理贴图
_MainTex("Main Tex", 2D) = "white"{}
}
SubShader{
Pass{
//需要定义正确的光照模式,才能得到正确的Unity内置光照变量
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
//相当于c#里面的using 包含unity关于光照的文件
#include "Lighting.cginc"
#pragma vertex vert
#pragma fragment frag
fixed4 _texPlusC;
sampler2D _MainTex;
//这个变量不用在properties声明,只要在properties里面声明有纹理贴图,系统会自动给这种格式的变量赋值
//赋值是四个浮点数 前两个是缩放,对应inspector面板的tiling 后两个是位移,对应inspector面板的offfset
//变量的名字格式是固定的前面是纹理贴图的变量名 后面固定加上_ST
float4 _MainTex_ST;
struct a2v {
float4 vertex:POSITION;
//在结构体a2v传入顶点函数的时候
//texcoord变量代表的是这个顶点对应纹理贴图的位置
//texcoord只能从顶点函数里面传入,传给片元函数需要顶点函数作为媒介
//texcoord在片源函数里面用于后面根据位置和贴图取得这个顶点的颜色
float4 texcoord:TEXCOORD0;
};
struct v2f {
float4 position:SV_POSITION;
float2 uv : TEXCOORD0;
};
v2f vert(a2v v)
{
v2f f;
//将顶点位置从模型空间转换到剪裁空间
f.position = UnityObjectToClipPos(v.vertex);
//将本身顶点的纹理坐标进行_MainTex_ST变量的offfset域的偏移
//将本身顶点的纹理坐标进行_MainTex_ST变量的tiling域的放缩
//例如xy域为2 2的时候 纹理贴图 变成原始大小的1/2
//这里注意缩放后的效果和图片素材的WrapMode有关
f.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
return f;
}
fixed4 frag(v2f f) : SV_Target{
//tex2D()这个函数根据传进去的UV坐标返回贴图上面和uv坐标对应的像素颜色
//第一个参数是纹理
//第二个参数是坐标 坐标只需要传xy即可
fixed3 texC = tex2D(_MainTex, f.uv.xy) * _texPlusC.rgb;
return fixed4(texC,1.0);
}
ENDCG
}
}
Fallback "Specular"
}
最后来张效果图吧~上一张纹理贴图的表面着色器代码,参考网址:Surface Shader examples
Shader "Example/Diffuse Texture" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
struct Input {
float2 uv_MainTex;
};
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
}
ENDCG
}
Fallback "Diffuse"
}
因为在 vertex shader 里,mesh上每个点(注意不是顶点,是mesh面上的所有点)并没有确定好在屏幕上的位置关系,所以uv并没有确定,自然 mipmap level 也无法确定,所以只能调用 tex2Dlod 接口,取0级的lod。

我要回帖

更多关于 unity怎么把文件导入项目 的文章