您当前的位置: 首页 > 

果冻喜之郎

暂无认证

  • 2浏览

    0关注

    79博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

shader编程6

果冻喜之郎 发布时间:2021-08-12 16:37:02 ,浏览量:2

表面着色器

表面着色器编译指令

就像任何其他着色器一样,表面着色器放置在 CGPROGRAM..ENDCG 代码块内。不同之处在于:

  • 它必须放在 SubShader 代码块内,不能在 Pass 内。表面着色器本身将编译为多个通道。
  • 它使用 #pragma surface ... 指令来指示自己是表面着色器。

#pragma surface 指令为:

# pragma surface surfaceFunction lightModel [optionalparams]

表面着色器的标准输出结构:

struct SurfaceOutput
{
    fixed3 Albedo;  // 漫射颜色
    fixed3 Normal;  // 切线空间法线(如果已写入)
    fixed3 Emission;
    half Specular;  // 0..1 范围内的镜面反射能力
    fixed Gloss;    // 镜面反射强度
    fixed Alpha;    // 透明度 Alpha
};

 内置标准光照模型:

struct SurfaceOutputStandard
{
    fixed3 Albedo;      // 基础(漫射或镜面反射)颜色
    fixed3 Normal;      // 切线空间法线(如果已写入)
    half3 Emission;
    half Metallic;      // 0=非金属,1=金属
    half Smoothness;    // 0=粗糙,1=平滑
    half Occlusion;     // 遮挡(默认为 1)
    fixed Alpha;        // 透明度 Alpha
};

标准镜面反射光照模型:

struct SurfaceOutputStandardSpecular
{
    fixed3 Albedo;      // 漫射颜色
    fixed3 Specular;    // 镜面反射颜色
    fixed3 Normal;      // 切线空间法线(如果已写入)
    half3 Emission;
    half Smoothness;    // 0=粗糙,1=平滑
    half Occlusion;     // 遮挡(默认为 1)
    fixed Alpha;        // 透明度 Alpha
};

例子:

Shader "Custom/test9"
{
    Properties
    {
        _Color ("Color",Color) = (0,0,0,0)    //漫反射颜色
        _MainTex ("Texture",2D) = "White"{}    //纹理贴图
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows
        
        struct Input
        {
            float2 uv_MainTex;
        };

        float4 _Color;
        sampler2D _MainTex;


        void surf (Input IN, inout SurfaceOutputStandard o)
        {
           o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb * _Color.rgb;    //cube既有颜色又有材质贴图
        }
        ENDCG
    }
    FallBack "Diffuse"
}

法线贴图:

Shader "Custom/test9"
{
    Properties
    {
        _NormalMap ("NormalMap",2D) = "bump"{}  //凹凸贴图
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows
        
        struct Input
        {
            float2 uv_MainTex;
        };

        sampler2D _NormalMap;

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
           o.Normal = UnpackNormal(tex2D(_NormalMap,IN.uv_MainTex)); //将法线贴图的像素转换为法线
        }
        ENDCG
    }
    FallBack "Diffuse"
}

 

关注
打赏
1655963140
查看更多评论
立即登录/注册

微信扫码登录

0.0495s