当前位置: 首页 > news >正文

Unity-Shader-SubShader CG代码块

系统函数 

由系统调用,与Unity生命周期中的Start(),UpDate函数类似

1、简介

顶点函数,将顶点在模型空间的坐标转换为屏幕坐标(模型坐标转剪裁空间)

片元函数:对每一片元(像素)计算其颜色

SubShader{pass{    CGPROGRAM
//函数声明
#program vertex vert
#program fragment frag函数定义xxx vert(xxx){}xxx frag(xxx){}ENDCG}}FallBack "Diffuse"

需要先声明函数,再定义函数

声明函数

#program+函数类型名,自定义的函数名

vertex:顶点函数

fragment:片元函数

#program vertex vert

定义函数

这两个函数均有返回值和传入参数,返回值在函数名前,参数在函数名后的括号内

返回值 vert(参数)
{
}

2、具体介绍

顶点函数

示例为将模型空间转换为剪裁空间的简单操作(MVP变换)

语义说明:传入的参数v通过 : POSITION告知系统将模型坐标传入v,函数通过:SV_POSITION告知系统函数的返回值为裁剪空间下的顶点坐标

float4 vert(float4 v : POSITION) :SV_POSITION
{return mul(UNITY_MATRIX_MVP,v);
}

mul自带方法:矩阵相乘

UNITY_MATRIX_MVP:宏定义的MVP的变换矩阵

为了方便起见,一般会把传入的参数与输出的值做成两个结构体分别储存

//application to vertex
struct a2v{float4 vertex :POSITION;//模型空间下的顶点的位置float3 normal :NORMAL; //模型空间下的法线向量float4 texcoord :TEXCOORD0; // 纹理坐标
}//vertex to fragment
struct v2f{float4 position :SV_POSITION;
}

!注意:如果要把输出的值集合成一个结构体的话,结构体的成员变量必须是带有语义的类型

上述顶点函数就可以改成

v2f vert(a2v v)
{v2f f;f.position = mul(UNITY_MATRIX_MVP,v.normal);return f;
}

片元函数

示例为将模型的每个片元的颜色设置为白色

语义说明:函数通过:SV_Target告知系统函数的返回值为每个片元的颜色值

fixed4 frag() :SV_Target
{return fixed4(1,1,1,1);
}

可以利用fixed4 节约空间,fixed 类型值范围为-2~2.

3、顶点函数与片元函数的通信

如果想把顶点函数中所用到的参数(例如normal),或者是计算出来的值用在frag函数中,我们可以利用之前构建的结构体。在顶点函数中给结构体的成员变量赋值,再将结构体传入片元函数中。

下面是传输法线(normal)的示例:

先在v2f结构体中增加成员变量

struct v2f{float4 position :SV_POSITION;float3 temp : COLOR0;
}

因为v2f作为顶点函数的返回值,其成员变量必须带有语义。这里我们先用COLOR0作为语义

在顶点函数中赋值 

v2f vert(a2v v)
{v2f f;f.position = mul(UNITY_MATRIX_MVP,v,normal);f.temp = v.normalreturn f;
}

在片元函数中调用:

fixed4 frag(v2f f) :SV_Target
{return fixed4(f.temp,1);
}

因为顶点数量与片元数量并不一致(一般是片元数大于顶点数),所以片元函数的返回值会是根据顶点自动插值后的结果。

为什么两个不同的v2f可以传递数据:事实上需要传递的数据通过语义存在了系统里,我们只是通过v2f调用存储在系统中的数据。


http://www.mrgr.cn/news/51432.html

相关文章:

  • 例行性工作(at,crontab)
  • 【Linux】了解pthread线程库,清楚并没有线程创建接口,明白Linux并不存在真正意义的线程(附带模型图详解析)
  • OGG错误:ORA-28000:the account is locked
  • js实现简单的【发布者-订阅者模式】
  • 工信部 | 信息技术应用创新人才证书哪个科目好考?
  • 栈的压入、弹出序列
  • vector使用与实现
  • 基于华为昇腾910B,实战 InternLM2.5-7B-Chat 模型推理
  • 还在百度搜PDF工具,完全免费的神器推荐给你-PDF24工具箱!
  • Vue2组件
  • 神经网络模型量化代码解析
  • Docker常用命令分享二
  • DC系列靶机-DC5
  • Unity3D 游戏性能优化全流程建设详解
  • 基于Arduino做的“鱿鱼游戏”BOSS面具,支持动作检测
  • 对接优惠折扣影票接口有什么好处?
  • 一款极高性价比的高性能CMOS低压差线性稳压器——ADM7172深度解析与应用简介
  • [vue2] 由mapbox2升级为mapbox3遇到的矢量底图样式丢失问题解决办法
  • linux下编译鸿蒙版boost库
  • PG 17 增量备份功能介绍