<aside> 💡
coperunicus関連
</aside>
目的 | ノード | 備考 |
---|---|---|
色被り補正 | Mono to RGB | |
ノーマルマップ作成 | Hight to Normal |
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 |
int , int2 |
ボリューム、VDB、レイヤー、またはフィールド上で実行する。 | 現在処理中のボクセル/バッファの整数インデックス。 |
@xres , @yres , @res |
int , int , int2 |
レイヤーの上を走る。 | 出力バッファの解像度。 |
@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。 |