2016-09-01 10 views
0

私は今GLSLCGを学習し、このコードに遭遇しています: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; 
} 

私はXcodeで使用できるように、私はshaders.metalにこれらのコードを変換しています。しかし、outが何であるかわからなくて、Metalのシェーダでこの機能を使用できるように変更する方法はわかりません。

答えて

1

修飾子outは、値が関数によって書き込まれることを示します。これは、参照渡し(pass-by-reference)と似ていますが(正確にはそうではありません)。メタルに最も近いのは、アドレス空間のthreadのリファレンスです。メタルシェーディング言語の同等の関数宣言は次のようになります。

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

'var p = ...'とはどのように違うのですか?上記のコードで同様の結果が得られるようです。まだ理解していないことがあると思います。もう少し詳しく説明してください。ありがとう! – sooon

+0

少し読んだ後、 'thread'は処理のために値をスレッドに送りますか? – sooon

+0

これは、関数から複数の値を返す方法です。あなたは距離を返しているので、関数は戻り値を1つしか持てません。交差点を返すには、参照渡し変数を使用する必要があります。 – warrenm