Как проверить, является ли элемент массива пустым в 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 выполнять обе ветви, а затем отбрасывает одно значение - поэтому, если это должно быть оптимизацией, вероятно, он не будет иметь желаемый эффект.

Другие вопросы по тегам