顶点着色器输出和片元着色器输入顶点需要输出的最终裁剪空间位置

顶点着色器输出和片元着色器输入顶点需要输出的最终裁剪空间位置

顶点着色器输出和片元着色器输入

顶点着色器需要输出顶点的最终裁剪空间位置unity 顶点着色器3D角色,以便 GPU 知道屏幕上的栅格化位置以及深度。此输出需要具有 SV_POSITION 语义3D道具,并为 float4 类型。

顶点着色器生成的所有其他输出(“插值器”或“变化”)都是您的特定着色器需要的。从顶点着色器输出的值将在渲染三角形的面上进行插值,并且每个像素的值将作为输入传递给片元着色器。

许多现代 GPU 并不真正关心这些变量的语义;然而,一些旧系统(最主要的是 Direct3D 9 上的着色器模型 2 GPU)存在关于语义的特殊规则:

为了获得最佳的跨平台支持unity 顶点着色器,应将顶点输出和 片元输入标记为 TEXCOORDn 语义。

这样每个片元的颜色都会不同

            //可以使用结构体来定义顶点着色器函数的输入数据
            struct a2v
            {
                float4 vertex:POSITION;
                float3 normal:NORMAL;//NORMAL 表示模型空间中的顶点法线
            };
            //返回值也可以使用结构体
            struct v2f
            {
                float4 pos:SV_POSITION;  //投影空间的顶点位置
                fixed3 color:COLOR0;    //颜色
            };
            v2f vert (a2v v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.color = v.normal * 0.5 + fixed3(0.5,0.5,0.5);  //v.normal范围为-1~1,乘0.5再加0.5,最后color为0~1
                return o;
            }

Shader "ShaderLab学习/Shader03"
{
    //属性,这里是暴露给外部交互的属性,可以是图片,颜色,数值等等
    Properties
    {
        //类比C++中定义变量的格式
        //color _Color = ragb(1.0,1.0,1.0,1.0);//颜色
        //属性定义的方式
        //属性名("属性说明",属性类型) = 属性默认值
        _Color("颜色",color) = (1.0,1.0,1.0,1.0)
        //Range是float类型以范围的方式用滑块条表现的特殊形式
        _Light("亮度",Range(0,1)) = 1.0
    }
    SubShader
    {
        //渲染标记,此处是将渲染的物体标记为不透明物体 
        Tags { "RenderType"="Opaque" }
        LOD 100
        //UnityShaderLab中LOD的作用
        //https://blog.csdn.net/linjf520/article/details/117651726
        //一个pass表示一次渲染的过程,一个subshader中可以有多个pass
        Pass
        {
            //表示开始shader代码编程
            CGPROGRAM
            //指定顶点着色器函数 vert
            #pragma vertex vert
            //指定片元着色器函数 frag 
            #pragma fragment frag
            //如果在属性中写了属性值,需要在这里定义同名的变量才能在Shader中使用
            fixed4 _Color;
            half _Light;
            /*
            fixed half float 都表示浮点数
            float 单精度浮点数
            half 表示的是半精度浮点数
            fixed 定点数
            浮点数后面跟数字表示有多少个浮点数
            float  一个浮点数
            float2 表示两个浮点数 也可以表示二维向量 float2 a; a.x a.y 分别访问对应float
            float3x3 可以人为是二维数组也可以是矩阵
            */
            //可以使用结构体来定义顶点着色器函数的输入数据
            struct a2v
            {
                float4 vertex:POSITION;
                float3 normal:NORMAL;//NORMAL 表示模型空间中的顶点法线
            };
            //返回值也可以使用结构体
            struct v2f
            {
                float4 pos:SV_POSITION;  //投影空间的顶点位置
                fixed3 color:COLOR0;    //颜色
            };
            v2f vert (a2v v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.color = v.normal * 0.5 + fixed3(0.5,0.5,0.5);  //v.normal范围为-1~1,乘0.5再加0.5,最后color为0~1
                return o;
            }
            //指定的片元着色器
            //SV_Target 表示最后输出的颜色
            fixed4 frag (v2f i) : SV_Target
            {
                return fixed4(i.color,1.0);
            }
            ENDCG
        }
    }
}

最后效果

文章来源:https://blog.csdn.net/m0_69722751/article/details/130220248