关于UnityShader中的V2F_SHADOW_CASTER内置宏

在学习阴影的时候,遇到了这个宏,并不知道这是干什么的,只知道它用在v2f结构体中,

可以在UnityCG.cginc中找到这个宏的唯一一处定义

在其他位置(UnityCG.cginc include的三个其他三个cginc

#include "UnityShaderVariables.cginc"
#include "UnityShaderUtilities.cginc"
#include "UnityInstancing.cginc"
)中都不能找到这定义个宏的定义,百度了一下,查不到详细的说明,Unity的手册上也搜不到这个宏的说明。

那么只能自己在UnityCG.cginc中找一些线索

 

回到定义V2F_SHADOW_CASTER的那一行,可以看到在声明的时候,又使用了另外两个宏,V2F_SHADOW_CASTER_NOPOS和UNITY_POSITION(pos)

在其他地方可以找到V2F_SHADOW_CASTER_NOPOS的定义

虽然目前还不知道什么是SHADOWS_CUBE,和SHADOWS_CUBE_IN_DEPTH_TEX,但是目前应该没用到,所以目前这个宏是下面的那个,是空的。

再来搜第二个宏UNITY_POSITION,同样没有其他地方的声明。那么只能靠删除V2F_SHADOW_CASTER这个宏来看看会有什么错误。

关注第二个错误,第一个错误应该是Unity2018的一个bug,先暂时不管。可以看到Invalid subscript 'pos' 的错误,那也就是说我们没有在v2f结构体中声明pos这个变量。那接下来声明出这个变量

可以看到没有错误了,不过目前还有一个问题,没看到阴影。一般来说SV_POSITION是v2f结构体中重要的参数,那么改成它试试

嗯,可以看到阴影正常显示了,那么基本上可以得出一个结论:

在没有使用SHADOWS_CUBE,或者使用了SHADOWS_CUBE_IN_DEPTH_TEX(虽然目前并不知道这两个是干什么的)时,V2F_SHADOW_CASTER等于float4 pos:SV_POTISION;而在使用SHADOWS_CUBE并且不使用SHADOWS_CUBE_IN_DEPTH_TEX时,V2F_SHADOW_CASTER等于float4 pos:SV_POTISION;float3 vec : TEXCOORD0;

也同时可以得出一个额外的结论,UNITY_POSITION(pos)等于 float4 pos:SV_POTISION;

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Unity内置着色器经常使用UNITY_VPOS_TYPE枚举类型,它表示当前顶点的坐标空间类型。以下是一个使用UNITY_VPOS_TYPE的实例: ```hlsl v2f vert(appdata_base v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); #if defined(UNITY_PASS_FORWARDBASE) || defined(UNITY_PASS_FORWARDADD) UNITY_SETUP_INSTANCE_ID(v); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); o.worldPos = mul(unity_ObjectToWorld, v.vertex); o.worldNormal = UnityObjectToWorldNormal(v.normal); o.screenPos = ComputeScreenPos(o.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); #if defined(_ALPHATEST_ON) o.alpha = v.color.a; #endif #elif defined(UNITY_PASS_SHADOWCASTER) o.worldPos = mul(unity_ObjectToWorld, v.vertex); #endif return o; } ``` 在这个顶点着色器函数,我们可以看到在#if defined(UNITY_PASS_FORWARDBASE) || defined(UNITY_PASS_FORWARDADD)条件下,我们通过UNITY_SETUP_INSTANCE_ID(v)和UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o)来设置实例ID和立体视图,然后根据UNITY_VPOS_TYPE的不同,我们可以对o.worldPos和o.vertex进行不同的计算。在这个例子,我们通过UnityObjectToClipPos(v.vertex)来将顶点坐标从对象空间转换到裁剪空间,并将结果保存在o.vertex。 需要注意的是,UNITY_VPOS_TYPE枚举类型的取值是根据渲染管线的不同而不同的。在顶点着色器,我们需要根据当前的渲染管线类型来确定UNITY_VPOS_TYPE的取值,以正确地计算顶点的位置和法线等信息。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值