Shader_模型数据从哪里来006

版权声明:本文为博主原创文章,未经博主允许不得转载。博客地址:http://blog.csdn.net/yy763496668 https://blog.csdn.net/yy763496668/article/details/82620726

在《 Shader_vert和frag函数的学习004》中我们我们使用POSITION语义得到了模型的顶点位置,如果我们想得到更多的模型数据该怎么办呢?比如我们想得到每个顶点的纹理坐标和法线方向。纹理坐标访问纹理,法线可用于计算光照,因此我们要为顶点着色器定义一个新的输入参数,这个参数不再是一个简单的数据类型,而是一个结构体。修改代码如下:

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

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
//漫反射
// 逐顶点光照
Shader "yy/SimpleShader" {
    SubShader{
        Pass{
            CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                //定义一个结构体来定义顶点着色器的输入
                //把数据从应用阶段传递到顶点着色器中
                struct a2v{
                    //POSITION告诉Unity 用模型空间的顶点坐标填充vertex变量
                    float4 vertex:POSITION;
                    //NORMAL告诉Unity 用模型空间的顶点坐标填充normal变量
                    float3 normal:NORMAL;
                    //TEXCOORD0告诉Unity 用模型空间的顶点坐标填充texcoord变量
                    float4 texcoord:TEXCOORD0;
                }

                float4 vert(a2v v):SV_POSITION{
                    //使用v.vertex来访问模型空间的顶点坐标
                    return UnityObjectToClipPos(v.vertex);
                }
                fixed4 frag():SV_Target
                {
                    return fixed4(1.0,1.0,1.0,1.0);
                }
            ENDCG
        }

    }
}

POSITION 、NORMAL、TEXCOORD0等语义是由材质的MeshRender组件提供的。在每一帧调用DrawCall的时候,MeshRender组件会把负责渲染的模型数据发送给UnityShader。

猜你喜欢

转载自blog.csdn.net/yy763496668/article/details/82620726