画面情報でモデルを照らす: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に渡せばいいね.
これを描画すると,こんな感じになりますね.
いぇーい.ノイズもないし,すごいぬるぬる.
では,最後にこれを使ってKCSちゃんを照らそう.結局KCSちゃんはアニメ風なので,ちゃんとHDRIとして使うと不自然になっちゃう.そのため,適当に照らそう.
要するに,ぼかした背景をオーバーレイするだけ.
OpenGLコードは説明する必要ないでしょう.(勉強したい方はCG班に入ってね☆)
,,と言ったものの,色の組み合わせは一応こんな感じですね.
これの効果を一行一行見ていくと:
1:ぼかす
2:KCSちゃんの元の色を下げる
3:ぼかしたテクスチャを描く
はい終了.割と簡単ですね.これを動画にするとエフェクトがはっきり分かりますね.
KCSちゃんかわいい.では.
Posted on: 2019年3月7日, by : chokopan