ノード逆引き

目的 ノード 備考
色被り補正 Mono to RGB
ノーマルマップ作成 Hight to Normal

OpenCL

OpenCL for VEX users

構文逆引き

floatでabs fabs
剰余(floatで) fmod
剰余 %
exp eを底する指数関数計算
2x2(mat4) と 2 の掛け算 mat2vecmul( float4 , float2 ) //#import “matrix.h”
3Dの軸回転 q.xy = mat2vecmul( tyb_rot2D( T ) , q.xy );
fract fract( x ) = mod( x , 1.0f );

サンプルコード

#bind layer src float3
#bind layer !&dst float3

#import "matrix.h"
#import "任意のパスでオリジナルのライブラリも読める/tyb.h"

#define ITERATIONS 128.0f

//Distance to the scene
float map(float3 p,float T){
    float3 spherePos = (float3)(sin(T)*3.0,0,0);
    float sphere = tyb_Sphere(p - spherePos,0.25f);
    
    //回転のサンプル
    float3 q = p;
    q.y -= T * 2.0f;
    q.xy = mat2vecmul(tyb_rot2D(T*0.25),q.xy);
        
    //繰り返しのfractと位置補正
    q = tyb_fract3(q) - (float3)(0.5,0.5,0.5);
    
    //繰り返しのスペーシング
    q.xy = ( tyb_fract2(q.xy) - (float2)(0.5,0.5));
    q.z = fmod(q.z,0.275f) - 0.125;
    
    //最後に割っているのは掛け算と同値で、表示バグを回避するためのもの
    float box = tyb_Box(q * 6.1f,(float3)(0.75,0.75,0.75)) / 6.1f;
    float ground = q.y + 0.65;
    return min(ground,tyb_sMin(sphere,box,0.85));
}

@KERNEL
{
    float T = (float)(@Time);   
    //ray marchの時のuv設定
    float2 uv = ((float2)(@ixy.x,@ixy.y) * (float2)(2.0f,2.0f) - (float2)(@res.x,@res.y)) / (float2)(@res.y,@res.y);
    // Initialization
    //ray origin = カメラ位置
    float3 ro = (float3)(sin(T), 0.0f, -3.0f);

    //ray direction = 光源方向 uv を使うことで各ピクセルが画面の中心から広がる固有の光線方向を持つようになる
    float3 rd = normalize((float3)(uv.x,uv.y, 1.0f));
    
    //final pixel color
    float3 col = (float3)(0.0f,0.0f,0.0f);
    float3 col2 = @src;
    
    
    //total distance travelled ポイントがカメラの原点から移動した現在の距離を追跡する。初期値は0 ray marchのmarch
    float t = 0.0f;
    
    //Raymarching
    for(float i=0.0f;i<ITERATIONS;i+=1.0f){
        //オブジェクトに当たるまでループするところ
        float3 p = ro + rd * (float3)(t,t,t);
        
        //ゆがみ
        p.xy = mat2vecmul(tyb_rot2D(T*0.25),p.xy);
        p.y += sin(t+T*2.5)*0.435f;
        
        //position along the ray 光が進んだ
        float d = map(p,T);
        
        //"march" the ray
        t += d;
        
        //"march"が細かくなって意味ないところを進み過ぎないように制限
        //tもあまりに遠いところに行って意味なくならないように
        col = (float3)(i,i,i) / (float3)(ITERATIONS,ITERATIONS,ITERATIONS);
        if(d<0.001f || t>100.0f) break;

    }    
    
    //t = Zbuffer
    t*=.15;
    
    //色付け
    col = tyb_palette(t,(float3)(0.25,0.25,0.75),(float3)(0.25,0.5,0.75),(float3)(0.25,0.5,1.0),(float3)(0.2,0.1,0.5));
   
    @dst.set(col);
}

カーネル登録

#bind layer src? val=0
#bind layer !&dst float3

?:オプションか否か

&:入力必須か

float3:型指定

val=0:初期値

グローバル変数

VEX には様々なデフォルトのバインディングがあり、多くのラングルに表示されます。OpenCLも同様ですが、VEXはコードに表示されればジャスト・イン・タイムでバインドすることが多いのに対して、OpenCLはバインドを有効にするためにノードに明示的な機能フラグを設定する必要があることが多いです。

Binding Type Validity Meaning
@ix@iy@iz@ixy intint2 ボリューム、VDB、レイヤー、またはフィールド上で実行する。 現在処理中のボクセル/バッファの整数インデックス。
@xres@yres@res intintint2 レイヤーの上を走る。 出力バッファの解像度。
@tilesize int2 レイヤーの上を走る。 タイルサイズ。カーネルはこのサイズのタイルごとに1回実行される。0は、タイルがその次元の画像のフルサイズであることを意味する。作成されたタイルは、実際の画像サイズを超えるかもしれない。
@elemnum int ボリューム、アトリビュート、またはVDBに対する実行。フィールドが整列されているフィールド上で実行する。 現在処理中の要素を表す整数インデックス。VDBの場合、これはトポロジーによって異なることに注意。
@P float2/3 レイヤーやフィールドの上を走る。 レイヤーモードでは、.image、.texture、.pixel、.world が空間を指定し、.image がデフォルトです。
@dPdx@dPdy float2 レイヤーの上を走る。 これはfloat2ですが、1つの成分だけが0になりません。.image、.texture、.pixelは空間を指定し、.imageはデフォルトです。
@dPdxy float2 レイヤーの上を走る。 イメージ空間での現在の出力バッファ要素のサイズ。(@dPdx.x, @dPdy.y)と同じです。.image、.texture、.pixelは空間を指定し、.imageはデフォルトです。
@Time float ノードで指定された時間を含む 秒単位の現在時刻。ノードを時間依存にする。
@TimeInc float ノードで指定されたタイムステップを含む 現在のタイムステップ。SOPの場合は通常1/$FPSですが、DOPの場合は現在のシミュレーションステップサイズです。
@SimFrame int ノードで指定されたシミュレーション・フレームを含む 現在のシミュレーション・フレーム、$SF。

UV面作成

#bind layer src? val=0
#bind layer !&dst
@KERNEL
{
   float2 uv = (float2)(@ixy.x,@ixy.y) / (float2)(@res.x,@res.y);

   float3 col = (float3)(uv.x,uv.y,0.0f);
   @dst.set(col);
}