如何检查 Cg 中的数组元素是否为空? (Unity着色器开发)
How do I check if an array element is empty in Cg? (Unity shader development)
在我的着色器中,我声明了一个非序列化的 float4 数组并对元素执行了一段代码:
uniform float4 _HandPos[5];
v2f vert(appdata v)
{
float distH;
for (float i = 0; i < _HandPos.Length; i++)
{
/*if element has not been assigned, assuming an empty element is NaN,
check distance between vertex and element*/
if (!isnan(_HandPos[i]))
{
distH = distance(_HandPos[i], v.vertex);
}
//do something with distH here
}
}
每帧,C# 脚本中的数组都会发送到 _HandPos。它并不总是为所有 5 个元素发送值,所以我必须过滤掉空的元素。在这里,我假设一个空元素是 NaN,但这似乎不起作用。
如果您不在每一帧中写入一个值,那么最后设置的任何值都将被保留。或者,您可以使用与需要重新处理的 _HandPos 元素相对应的 int 值数组。
请记住,GPU 上的分支语句(例如 if())通常会导致 GPU 执行两个分支然后丢弃一个值——因此如果这是一种优化,它可能是不会有预期的效果。
在我的着色器中,我声明了一个非序列化的 float4 数组并对元素执行了一段代码:
uniform float4 _HandPos[5];
v2f vert(appdata v)
{
float distH;
for (float i = 0; i < _HandPos.Length; i++)
{
/*if element has not been assigned, assuming an empty element is NaN,
check distance between vertex and element*/
if (!isnan(_HandPos[i]))
{
distH = distance(_HandPos[i], v.vertex);
}
//do something with distH here
}
}
每帧,C# 脚本中的数组都会发送到 _HandPos。它并不总是为所有 5 个元素发送值,所以我必须过滤掉空的元素。在这里,我假设一个空元素是 NaN,但这似乎不起作用。
如果您不在每一帧中写入一个值,那么最后设置的任何值都将被保留。或者,您可以使用与需要重新处理的 _HandPos 元素相对应的 int 值数组。
请记住,GPU 上的分支语句(例如 if())通常会导致 GPU 执行两个分支然后丢弃一个值——因此如果这是一种优化,它可能是不会有预期的效果。