您当前的位置: 首页 > 

果冻喜之郎

暂无认证

  • 2浏览

    0关注

    79博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

shader编程2

果冻喜之郎 发布时间:2021-08-11 14:12:27 ,浏览量:2

固定渲染管线

新建Image Effect Shader

Shader "Custom/text2"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {

        Pass
        {
            SetTexture [_MainTex] {    //设置贴图材质
                combine Texture * Previous 
            }
        }
    }
}

此时cube上有贴图材质但并没有光照效果

添加代码   < Lighting On > 以打开光照,< Material >设置光照类型

Shader "Custom/text2"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Color ("Color",Color) = (1,1,1,1)  //物体反射的颜色
    }
    SubShader
    {
        Lighting on
        Material{
            Diffuse [_Color] //漫反射
        }

        Pass
        {
            SetTexture [_MainTex] {
                combine Texture * Previous 
            }
        }
    }
}

光照类型:

  • 自发光(emissive)

  这部分用于描述当给定一个方向时,模型表面会向该方向发射多少的辐射量。当没有使用全局光照时,这些自发光表面不会照亮周围物体,只是本身看起来更亮而已。

  • 高光反射(specular)

  这个部分用于描述当光线从光源照到模型表面时,模型镜面反射产生的光。

  • 漫反射(diffuse)

  这个部分用于描述当光线从光源照到模型表面时,模型向各个方向产生的光。

  • 环境光(ambient)

  这个部分用来描述其他间接的光。  

可编程渲染管线

与固定渲染管线不同之处在于,可编程渲染管线可以在 CGPROGRAM ... ENDCG 间定义渲染逻辑

Shader "Costom/text3"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        // No culling or depth
        Cull Off ZWrite Off ZTest Always

        Pass
        {
            CGPROGRAM
            #pragma vertex vert    //vertex表示顶点,vert表示方法名称
            #pragma fragment frag    //fragment表示片段,frag表示方法名称

            #include "UnityCG.cginc"    //引用库文件

            struct appdata    //结构体类型,数据由meshrender传递
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)    //顶点着色器执行的方法
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);    //把顶点位置坐标转换为相机坐标
                o.uv = v.uv;
                return o;
            }

            sampler2D _MainTex;    //与Property中的_MainTex相同,在Property中声明变量,要在此处进行引用

            fixed4 frag (v2f i) : SV_Target    //片段着色器执行的方法
            {
                fixed4 col = tex2D(_MainTex, i.uv);    //获取纹理中像素的值
                // just invert the colors
                col.rgb = 1 - col.rgb;
                return col;
            }
            ENDCG
        }
    }
}

要访问不同的顶点数据,您需要自己声明顶点结构,或者将输入参数添加到顶点着色器。顶点数据由 Cg/HLSL 语义标识,并且必须来自 以下列表:

  • POSITION 是顶点位置,通常为 float3 或 float4
  • NORMAL 是顶点法线,通常为 float3
  • TEXCOORD0 是第一个 UV 坐标,通常为 float2float3 或 float4
  • TEXCOORD1TEXCOORD2 和 TEXCOORD3 分别是第 2、第 3 和第 4 个 UV 坐标。
  • TANGENT 是切线矢量(用于法线贴图),通常为 float4
  • COLOR 是每顶点颜色,通常为 float4

先执行顶点着色器,再执行片段着色器 

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

微信扫码登录

0.0484s