UnityShader(三)编写简单的顶点片元着色器

本文介绍了Unity Shader的基础知识,包括如何编写简单的顶点和片元着色器,使用结构体传递模型数据,以及通过Properties语义在Inspector面板控制颜色。讲解了UnityCG.cginc库文件的应用,以及CG/HLSL中的语义概念,如SV_POSITION、COLOR0等,并展示了如何通过ShaderLab属性类型控制颜色。

编写简单的顶点/片元着色器

下面是一个最基础的UnityShader代码。在一个UnityShader中,Properties语义并不是必须的,我们可以不声明任何材质属性。SubShader中的渲染设置和标签设置也不是必须的,在没有声明的情况下SubShader会使用默认的渲染设置和标签设置。

Shader "Unlit/class02"  
{
   
     
    SubShader  
    {
   
     
        Pass  
        {
   
     
            CGPROGRAM  
			// 下面两行代码将告诉Unity,哪个函数包含了顶点着色器,哪个函数包含了片元着色器
            #pragma vertex vert // 顶点着色器
            #pragma fragment frag // 片元着色器  
  
            // POSITION和SV_POSITION都是语义,分别指明输入的四维数和返回的四维数是什么类型  
            // POSITION存储模型空间坐标 SV_POSITION存储裁剪空间坐标  
            float4 vert(float4 v:POSITION):SV_POSITION  
            {
   
     
				// 把顶点坐标从模型空间转换到裁剪空间
                return UnityObjectToClipPos(v);  
            }  
  			// 片元着色器中的代码返回了一个表示白色的float4类型的变量,并将输出的颜色存储到一个渲染目标中
            fixed4 frag():SV_TARGET
            {
   
     
                return fixed4(1,1,1,1);  
            }  
            ENDCG  
        }  
    }  
}

最后的效果显示为一个白色的球


在上面的代码中,我们用POSITION语义获取到了模型的顶点位置,但如果要获取到更多的模型数据怎么办呢?同样的,有时我们也想从顶点着色器输出一些数据,如法线、纹理坐标等传递给片元着色器,这时又该怎么办呢?

我们很容易想到,可以将参数封装成一个类或结构体。Unity Shader中没有类的概念,但结构体是有的。

下面是结构体的应用:

Shader "Unlit/class03"  
{
   
     
    SubShader  
    {
   
     
        Pass  
        {
   
     
            CGPROGRAM  
            #pragma vertex vert  
            #pragma fragment frag  
  
            // 输入结构体  
            struct a2v  
            {
   
     
                float4 v:position;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值