micro rt
1.0.0
轻巧的射线疗法微服务用Rust编写。
主要思想是使用JSON文件或HTTP服务器立即在终端中立即呈现图像。
受Zenity的启发,可以使您在终端中创建简单的UI。


raytrace --obj sph r: 0.15 pos: 0 0 -0.1
--obj box size: 0.25 0.25 0.25 pos: 0 0 -0.375 dir: 0 0.5 0.5 0
--obj box size: 0.3 0.3 0.01 pos: 0 0 0.499 emit: 1
--obj box size: 1 0.01 1 pos: 0 0.5 0
--obj box size: 1 1 0.01 pos: 0 0 0.5
--obj box size: 1 1 0.01 pos: 0 0 -0.5
--obj box size: 0.01 1 1 pos: -0.5 0 0 albedo: ' #ff0000 '
--obj box size: 0.01 1 1 pos: 0.5 0 0 albedo: ' #00ff00 '
--cam pos: 0 -1.25 0 fov: 60 gamma: 0.6 exp: 0.8
--update --sample 1024 --ssaa 2 --res 1080 1080使用MUSL静态地为Linux建造。该可执行文件可以在任何Linux系统上运行,而无需任何其他LIB。
rustup target add x86_64-unknown-linux-musl
cargo build --release --target x86_64-unknown-linux-musl$ ./raytrace -h
Tiny raytracing microservice.
Usage: raytrace [OPTIONS] [FILE.json]
Arguments:
[FILE.json]
Full render description json input filename
Options:
-v, --verbose
Enable logging
--pretty
Print full render info in json with prettifier
-d, --dry
Dry run (useful with verbose)
-o, --output < FILE.EXT >
Final image output filename
--http < address >
Launch http server
--bounce < BOUNCE >
Max ray bounce
--sample < SAMPLE >
Max path-tracing samples
--loss < LOSS >
Ray bounce energy loss
-u, --update
Save output on each sample
-w, --worker < WORKER >
Parallel workers count
--dim < DIM >
Parallel jobs count on each dimension
-s, --scene < FILE.json >
Scene description json input filename
-f, --frame < FILE.json >
Frame description json input filename
--res < w > < h >
Frame output image resolution
--ssaa < SSAA >
Output image SSAAx antialiasing
--cam < pos: < f32 f32 f 32>> < dir: < f32 f32 f32 f 32>> < fov: < f 32>> < gamma: < f 32>> < exp: < f 32>> < aprt: < f 32>> < foc: < f 32>> ...
Add camera to the scene
--obj [ < type: sphere(sph) | plane(pln) | box | triangle(tri) > < name: < str >> < param: < sphere: r: < f 32>> | < plane: n: < f32 f32 f 32>> | < box: size: < f32 f32 f 32>> | < triangle: < f32 f32 f 32> < f32 f32 f 32> < f32 f32 f32 >>> < pos: < f32 f32 f 32>> < dir: < f32 f32 f32 f 32>> < albedo: < f32 f32 f 32> | hex > < rough: < f 32>> < metal: < f 32>> < glass: < f 32>> < opacity: < f 32>> < emit: < f 32>> < tex: < FILE.ext | < base64 str >>> < rmap: < FILE.ext | < base64 str >>> < mmap: < FILE.ext | < base64 str >>> < gmap: < FILE.ext | < base64 str >>> < omap: < FILE.ext | < base64 str >>> < emap: < FILE.ext | < base64 str >>> ...]
Add renderer to the scene
--light [ < param: < point(pt): < f32 f32 f 32>> | < dir: < f32 f32 f32 >>> < pwr: < f 32>> < col: < f32 f32 f 32> | hex > ...]
Add light source to the scene
--sky << f32 f32 f32>|hex> <pwr>...
Scene sky color
-h, --help
Print help information
-V, --version
Print version information $ ./img2json -h
Convert images to json for micro-rt.
Usage: img2json [OPTIONS] < IMG >
Arguments:
< IMG >
Input image filename
Options:
--pretty
Print json with prettifier
-f, --fmt < fmt: < buf | inl >>
Texture format
-h, --help
Print help information
-V, --version
Print version information让我们在终端中使用Sphere渲染简单的场景:
raytrace --obj sphere --light point: -0.5 -1 0.5它将产生PNG图像1280x720: 
现在,让我们更改分辨率,输出文件并添加一些抗质量:
raytrace --obj sphere --light point: -0.5 -1 0.5 --res 1920 1080 --ssaa 2 -o final.ppm
让我们做一些有趣的事情(这需要一些时间):
raytrace --obj sph r: 0.2 pos: 0.5 0.5 0 albedo: ' #ffc177 ' emit: 1.0
--obj sph r: 0.2 pos: -0.5 0 0 rough: 1
--obj sph r: 0.2 pos: 0 0.5 0 albedo: ' #ff0000 '
--obj sph r: 0.2 pos: 0.5 0 0 metal: 1
--obj sph r: 0.2 pos: -0.15 -0.5 0 glass: 0.08 opacity: 0
--obj pln pos: 0 0 -0.201 rough: 1
--obj pln n: 0 0 -1 pos: 0 0 1 rough: 1
--obj pln n: -1 0 0 pos: 1 0 0 albedo: ' #00ff00 ' rough: 1
--obj pln n: 1 0 0 pos: -1 0 0 albedo: ' #ff0000 ' rough: 1
--obj pln n: 0 -1 0 pos: 0 1 0 rough: 1
--cam pos: 0 -1.2 0.1 fov: 60 gamma: 0.5 exp: 0.75
--update --bounce 16 --sample 1024
scene.json文件包含场景信息: {
"renderer" : [
{
"type" : " plane " ,
"n" : [ 0 , -1 , 0 ],
"pos" : [ 0 , 1 , 0 ],
"mat" : {
"rough" : 1
}
},
{
"type" : " plane " ,
"n" : [ 1 , 0 , 0 ],
"pos" : [ -1 , 0 , 0 ],
"mat" : {
"albedo" : [ 1 , 0 , 0 ],
"rough" : 1
}
},
{
"type" : " plane " ,
"n" : [ -1 , 0 , 0 ],
"pos" : [ 1 , 0 , 0 ],
"mat" : {
"albedo" : [ 0 , 1 , 0 ],
"rough" : 1
}
},
{
"type" : " plane " ,
"n" : [ 0 , 0 , -1 ],
"pos" : [ 0 , 0 , 1 ],
"mat" : {
"rough" : 1
}
},
{
"type" : " plane " ,
"n" : [ 0 , 0 , 1 ],
"pos" : [ 0 , 0 , -0.2 ],
"mat" : {
"rough" : 1
}
},
{
"type" : " sphere " ,
"r" : 0.2 ,
"pos" : [ -0.15 , -0.5 , 0 ],
"mat" : {
"glass" : 0.08 ,
"opacity" : 0
}
},
{
"type" : " sphere " ,
"r" : 0.2 ,
"pos" : [ 0.5 , 0 , 0 ],
"mat" : {
"metal" : 1
}
},
{
"type" : " sphere " ,
"r" : 0.2 ,
"pos" : [ 0 , 0.5 , 0 ],
"mat" : {
"albedo" : [ 1 , 0 , 0 ]
}
},
{
"type" : " sphere " ,
"r" : 0.2 ,
"pos" : [ -0.5 , 0 , 0 ],
"mat" : {
"rough" : 1
}
},
{
"type" : " sphere " ,
"r" : 0.2 ,
"pos" : [ 0.5 , 0.5 , 0 ],
"mat" : {
"albedo" : [ 1 , 0.76 , 0.47 ],
"emit" : 1
}
}
]
}frame.json文件包含输出帧信息: {
"res" : [ 1280 , 720 ],
"ssaa" : 1 ,
"cam" : {
"dir" : [ 0 , 0 , 1 , 0 ],
"exp" : 0.75 ,
"fov" : 70 ,
"gamma" : 0.5 ,
"pos" : [ 0 , -1.2 , 0.1 ]
}
}example.json包含所有信息: {
"rt" : {
"sample" : 512
},
"frame" : {
"cam" : {
"exp" : 0.75 ,
"fov" : 60 ,
"gamma" : 0.5 ,
"pos" : [ 0 , -1.2 , 0.1 ]
}
},
"scene" : {
"renderer" : [
{
"type" : " plane " ,
"n" : [ 0 , -1 , 0 ],
"pos" : [ 0 , 1 , 0 ],
"mat" : {
"rough" : 1
}
},
{
"type" : " plane " ,
"n" : [ 1 , 0 , 0 ],
"pos" : [ -1 , 0 , 0 ],
"mat" : {
"albedo" : " #ff0000 " ,
"rough" : 1
}
},
{
"type" : " plane " ,
"n" : [ -1 , 0 , 0 ],
"pos" : [ 1 , 0 , 0 ],
"mat" : {
"albedo" : " #00ff00 " ,
"rough" : 1
}
},
{
"type" : " plane " ,
"n" : [ 0 , 0 , -1 ],
"pos" : [ 0 , 0 , 1 ],
"mat" : {
"rough" : 1
}
},
{
"type" : " plane " ,
"n" : [ 0 , 0 , 1 ],
"pos" : [ 0 , 0 , -0.2 ],
"mat" : {
"rough" : 1
}
},
{
"type" : " sphere " ,
"r" : 0.2 ,
"pos" : [ -0.15 , -0.5 , 0 ],
"mat" : {
"glass" : 0.08 ,
"opacity" : 0
}
},
{
"type" : " sphere " ,
"r" : 0.2 ,
"pos" : [ 0.5 , 0 , 0 ],
"mat" : {
"metal" : 1
}
},
{
"type" : " sphere " ,
"r" : 0.2 ,
"pos" : [ 0 , 0.5 , 0 ],
"mat" : {
"albedo" : " #ff0000 "
}
},
{
"type" : " sphere " ,
"r" : 0.2 ,
"pos" : [ -0.5 , 0 , 0 ],
"mat" : {
"rough" : 1
}
},
{
"type" : " sphere " ,
"r" : 0.2 ,
"pos" : [ 0.5 , 0.5 , 0 ],
"mat" : {
"albedo" : " #ffc177 " ,
"emit" : 1.0
}
}
]
}
}raytrace --scene scene.json --frame frame.json --sample 1024raytrace example.json --sample 1024
在大多数情况下,单一渲染描述文件更喜欢。场景和框架的分离对于更改某些相机位置,分辨率等而无需更新完整场景文件很有用。
raytrace --http localhost:8888POST http请求: 
它将用JPEG编码的输出返回HTTP响应。
--verbose,-v flag with --dry,-d从CLI命令中获取JSON中的完整渲染信息: raytrace -v -d --obj sphere --light point: -0.5 -1 0.5{ "rt" :{ "bounce" : 8 , "sample" : 16 , "loss" : 0.15 }, "frame" :{ "res" :[ 1280 , 720 ], "ssaa" : 1.0 , "cam" :{ "pos" :[ -0.0 , -1.0 , -0.0 ], "dir" :[ 0.0 , 0.0 , 1.0 , 0.0 ], "fov" : 70.0 , "gamma" : 0.8 , "exp" : 0.2 , "aprt" : 0.001 , "foc" : 100.0 }}, "scene" :{ "renderer" :[{ "type" : " sphere " , "r" : 0.5 , "mat" :{ "albedo" :[ 1.0 , 1.0 , 1.0 ], "rough" : 0.0 , "metal" : 0.0 , "glass" : 0.0 , "opacity" : 1.0 , "emit" : 0.0 , "tex" : null , "rmap" : null , "mmap" : null , "gmap" : null , "omap" : null , "emap" : null }, "pos" :[ 0.0 , 0.0 , 0.0 ], "dir" :[ 0.0 , 0.0 , 1.0 , 0.0 ], "name" : null }], "light" :[{ "type" : " point " , "pos" :[ -0.5 , -1.0 , 0.5 ], "pwr" : 0.5 , "color" :[ 1.0 , 1.0 , 1.0 ]}], "sky" :{ "color" :[ 0.0 , 0.0 , 0.0 ], "pwr" : 0.5 }}}raytrace -v -d --pretty --obj sphere --light point: -0.5 -1 0.5{
"rt" : {
"bounce" : 8 ,
"sample" : 16 ,
"loss" : 0.15
},
"frame" : {
"res" : [ 1280 , 720 ],
"ssaa" : 1 ,
"cam" : {
"pos" : [ 0 , -1 , 0 ],
"dir" : [ 0 , 0 , 1 , 0 ],
"fov" : 70 ,
"gamma" : 0.8 ,
"exp" : 0.2 ,
"aprt" : 0.001 ,
"foc" : 100
}
},
"scene" : {
"renderer" : [
{
"name" : null ,
"type" : " sphere " ,
"r" : 0.5 ,
"mat" : {
"albedo" : [ 1 , 1 , 1 ],
"rough" : 0 ,
"metal" : 0 ,
"glass" : 0 ,
"opacity" : 1 ,
"emit" : 0 ,
"tex" : null ,
"rmap" : null ,
"mmap" : null ,
"gmap" : null ,
"omap" : null ,
"emap" : null
},
"pos" : [ 0 , 0 , 0 ],
"dir" : [ 0 , 0 , -1 , 0 ]
}
],
"light" : [
{
"type" : " point " ,
"pos" : [ -0.5 , -1 , 0.5 ],
"pwr" : 0.5 ,
"color" : [ 1 , 1 , 1 ]
}
],
"sky" : {
"color" : [ 0 , 0 , 0 ],
"pwr" : 0.5
}
}
}TBD ...