您当前的位置: 首页 >  unity

染指流年灬

暂无认证

  • 8浏览

    0关注

    194博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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。

关注
打赏
1665909078
查看更多评论
立即登录/注册

微信扫码登录

0.1033s