算譜の部屋。上に行くほど新しい。
おべんきょう
核となるソースはここから(UDPTestSource.zip) 。
importする方法は以下の記事を参考に書き換えるべし。
http://hamken100.blogspot.jp/2015/05/cue4.html
なお、XXXXXXX_APIのマクロを変えるのをよく忘れるので注意(俺は忘れた)
今のところUDPで通信するUE4のソースやらの日本語の情報が少ない気がするので書いた。
たぶんさっくりできるか代替案があるかそもそも利用する機会がないとかいろいろ原因あるのかな。
誰かのライブラリやらOSCを利用するのか賢いんだろうけどつまんないのでやめた。
前提は以下じゃけえのう。
[前提]
・UnrealEngine4のバージョンは4.9.2
・FUdpSocketBuilderを使う
・必要なければ通信しないなど賢いことはしない
・AActor::Tickでポーリングしてみる(テストだから)
・受信だけ(node.js -> UE4)
・ポートは適当
[ソースチラ見せ]
#include "UDPTest.h"
#include "UDPActorComponent.h"
#include "Engine.h"
// Sets default values for this component's properties
UUDPActorComponent::UUDPActorComponent()
{
// Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features
// off to improve performance if you don't need them.
bWantsBeginPlay = true;
PrimaryComponentTick.bCanEverTick = true;
// ...
}
// Called when the game starts
void UUDPActorComponent::BeginPlay()
{
Super::BeginPlay();
// ...
FString address = TEXT("127.0.0.1");
FIPv4Address ip;
FIPv4Address::Parse(address, ip);
Socket = FUdpSocketBuilder(TEXT("UDP Socket"))
.AsNonBlocking()
.AsReusable()
.BoundToAddress(ip)
.BoundToPort(Port)
.WithMulticastLoopback();
}
// Called every frame
void UUDPActorComponent::TickComponent( float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction )
{
Super::TickComponent( DeltaTime, TickType, ThisTickFunction );
// ...
uint32 Bytes;
if (Socket->HasPendingData(Bytes))
{
uint8 data[64] = { 0 };
int32 read_bytes;
Socket->Recv(data, sizeof(data), read_bytes);
if (read_bytes > 0)
{
if (GEngine) GEngine->AddOnScreenDebugMessage(-1, 5.0, FColor::Yellow, *FString::Printf(TEXT("read_bytes=%d : %s"), read_bytes, data));
//ここから適当に処理してください箇所
AActor *actor = GetOwner();
FVector t = actor->GetActorLocation();
if (read_bytes == 1) t.X += 10;
if (read_bytes == 2) t.Y += 10;
if (read_bytes == 3) t.Z += 10;
if (read_bytes == 4) t.X -= 10;
if (read_bytes == 5) t.Y -= 10;
if (read_bytes == 6) t.Z -= 10;
actor->SetActorLocation(t);
}
}
}
void UUDPActorComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
Super::EndPlay(EndPlayReason);
if (Socket)
{
Socket->Close();
delete Socket;
}
}
心臓部はこんだけ。
[参考サイト]
https://github.com/monsieurgustav/UE4-OSC
TCP Socket Listener, Receive Binary Data From an IP/Port Into UE4, (Full Code Sample)
[zipでやってることはイカ]
・localhost(127.0.0.1:8888)から受信
・新規C++クラスからActorComponentを選ぶ(実験時はpublicで作成)
・Public(Private)に取り込むライブラリを指定する。
・FUdpSocketBuilderを作成する
・Tickでポーリング指定を行って、したい処理を書く
・BeginEnd()を定義してFUdpSocketBuilderを殺す
・受信したバイト数(1〜6)で移動するようになっている。
使い方は、ビルド後、適当なメッシュ(Movable)にコンポーネントとしてUDPを追加するだけ。
あとはnode.jsでUDP送信をローカルアドレスに対してやればOK。
サンプルとしたnode.jsのUDPクライアントの記事は以下。
node.js UDP Server and Client Example
[注意]
・あたりまえだけどTerminateは確実に実行する(Port開いたままになってしまう)
・シミュレーションモードだとなんか遅延しているように見えるけど、スタンドアローンにするとそれなりになる
[課題とかやってみたいこと]
・TickでUDP吸い取ってるけどたぶんちゃんとThreadにしないといけないはず(callbackがよべる)
・WebSocket回り今度やってみたい(ライブラリ : /Engine/Source/ThirdParty/WebSockets)
・BPとつないで遊びたい。汎用性がガラリと違うはず
で、OSCでいいんじゃないかという結論になった。
ナムアミッ!!!
ダウンロードは ⇒ PracTest1.zip
templateダウンロードは ⇒ Practice1.zip
unity4.2でshaderが使えるらしいので適当にBG表示するなど。
んがもうちょっとかっちりしたものじゃないと浮いてる気がする。普通にpolyったほうがよさそう感。
合わせて3DSTG用の適当なテンプレート作ってる。適当に更新する。
prefabのアタッチ忘れた。
使用しているAssetとか。
Dark Future Music(https://www.assetstore.unity3d.com/#/content/3777)
8 Bit Retro Rampage: Free Edition(https://www.assetstore.unity3d.com/#/content/7946)
ダウンロードは ⇒ glcom.zip
供養。気分転換。orthoなの作ってなかったのでnehe見ながら。
ダウンロードは ⇒ gl1000.zip
ShaderToy に上げた奴。
string:gyabo
glsl砂場と違って音をつけれるのが良い。
ただ、私の環境だとなんか時々落ちたりするが気にしないbetaだし。
元ネタ : http://www.youtube.com/watch?v=AMaNxyHhH6A
頭冷やしてソフトウェアレンダリングリハビリ。DirectX、OpenGL使ってない。最適化なんてしていない。適当。
解像度低い場合工夫しないと見た目がダメっすね(実行中にaltキーを押すとめもあてられない)
ダウンロードは ⇒ dibfill.cpp
実行ファイル付き ⇒ dibfill.zip
今回初OpenMPだった。参考サイトはこちら : OpenMP
躓いたのはレイのx座標の変数の扱い。今はかなり手を抜いて毎ループ計算している。
参考サイトにあるように画面を短冊状に切って分解するのが良いのかもしれない。
こんな感じ。画像は400x300でレンダリング。ノートンに怒られてるの巻。
なんとなくインチキblurかけてみたの図。アレに似ている。
ブラー付きはこちら ⇒ edibfill.zip
スペースおしっぱで元画像見れます。おためしあれ。
こちらにござい
TokyoDemoFest2012 のセミナー発表に使用したスライドと解説に使ったプログラム一式です。
公式にもファイルはあるのですが、こちらにも貼っておきます。
ダウンロードは以下から。
semi_gyabo_20120126.zip
outline.zip
GetGlyphOutlineでとってきたフォントの線をD3DPT_LINELISTで表示するテスト。
ぐんにょり。
補完していないベタのベクトルデータです。
素直にBitmap使えばいいのかもしれない。
あえて線で。
作ってみてわかったんだけど、アンチエイリアスHWで対応していない状態で線表示すると
ものすごい汚く表示されちゃうんだよね。WindowのClientサイズ考慮していないのもあるけど。
bb01.zip
Sincere:TBC 見てて、そういえばまともにビルボード組んだことないなぁと思って作って遊んでみた。
参考:Billboard Shader(GameDev)
※↑→ベクトルをシェーダ内部でやるか、外からやるかの違いだけ。俺はCPU側でフレームごとに計算。
メリットデメリットある。
あと逆行列使ってビルボードを作る方法は検索すれば腐るほどあるので、あえて取り上げない。
お試しでyoutubeにupload。コーデックがダメすぎる。もうちょっと調べないとまともな動画あげられない。
shikaku.zip
使い回し3。
例によってポリゴン2つ(画面覆う四角)だけで色々表示させるもの。
さすがに飽きてきたのでしばらくやらない。まあ考えればネタ尽きないな。
fade_shikaku.zip
別Version.
cos_wakka.zip
使い回し2。まだまだ面白い。
cos(x * y)でレイ発射して推定してる。スカスカ。
判定部分0.8にすると↓みたいにすこしごつくなる。
iwa_ground.zip
使い回し。main.fxしか変更せず。
ループするときのオフセットずらしを無くす。
本当は補完すればいいんだろうけどまだ知恵ない。
色々いい加減なので見る人見たらプークスクスかも。
要はそれらしく見えればOK。
noise_ground.zip
勉強用2。SM3.0必須。
Perlin noiseってすごいノイズがあるんで、とりあえずPSで描画。
perlin noise
2chparty.net(2011/01/23 : 追記)
本当は動的に変化させたいけどとりあえずまあこんなもんでいいか程度。
xy/zって感じにすればとりあえずこんな感じで描画できる。
おまけで岩肌。
menger.zip
勉強用。SM3.0必須。
引用元は2009 breakpointのPC4kByte部門の2nd, TBC様のuntraceable .
最初フラクタルの名前が分からなかった。メンガーのスポンジってやつらしい。
メンガーのスポンジ
すごいなあと。
RADEON4850HDでは動かなくてnakunaku解析。
Zの値を2にするとシルピンスキーの三角形も表示できるみたい。すごすぎる。
tamafx.zip
美味しくなさそうな球が出てくるシェーダ。
やっぱりレイトレース。
レイを投げて衝突しなかったら、direction方面にオブジェクトと視点を移して再度レイトレしてる。
実質4つの玉のあたり判定しかしていないけど、まあGPUしょぼいと動いてくれない。
ps_kishimen.zip
きしめんシェーダ。
iq氏 のサイトを見ながら実験。
レンダリングしているのはレイトレースした平面。衝突しなかったら平面下げて再度衝突判定など。
ソース自体はとても短いのに面白い効果が出る。板ポリ1枚だけ。
ちなみにエフェクトファイルのmain.fxを変更してF5でシェーダ更新できます。お試しあれ。
fw2s_lua.zip
Luaでバインドしてみるテスト。boot.luaはまだ書いてない。すぐかけると思う。
多分こんな感じ。
--main loop
function main()
local result = system.init("test fw2s_lua", 640, 480, 1)
if(result == 0) then
while ( system.do_event() > 0) do
system.start_scene(0xFFFFFF);
system.end_scene();
system.flip();
end
system.term()
end
end
-- start
main()
できればpackageディレクトリとか作成して、中に個別のフォルダ作ってstartup.luaを読み込ませる感じに
できるかナーと模索中。オブジェクト管理も全部Luaでやるつもりなのでスピードはでないと思う。
物好きな人はcell使ってactorを登録できるようにしても良い。
fw2s.zip
fw2にシェーダを組み込んでみました。shader.cppが新規追加ファイルです。あとVS, PSともに2.0必須です。
難解で管理が面倒なシェーダは日本では嫌われてますが今後は普通に使用されるはず。HLSL使いやすいよ!
hataは、旗が激しくツイストしてますが、Zキー、Xキーで状態を変更することができます。頂点シェーダで位置情報をsinで揺らすだけですが、参考サイトが無かったら作れなかった。
mainは、LPD3DXEFFECTとCompileしてSet系使う(techniqueは使わない)で描画します。描画結果が背景色以外一緒であることを確認するため。
etest2.fxをいじって色々することが出来ます。以下のサイトを参考にしました。
・http://www.toymaker.info/Games/html/vertex_shaders.html
・Basic HLSL Lighting Techniques - Episode 1: Ambient and Diffuse
・t-pot
・Cマガ2005年2月号。
あとはSDK付属のHelp。アレがあれば大体事足ります。
生意気にもデバイスロスト に対応してみました。
毎回面倒なんだよな…。
一度作ったら、「何が出来るか」を見つけて実現するだけ。
しかし作っても何をしたいのかまだ分からないのだった。
fw2.zip
簡単な2D系だったら作れるDirectX9のラッパー。入力とサウンドもある程度サポート。
サンプルとかあったら使いやすいのかもしれない。fwでnmakeすると上記みたいに操作できるハコが表示されます。
fw1.zip
とりあえずシェーダーいじるための骨組み。備忘録。
こちらから
はるか昔の残骸1。デモシーンに浮かれてRotozoomと他ごっちゃ混ぜ。今思うとどうやって作成したのか謎。JavaのソースはHDDのクラッシュとともに終了。
記憶だと、Bitsに直接アクセスして全部CPUで描画してた。つまりJavaのプリミティブ描画系は使ってない。
なんでそんなことしてたんだろう(ポリゴンを使うことに抵抗があった気が)
壊れたTVをイメージ。どのシーンでもちょっとずつノイズが入るようになってます(たしか)
こちらから
はるか昔の残骸2。当時ホントデモシーン大好きだったな俺。マウスでグリグリしてみてください。
あとリロードすると模様が変わるときがあります。
HDDクラッシュでソース損失。Jode使う気にもなれず放置。
こちらから
はるか昔の残骸3。天井と地面です。これもデモシーンに熱をあげてた頃。レイキャストして確か8x8でテクスチャを線形補完。
フォグかけようかと思ったけど断念(なんでだよ)
これもソースないから変更できないんだよな…。
リロードすると模様が変わるときがあります。
dibfill.cpp
あほ
rdib.cpp
時代に逆行したdibを使ってCPUで自前描画するためのフレームワーク。
ピクセル単位で操作したい場合は実験で使える。
Clearをわざとアセンブラで書いてみてます。これは要らない人だったら書き換えてください。
cell.zip
うーん。実行ファイルと絵 。カーソルキーで動かせます。
obj管理系
obj.zip : 昔のオブジェクト管理系1
ramobj.zip : 昔のオブジェクト管理系2
描画系
draw2d.zip : 2D描画系。アルファとかは自分でやれ的。
音系
snd_temp.zip : こっそり