您好,欢迎来到爱问旅游网。
搜索
您的当前位置:首页Unity Shader unity文档学习笔记(一):了解顶点片元shader构造以及写第一个shader

Unity Shader unity文档学习笔记(一):了解顶点片元shader构造以及写第一个shader

来源:爱问旅游网

首先创建一个shader 点击Create > Shader > Unlit Shader 创建顶点片头shader
B站的学习视频网址

Shader "Unlit/NewUnlitShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog
            
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }
}

这是默认会创建的
其中主要有几个必须要写的
一个是shader的名字和路径

Shader "Unlit/NewUnlitShader"

第二个是可以在显示面板下修改并影响shader

 Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }

第三个是Subshader 一个shader可以同时带有多个shader,这个先不管我们先只写一个SubShader就好了
SubShader里面要有Pass{} Pass里面写CGPROGRAM … ENDCG 所以shader代码都是写在这个CGPROGRAM … ENDCG中间
这个时候该说一下渲染流水线了 你只能通过修改顶点和片元着色器来干预物体的外观
每个工位想要修改什么都需要声明数据类型来接收数据
如:float4 vert (float4 vertex : POSITION)
这个意思是用float4 vertex接受上个工位传来的位置信息 用来修改后传给下个工位
其中 vert函数是干预顶点的shader 可以把一个平面做成曲面
frag函数 是干预着色的 就是干预颜色

 SubShader
	{
		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			float4 vert (float4 vertex : POSITION):POSITION
			{
				return  UnityObjectToClipPos(vertex);
			}
			fixed4 frag () : SV_Target
			{
				return fixed4(1.0,1.0,1.0,1.0);
			}
			ENDCG
		}
	}

第四个是 FallBack 这个是当所有shader都不能运行时执行的shader 也就是备胎

下面附上通过在控制面板修改颜色就能直接修改物体颜色的代码

Shader "Unlit/ChangeColor"
{
	//可以不存在Properties 但是必须存在SubShader 和 Pass 块
	Properties
	{
		_Color("Color",Color) =(1,1,1,1)
	}
	SubShader
	{
		Pass
		{
			CGPROGRAM
			//vertex顶点函数  这里只是声明了顶点函数的函数名  将顶点坐标从模型空间转换到剪裁空间
			#pragma vertex vert
			//fragment片元函数 返回模型对应屏幕上的每一个像素的颜色值
			#pragma fragment frag
			// make fog work
			struct appdata
			{
				float2 uv : TEXCOORD0;
			};
			fixed4 _Color;
			//POSITIN是一个语义 接受上个工位传来的位置信息
			//SV_POSITION也是一个语义 用来说明返回值 将返回值剪裁空间的坐标给系统
			//vert的返回值 float4是内置向量 (x, y, z, w);   float4 a; 访问单独成员a.x, a.y, a.z, a.w;
			float4 vert (float4 vertex : POSITION):SV_POSITION
			{
				return  UnityObjectToClipPos(vertex);
			}
			
			//frag 的返回值  fixed4 是内置向量(r, g, b, a);   fixed4 c; color.r, color.g, color.b, color.a;
			fixed4 frag () : SV_Target
			{
				return _Color;
			}
			ENDCG
		}
	}
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- awee.cn 版权所有 湘ICP备2023022495号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务