Как проверить, является ли элемент массива пустым в Cg? (Разработка шейдера Unity)
В моем шейдере я объявляю несериализованный массив float4s и выполняю блок кода на элементах:
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, но это, похоже, не работает.
1 ответ
Если вы не записываете значение в каждом кадре, то значение, которое было установлено последним, будет сохранено. В качестве альтернативы вы можете использовать массив значений int, которые соответствуют элементам _HandPos, подлежащим повторной обработке.
Имейте в виду, что оператор ветвления (например, if()) на GPU обычно заставляет GPU выполнять обе ветви, а затем отбрасывает одно значение - поэтому, если это должно быть оптимизацией, вероятно, он не будет иметь желаемый эффект.