5.Unity_Shader_Texcoord

1.基本的纹理属性以及注释

 

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

Shader "Ycb/Texture/Simple" {
	Properties {
		_Color ("Color", Color) = (1,1,1,1)
		_MainTex ("Albedo (RGB)", 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; // S缩放T平移。得到材质面板的纹理属性的细节
		float4 _Specular;
		float _Gloss;
		struct a2v{
			float4 vertex:POSITION;
			float3 normal:NORMAL;
			float4 texcoord:TEXCOORD0; //模型的第一组纹理坐标存储到该变量, 而v2f中的用于存储纹理坐标的uv,便于在偏远着色i中使用该坐标进行纹理采样
		};
		struct v2f{
			float4 pos:SV_POSITION;
			float3 worldNormal:TEXCOORD0;
			float3 worldPos :TEXCOORD1;
			float2 uv: TEXCOORD2;
		};
		v2f vert(a2v v){
			v2f o;
			o.pos =mul(UNITY_MATRIX_MVP,v.vertex);
			o.worldNormal=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);//第一个参数:顶点纹理坐标,第二个参数纹理名,实际用 纹理名_ST

			// 内置如下:
			//#define TRANSFORM_TEX(tex,name) (tex.xy* name##_ST.xy  + name##_ST.zw)
			return o;
		}

		fixed4 frag(v2f i):SV_Target{
			fixed3 worldNormal =normalize(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;

			//虽有使用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 "Diffuse"
}

这个报错的意思是这个着色器脚本中必须同时包含顶点着色器和片元着色器,但是它只找到了其中一个,所以编译失败。 为了解决这个问题,你需要在着色器脚本中同时包含顶点着色器和片元着色器的代码。你可以检查一下你的着色器脚本是否有缺失顶点着色器或片元着色器的部分。如果有,你需要将其添加到脚本中。 在这个着色器脚本中,你需要在Pass块中添加顶点着色器和片元着色器的代码。其中,顶点着色器的函数名为"vert",片元着色器的函数名为"frag"。你需要将这两个函数添加到Pass块中,并且在顶点着色器中对输入的顶点数据进行处理,并将处理后的数据传递给片元着色器进行渲染。 以下是修改后的代码: ``` Shader "Custom/URP Blinking" { Properties { _MainTex ("Texture", 2D) = "white" {} _Color ("Color", Color) = (1,1,1,1) _BlinkSpeed ("Blink Speed", Range(0.1, 10)) = 1 } SubShader { Tags {"Queue"="Transparent" "RenderType"="Opaque"} Pass { HLSLPROGRAM #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" CBUFFER_START(UnityPerMaterial) UNITY_DEFINE_PER_MATERIAL_MAIN_LIGHT_SHADOW(UnityPerMaterialShadow) float4 _Color; float _BlinkSpeed; float _Time; float4 _MainTex_ST; TEXTURE2D(_MainTex); SAMPLER(sampler_MainTex); CBUFFER_END struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { float4 tex = UnitySampleTexture(sampler_MainTex, _MainTex, i.uv * _MainTex_ST.xy + _MainTex_ST.zw); float t = _Time * _BlinkSpeed; float blink = sin(t) * 0.5 + 0.5; fixed4 col = lerp(_Color, float4(1,1,1,1), blink); return tex * col; } ENDHLSL CGPROGRAM #pragma vertex vert #pragma fragment frag ENDCG } } FallBack "Diffuse" } ``` 请注意,在这里,我们将顶点着色器和片元着色器的代码分别放置在了HLSLPROGRAM和CGPROGRAM标签中,并使用#pragma vertex和#pragma fragment指令来告诉Unity哪一个是顶点着色器,哪一个是片元着色器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值