《Unity Shader入门精要》总结 #第七章 基础纹理

本文是《Unity Shader入门精要》第七章的总结,详细介绍了纹理在Unity中的应用,包括单张纹理的实践与属性、凹凸映射的原理与实践,以及法线纹理在切线空间和世界空间下的计算。同时,讨论了渐变纹理和遮罩纹理的使用,如高度纹理、法线映射和遮罩纹理对模型颜色和光照的影响。
摘要由CSDN通过智能技术生成

使用纹理映射可以将一张图逐纹素地控制模型颜色。

纹理大小可变,但顶点UV坐标范围通常被归一化道[0,1]范围内

1、单张纹理

1.1 实践

【补充一下第三章Properties语义块支持的属性类型,之前忘记写自己还老分不清- -】

Properties{
    Name("display name", PropertyType) = DefaultValue
}
属性类型 默认值的定义语法 例子
Int number _Int("Int", Int) = 2
Float number _Float("Float", Float) = 1.5
Range(min, max) number _Range("Range", Range(0.0, 5.0)) = 3.0
Color (number, number, number, number) _Color("Color", Color) = (1, 1, 1, 1)
Vector (number, number, number, number) _Vector("Vector", Vector) = (2, 3, 6, 1)
2D "defaulttexture" {} _2D("2D", 2D) = ""{}
Cube "defaulttexture" {} _Cube("Cube", Cube) = "white"{}
3D "defaulttexture" {} _3D("3D", 3D) = "black"{}

 

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Unity Shaders Book/Chapter7/SingleTexture" {
	Properties{
		_Color("Color Tint", Color) = (1,1,1,1)		//控制物体整体色调
		_MainTex("Main Tex", 2D) = "white"{}
		_Specular("Specular", Color) = (1,1,1,1)
		_Gloss("Gloss", Range(8.0, 256)) = 20
	}
	SubShader{
		Pass{
			Tags{"LightMode" = "ForwardBase"}
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "Lighting.cginc"

			fixed4 _Color;
			sampler2D _MainTex;
			float4 _MainTex_ST;	//纹理名_ST,声明某个纹理的属性,得到缩放和平移值
								//_MainTex_ST.xy存储缩放值,即tilling,_MainTex_ST.zw存放偏移值即offset
			fixed4 _Specular;
			float _Gloss;

			struct a2v{
				float4 vertex : POSITION;
				float3 normal : NORMAL;
				float4 texcoord : TEXCOORD0;
			};

			struct v2f{
				float4 pos : SV_POSITION;
				float3 worldNormal : TEXCOORD0;
				float3 worldPos : TEXCOORD1;
				float2 uv : TEXCOORD2;
			};

			v2f vert(a2v v){
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.worldNormal = normalize(UnityObjectToWorldNormal(v.normal));
				o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
				o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
				//o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);

				return o;
			}

			fixed4 frag(v2f i) : SV_Target{
				fixed3 worldNormal = (i.worldNormal);
				fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
				fixed3 albedo = tex2D(_MainTex, i.uv).rgb * _Color.rgb;	//对纹理采样,需要被采样的纹理,float2型的纹理坐标
																		//反射率albedo
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
				fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
				
				fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
				fixed3 halfDir = normalize(worldLightDir + viewDir);
				fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(worldNormal, halfDir)), _Gloss);

				return fixed4(ambient + diffuse + specular, 1.0);
			}

			ENDCG
		}
		
	}
	Fallback "Specular"
}

另外关于

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值