(五)计算机图形学 之 Shader 2.0 结构 与 语义(顶点片元着色器)

Shader1.0 和 Shader2.0 的区别:
不同点: 2.0 可以实现编程
相同点: 渲染管线一样

顶点片元着色器:

1.控制灵活,但是不能参与光照计算;
2.在着色器中插入Cg代码段,编写在CGPROGRAM 与 ENDCG之间;
3.编译指令:#pragma 控制 着色器代码编译;
                   #pragma vertex name 将名为name的函数编译为顶点着色器(入口函数);
                   #pragma fragment name 将名为name的函数编译为片元(像素)着色器((入口函数);
4.参数和返回值由语义修饰

Shader 2.0 编写 详解:

#pragma vertex vert        // 定义一个顶点着色器的 入口函数
#pragma fragment frag // 定义一个片段着色器的 入口函数
pragma  关键字
vertex 关键字
fragment 关键字
vert 变量名
frag 变量名

#include “UnityCG.cginc”  // 引入一个cg库
include  关键字

v2f vert (appdata v)
appdata  : 从 meshrender 里面获取来的
v2f : 顶点着色器的  输出值  片段着色器的 输出值


常用语义:
1.POSITION:  获取模型顶点的信息(位置)。
2.TANGENT:获取切线信息。
3.NORMAL: 获取法线信息。
4.TEXCOORD (n  也称UV): 高精度的 从 顶点传递信息 到 片段着色器。(float2 float3 float4)
        TEXCOORD0:第一套纹理
        TEXCOORD1:第二套纹理
        TEXCOORD2:第三套纹理
5.COLOR: 颜色,低精度 从顶点传递信息 到 片段着色器。(float4)
6.SV_POSITION: 表示 已经经过 mvp 矩阵 转换到 屏幕坐标的位置。
7.SV_TARGET:  输出到 哪个 render target、

 
顶点着色器 从 fbx 获取 信息(Unity 默认定义好的几个顶点着色器获取信息):

struct appdata_base 
{
    float4 vertex:POSITION;
    float3 normal: NORMAL;
    float4 texcoord:TEXCOORD0;
    UNITY_VERTEX_INPUT_INSTANCE_ID
};

struct appdata_tan
{
    float4 vertex:POSITION;
    float4 tangent:TANGENT;
    float3 normal: NORMAL;
    float4 texcoord:TEXCOORD0;
    UNITY_VERTEX_INPUT_INSTANCE_ID
};

struct appdata_full
{
    float4 vertex:POSITION;
    float4 tangent:TANGENT;
    float3 normal: NORMAL;
    float4 texcoord:TEXCOORD0;
    float4 texcoord1:TEXCOORD1;
    float4 texcoord2:TEXCOORD2;
    float4 texcoord3:TEXCOORD3;
    fixed4 color: COLOR;
    UNITY_VERTEX_INPUT_INSTANCE_ID
};

编写详解(博主用CG为例  ):

pass
{
    CGPROGRAM
    #pragma vertex vert       
    #pragma fragment frag
    #include “UnityCG.cginc”

    struct appdata    // 自定义 一个顶点获取信息
    {
        float4 vertex: POSITION;
        float2 uv: TEXCOORD0;
    };

    struct v2f    // 定义一个返回顶点获取信息
    {
        float2 uv: TEXCOORD0;
        float4 vertex : SV_POSITION; 
    };

    v2f vert (appdata_base v)  // ( 这么用的是Unity 已经定义好的 顶点获取信息,无需在本类中再次定义)
    v2f vert (appdata v)  // 顶点着色器入口
    {
        v2f o;
        o.vertex = mul(RNITY_MSTRIX_MVP,v.vertex);
        o.uv = v.uv;
        return o;
    };

    sampler2D _MainTex;

    fixed4 frag (v2f l): SV_Target   // 片段着色器入口
    {
        fixed4 col = tex2D(_MainTex, l.uv);
        col = l - col;
        return col;
    };
    ENDCG
}

学习完成的第一个shader:

Shader "GFSudy/Myshader"
{
    //属性 可以在编辑器中查看和修改
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
    }
    SubShader
    {
		Pass{
			CGPROGRAM  // 插入Cg代码的开始
			#pragma vertex my_vert // 把my_vert作为顶点Shader的入口
			// 如何获取上一个模块的参数呢?: 语义绑定bind  输入输出
			float4 my_vert(float4 pos:POSITION):POSITION
			{
				return UnityObjectToClipPos(pos);
			}

			#pragma fragment my_frag // 把my_frag作为片元Shader的入口
			fixed4 my_frag():COLOR
			{
				return fixed4(1.0,0.0,0.0,1.0);  //这里直接把颜色设置为了红色
			}

			ENDCG	// 插入Cg代码的结束
		}
    }
    FallBack "Diffuse"
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GarFe-Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值