FC2ブログ

頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


SceneKitでシェーダに値(配列)を渡す

SceneKitでfragmentシェーダに1つの値を渡すというのはやってたんだけど、今回はvertexシェーダに値を複数渡そうとしたんだが、えらくはまったのでメモ。

まず、1つの場合はこんな感じでやってた。
{
    float value = _value;
    NSData *buffer = [NSData dataWithBytes:&value length:sizeof(float)];
    [node.geometry.firstMaterial setValue:buffer forKey:@“value”];
}
↑こんな感じでNSDataを使ってセットしてやり、
fragment half4 myFragment(SimpleVertex in [[stage_in]],
                          texture2d diffuseTexture [[texture(0)]] ,
                          constant float &value [[buffer(0)]]
                          )
{
	float4 color = float4(value , … );//とかなんとか
}
↑シェーダでこのようにすれば受け取れる。例はfragmentシェーダだけどvertexシェーダでも受け取れる。

こんな感じで複数の値を渡そうとしたのよ。複数といっても2、3個じゃなくて頂点の数ほどだったので1万個以上あるので手書きでやってられない。
さんざん悩んだんだけど、結局こんなの。

{
    float *values = (float *)calloc(nofData, sizeof(float));
    // … set values …

    NSData *data = [NSData dataWithBytes:values length:sizeof(float)*nofData];
    [node.geometry.firstMaterial setValue:data forKey:@“values"];
}
↑nofDataはデータの数。
vertex SimpleVertex myVertex(MyVertexInput in [[stage_in]],
                             constant SCNSceneBuffer &scn_frame [[buffer(0)]],
                             constant MyNodeBuffer &scn_node [[buffer(1)]] ,
                             uint vid [[vertex_id]] , 
                             constant float *values [[buffer(2)]] )
{
    float value = values[vid];
}
↑こんな感じで配列の値にアクセスすることができた。ここでは配列のindexに頂点番号(何て言うんだろう?)を使ってる。冷静に考えれば、まあそうだよねってコードなんだけど、ここにたどり着くのにえらいハマってしまったのでした。

参考までにこれで何をしたかというと、、、

輪郭線

↑Blenderで作成したモデルをdaeファイルで出力、SceneKitでシェーダ使って描いてるんだけど、視線と法線の内積で輪郭を得ると足や手など輪郭線がどうしても細くなってしまう。それじゃあ”細い”って情報をシェーダに渡して補正すればいいんじゃね?ってアイデアを試してみようとしたのよ。

頂点からボーンへの距離

↑こんな感じで各頂点から一番近いボーンの距離を得た(描いているのは一部だけ)。この情報をvertexシェーダに渡してさらにfragmentシェーダに渡すと描画部分での”細さ”を計算。

曲率半径

↑正しく値が来てるか"細さ"を輝度にして確認。手足なんかは暗くなってる。よしよし。

補正された輪郭線

↑その情報を使って輪郭線を補正してみたが、、、労力のわりにあまり変わってない?
い、いや、まだ改善の余地があるんだ、きっと、、、

<< RNN(LSTM)で株価予測の結果(2)  TopPage  RNN(LSTM)で株価予測の結果(1) >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1125-ac39f370




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad