您当前的位置: 首页 >  unity

Unity学习shader笔记[六]纹理贴图

发布时间:2019-10-27 19:14:08 ,浏览量:8

这里稍微解释一下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。

关注
打赏
1688896170
查看更多评论

暂无认证

  • 8浏览

    0关注

    115984博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0430s