2016-09-01 3 views
0

Я учусь GLSL и CG сейчас и пришли через этот код:GLSL - `out` в аргументе

float trace(vec3 origin, vec3 direction, out vec3 p) //<-- What is "out"? 
{ 
    float totalDistanceTraveled = 0.0; 
    for(int i=0; i <64; ++i) 
    { 
     p = origin + direction * totalDistanceTraveled; 
float distanceFromPointOnRayToClosestObjectInScene = map(p); 
     totalDistanceTraveled += distanceFromPointOnRayToClosestObjectInScene; 

     if(distanceFromPointOnRayToClosestObjectInScene < 0.0001) 
     { 
      break; 
     } 

if(totalDistanceTraveled > 10000.0) 
     { 
      totalDistanceTraveled = 0.0000; 
      break; 
     } 
    } 

    return totalDistanceTraveled; 
} 

Я уверен, преобразование кода в эти shaders.metal, так что я могу использовать с Xcode. Но я не уверен, что такое out и как его изменить, чтобы я мог использовать эту функцию в своем шейдере в Metal.

ответ

1

Квалификатор out означает, что значение будет записано функцией. Он похож на (но не совсем как) по-ссылке. Ближайшим эквивалентом в Metal является ссылка в адресном пространстве thread. Обозначение эквивалентной функции в Metal Shading Language выглядит следующим образом:

static float trace(float3 origin, float3 direction, thread float3 &p); 
+0

Насколько это отличается от 'var p = ...'? мне кажется, что получится аналогичный результат в коде выше. Я считаю, что у него есть кое-что, что я еще не понял. Пожалуйста, уточните немного больше. Благодаря! – sooon

+0

После небольшого чтения, 'thread' отправляет значение в поток для обработки? – sooon

+0

Это способ возврата нескольких значений из функции. Поскольку вы возвращаете расстояние, и функции могут иметь только одно возвращаемое значение, «возврат» точки пересечения требует использования переменной «перекрестная ссылка». – warrenm

Смежные вопросы