画面情報でモデルを照らす:kcstuber開発日記

どうも,チョコです.

KCSTuberをn年ぶりに更新しました.古いChokoEngine(研究でforkして作業している)を使っているせいで,最適化が反映されていない.つらいさん.

さて,前々からやりたかった課題として,以下のようなものがある.

KCSちゃんは画面を見ているから,画面情報によって照明が変わるはず.と.

 

....

いや,ちょっと面倒すぎないか.

 

....

仕方ないので,実装を考えましょう.linuxはさておき,画面をキャプチャーするwinapi関数にない(と思う)し,どうやればいいか困りますね.

そこで,まず考えたのはこれ.

OBSで画面をキャプチャーしてストリーミングし,ffmpegで取得する.

おう.天才.(と思うじゃん?)

OBSで出力するのは簡単なので詳細は省いて,要はlocalhost:1234に映像データを吐くようにすればいい.

そして,悪夢のffmpeg.このようなクラスを作ろう.

実装はffmpegの仕様を見て自分で考えましょう.(ないんですよ最新の仕様がぁ.)

まあ,ストリームを取得するところはこんな感じですね.

はい,映像の配列を取得したとしましょう.あとはOpenGLに渡せば好きにし放題だね.

っと,その前に..

 

いやあ,さすがにこれはひどい.このやり方の問題点を考えてみよう.

1.OBSを立ち上げる必要がある

2.映像の質がわるい

3.OBSを立ち上げる必要がある

4.ユーザがいちいち設定する必要がある

5.OBSを立ち上げる必要があるため,配信するときはOBSが2つになっちゃう

 

だめじゃん.

 

そこで,もう一つの神のFOSS,VLCを思いついた.

そう,libVLCを使えばいいじゃん.と.

 

はい,解散解散.

 

libVLCを画面をキャプチャーするのは簡単.一応公式のサンプルもあるし,gistも落ちている.が,両方とも少しずれているので,我のものも見せよう.

ここで,transcode{vcodec=RV24}を指定すると,画素データがBGRの8ビットづつになるので,変換する必要性がない(!).神.

 

そして,この得たデータをOpenGLに渡せばいいね.

これを描画すると,こんな感じになりますね.

Screenshot (535)

いぇーい.ノイズもないし,すごいぬるぬる.

 

では,最後にこれを使ってKCSちゃんを照らそう.結局KCSちゃんはアニメ風なので,ちゃんとHDRIとして使うと不自然になっちゃう.そのため,適当に照らそう.

要するに,ぼかした背景をオーバーレイするだけ.

OpenGLコードは説明する必要ないでしょう.(勉強したい方はCG班に入ってね☆)

,,と言ったものの,色の組み合わせは一応こんな感じですね.

これの効果を一行一行見ていくと:

1:ぼかす

Screenshot (542)

2:KCSちゃんの元の色を下げる

Screenshot (543)

3:ぼかしたテクスチャを描く

Screenshot (544)

はい終了.割と簡単ですね.これを動画にするとエフェクトがはっきり分かりますね.

KCSちゃんかわいい.では.

Posted on