diff --git a/examples/renderTest.php b/examples/renderTest.php index 84a0499..3d85079 100644 --- a/examples/renderTest.php +++ b/examples/renderTest.php @@ -3,6 +3,8 @@ namespace Blobt\Luxcore\scene; + +use Blobt\Luxcore\utils\MatHelper; use GuzzleHttp\Client; include dirname(dirname(__FILE__)) . "/vendor/autoload.php"; @@ -15,8 +17,31 @@ const CLOSE = false; $client = new Client(); $response = $client->get("deep3d.backend-api.dev.com/test/render-task"); $resContents = $response->getBody()->getContents(); -$resData = json_decode($resContents); - +$result = json_decode($resContents,false); + +$taskData = $result->data; +$taskScene = $taskData->scene; +$taskModel = $taskScene->model; +// print_r($taskModel); + + + + +/** + * 创建个 Luxcore 材质 + */ +function createLuxcoreMat($matParams){ + switch($matParams->renderType){ + case 1: + return MatHelper::createMatOfDisney($matParams); + case 2: + return; + case 3: + return; + case 4: + return; + } +} @@ -27,101 +52,101 @@ $scene = new Scene(); // 一、创建光场: // 1、创建 面片光001 -$materials = new materials\Matte(); -$materials->setBaseColor('0 0 0'); -$materials->setTransparencyShadow('1 1 1'); -$materials->setEmission('1 1 1'); -$scene->registerMaterial($materials); +$material = new materials\Matte(); +$material->setBaseColor('0 0 0'); +$material->setTransparencyShadow('1 1 1'); +$material->setEmission('1 1 1'); +$scene->registerMaterial($material); $obj = new objects\Objects(); $obj->ply = './ply/FaceLight001.ply'; -$obj->setMaterial($materials); +$obj->setMaterial($material); $scene->registerObjects($obj); // 2、创建 面片光002 -$materials = new materials\Matte(); -$materials->setBaseColor('0 0 0'); -$materials->setTransparencyShadow('1 1 1'); -$materials->setEmission('0 0 0'); -$materials->emissionCfg = new lights\Emission([ +$material = new materials\Matte(); +$material->setBaseColor('0 0 0'); +$material->setTransparencyShadow('1 1 1'); +$material->setEmission('0 0 0'); +$material->emissionCfg = new lights\Emission([ 'gain' => "30 30 30", ]); -$scene->registerMaterial($materials); +$scene->registerMaterial($material); $obj = new objects\Objects(); $obj->ply = './ply/FaceLight002.ply'; -$obj->setMaterial($materials); +$obj->setMaterial($material); $scene->registerObjects($obj); // 3、创建 面片光003 -$materials = new materials\Matte(); -$materials->setBaseColor('0 0 0'); -$materials->setTransparencyShadow('1 1 1'); -$materials->setEmission('1 1 1'); -$materials->emissionCfg = new lights\Emission([ +$material = new materials\Matte(); +$material->setBaseColor('0 0 0'); +$material->setTransparencyShadow('1 1 1'); +$material->setEmission('1 1 1'); +$material->emissionCfg = new lights\Emission([ 'gain' => "50 50 50", ]); -$scene->registerMaterial($materials); +$scene->registerMaterial($material); $obj = new objects\Objects(); $obj->ply = './ply/FaceLight003.ply'; -$obj->setMaterial($materials); +$obj->setMaterial($material); $scene->registerObjects($obj); // 4、创建 面片光004 -$materials = new materials\Matte(); -$materials->setBaseColor('0 0 0'); -$materials->setTransparencyShadow('1 1 1'); -$materials->setEmission('0 0 0'); -$materials->emissionCfg = new lights\Emission([ +$material = new materials\Matte(); +$material->setBaseColor('0 0 0'); +$material->setTransparencyShadow('1 1 1'); +$material->setEmission('0 0 0'); +$material->emissionCfg = new lights\Emission([ 'gain' => "4 4 4", ]); -$scene->registerMaterial($materials); +$scene->registerMaterial($material); $obj = new objects\Objects(); $obj->ply = './ply/FaceLight004.ply'; -$obj->setMaterial($materials); +$obj->setMaterial($material); $scene->registerObjects($obj); // 5、创建 面片光005 -$materials = new materials\Matte(); -$materials->setBaseColor('0 0 0'); -$materials->setTransparencyShadow('1 1 1'); -$materials->setEmission('1 1 1'); -$materials->emissionCfg = new lights\Emission([ +$material = new materials\Matte(); +$material->setBaseColor('0 0 0'); +$material->setTransparencyShadow('1 1 1'); +$material->setEmission('1 1 1'); +$material->emissionCfg = new lights\Emission([ 'gain' => "10 10 10", ]); -$scene->registerMaterial($materials); +$scene->registerMaterial($material); $obj = new objects\Objects(); $obj->ply = './ply/FaceLight005.ply'; -$obj->setMaterial($materials); +$obj->setMaterial($material); $scene->registerObjects($obj); // 6、创建 面片光006 -$materials = new materials\Matte(); -$materials->setBaseColor('0 0 0'); -$materials->setTransparencyShadow('1 1 1'); -$materials->setEmission('1 1 1'); -$materials->emissionCfg = new lights\Emission([ +$material = new materials\Matte(); +$material->setBaseColor('0 0 0'); +$material->setTransparencyShadow('1 1 1'); +$material->setEmission('1 1 1'); +$material->emissionCfg = new lights\Emission([ 'gain' => "8 8 8", 'mapfile' => "./map/SD-037.exr", 'gamma' => 1, 'storage' => "float" ]); -$scene->registerMaterial($materials); +$scene->registerMaterial($material); $obj = new objects\Objects(); $obj->ply = './ply/FaceLight006.ply'; -$obj->setMaterial($materials); +$obj->setMaterial($material); $scene->registerObjects($obj); // 7、创建 面片光000 -$materials = new materials\Matte(); -$materials->setBaseColor('0 0 0'); -$materials->setTransparencyShadow('1 1 1'); -$materials->setEmission('1 1 1'); -$materials->emissionCfg = new lights\Emission([ +$material = new materials\Matte(); +$material->setBaseColor('0 0 0'); +$material->setTransparencyShadow('1 1 1'); +$material->setEmission('1 1 1'); +$material->emissionCfg = new lights\Emission([ 'gain' => "3.3 3.3 3.3", ]); -$scene->registerMaterial($materials); +$scene->registerMaterial($material); $obj = new objects\Objects(); $obj->ply = './ply/FaceLight000.ply'; -$obj->setMaterial($materials); +$obj->setMaterial($material); $scene->registerObjects($obj); // 8、创建环境光 @@ -145,31 +170,142 @@ $texture = new texture\procedural\ImageMap([ ]); $texture->mapping = $mapping; $scene->registerTexture($texture); -$materials = new materials\Disney([ +$material = new materials\Disney([ 'shadowcatcherEnable' => OPEN, 'photongiEnable' => CLOSE ]); -$materials->setBaseColor('1 1 1'); -$materials->setTransparencyFront($texture); -$materials->setTransparencyBack($texture); -$scene->registerMaterial($materials); +$material->setBaseColor('1 1 1'); +$material->setTransparencyFront($texture); +$material->setTransparencyBack($texture); +$scene->registerMaterial($material); $obj = new objects\Objects(); $obj->ply = './ply/ground.ply'; -$obj->setMaterial($materials); +$obj->setMaterial($material); $scene->registerObjects($obj); // 二、添加要渲染的模型 -$loadModel = $resData->data->scene->model; -$loadCamera = $resData->data->scene->camera; - -foreach($loadModel->childsParams as $childParams){ - print_r($childParams); +foreach($taskModel->childsParams as $childParams){ + + $material = null; + $matParams = (function ($childParams){ + if(is_object($childParams->customMat)){ + return $childParams->customMat; + }else if(is_object($childParams->fixedMat)){ + return $childParams->fixedMat; + }else if(is_object($childParams->defaultMat)){ + return $childParams->defaultMat; + } + })($childParams); + if(is_object($matParams)){ + $material = createLuxcoreMat($matParams,$scene); + }else{ + $material = new materials\Disney(); + $material->setBaseColor('1 1 1'); + } + $scene->registerMaterial($material); + + $obj = new objects\Objects(); + $obj->ply = $childParams->childPlyFile; + $obj->setMaterial($material); + $scene->registerObjects($obj); } - - - +// 三、创建相机 +$camera = new camera\Perspective( // 创建一个相机 + [ + 'autovolumeEnable' => 0, // 关闭自动体积效果 + 'lookatOrig' => "-3.197486 -4.560584 0.8914337", // 视点坐标位置 + 'lookatTarget' => "-2.632151 -3.747173 0.7544713", // 目标点坐标位置 + 'up' => "0.0781663 0.1124666 0.9905763", // 旋转参数 + 'screenwindow' => "-1 1 -1 1", // 视野比例 + 'autofocusEnable' => 0, // 关闭自动对焦 + 'fieldofview' => 3.40608, // 视野角度大小 + 'cliphither' => 0.1 // 剪切成像起始位置,单位跟随系统 + ] +); +$camera->bokeh->blades = 0; // 模拟镜头模糊效果的光圈数 +$scene->registerCamera($camera); // 将相机注册到 scene 中 + + +// 四、设置渲染参数 +$render = ''; +$renderEngine = new render\RenderEngine(); // 设置 渲染引擎 的配置参数,默认使用了 PATHOCL,意义着将使用 GPU 设备渲染 +$render .= $renderEngine; + +$openCL = new render\OpenCL(); // 设置 GPU 渲染参数,这里使用一个默认的参数 +$render .= $openCL; + +$path = new render\Path(); // 设置 光线跟踪 参数,这里使用一个默认的参数 +$render .= $path; + +$sampler = new render\Sampler(); // 设置 采样器 配置参数,默认使用 Sobol 类型的自适应采样器 +$render .= $sampler; + +$lightStrategy = new render\LightStrategy(); // 设置 灯光策略 类型,默认使用 LOG_POWER 类型 +$render .= $lightStrategy; + +$filesaver = new render\FileSaver(); // 设置 文件储存格式 配置参数 +$render .= $filesaver; + +$batch = new render\Batch(); // 设置 渲染终止 参数, +$batch->haltspp = 1000; // 设置 每像素 采样达 800 则终止渲染 +// $batch->halttime = 2000; // 设置 渲染 超时参数, +$render .= $batch; + +$sceneCfg = new render\Scene(); // 设置 场景属性 参数 +$render .= $sceneCfg; + + +$film = new render\Film(); // 添加一个渲染胶片 +$film->width = 3000; // 设置渲染胶片宽度,单位像素 +$film->heigth = 3000; // 设置渲染胶片宽度,单位像素 +$img = new render\Image(); // 添加一个图像输出 +$img->effect = [new render\effect\Pretreatment(),new render\effect\ToneMapLinear(),new render\effect\CammaCorrection()]; + // 为该图像添加效果管线 +$film->addImage($img); // 将该图像输出添加到渲染胶片 + +$film->addImage(new render\Image(['type' => render\Image::TYPE_OBJECT_ID])); // 为渲染胶片添加一个 通道图类型 的图像输出 +$film->addImage(new render\Image(['type' => render\Image::TYPE_RGBA])); // 添加一个 透明底 的图像输出 + +$img = new render\Image(); // 添加一个图像输出,使用默认参数 +$img->effect[] = new render\effect\NoiseReducerOIDN(); // 添加降噪效果管线,使用默认参数 +$img->effect[] = new render\effect\Pretreatment(); // +$img->effect[] = new render\effect\ToneMapLinear(); // 添加一亮度效果管线,使用默认参数 +$img->effect[] = new render\effect\Synthesis(); // 添加一个合成效果管线,使用默认参数 +$img->effect[] = new render\effect\BackgroundImg( // 添加一个背景图像,使用默认参数 + [ + 'file' => "./map/纯白242.png" + ] +); +$img->effect[] = new render\effect\CammaCorrection(); // 添加一个 gamma 校正,,使用默认参数 +$film->addImage($img); // 将该图像输出添加到渲染胶片 +$render .= $film; + + +// 五、输出场景文件 scene.scn,及渲染文件 render.cfg +echo $scene; +$handle = fopen( "./DemoScene/scene.scn",'w+'); +fwrite($handle,$scene); +fclose($handle); + +echo $render ; +$handle = fopen( "./DemoScene/render.cfg",'w+'); +fwrite($handle,$render); +fclose($handle); + + + + +// // 六、启动渲染器 +// $cmd = "luxcoreconsole -o ./DemoScene/render.cfg -f ./DemoScene/scene.scn 1>./DemoScene/render.log 2>&1"; +// $output; +// $returnVar; +// exec($cmd,$output,$returnVar); + +// if( $returnVar == 127 ){ +// throw new \Exception("Please install the luxcorerender bin file in the system directory correctly,Or add to the system environment variable"); +// } ?> diff --git a/src/scene/materials/MaterialsBase.php b/src/scene/materials/MaterialsBase.php index ad1ba28..16746a5 100644 --- a/src/scene/materials/MaterialsBase.php +++ b/src/scene/materials/MaterialsBase.php @@ -13,52 +13,39 @@ class MaterialsBase extends BaseCfg /** * 材质类型 */ - const TYPE_DISNEY = 'disney'; //Disney材质,这是一种金属度流程的材质,并加入次表面、透明车漆、镀膜的物殊效果控制, - //是满足大多数材质调节的一种通用材质。 + const TYPE_DISNEY = 'disney'; //1, Disney材质,这是一种金属度流程的材质,并加入次表面、透明车漆、镀膜的物殊效果控制, + // 是满足大多数材质调节的一种通用材质。 + const TYPE_METAL = 'metal2'; //2, 金属度流程的金属材质 + const TYPE_MIRROR = 'mirror'; //3, 镜面材质,金属度流程 - const TYPE_METAL = 'metal2'; //金属度流程的金属材质 - const TYPE_MIRROR = 'mirror'; //镜面材质,金属度流程 + const TYPE_GLOSSY = 'glossy2'; //4, Glossy材质,这是一个高光光泽度流程的材质,是满足大多数以 高光光泽度流程 调节材质的 + // 一种通用材质。 + const TYPE_GLOSSYCOATING = 'glossycoating'; //5, GlossyCoating材质,这是一个高光光泽度流程的材质,是满足大多数以 高光光泽度流程 调 + // 节材质的一种通用材质。使用此类材质不能设置不透明度 + const TYPE_GLOSSYTRANSLUCENT = 'glossytranslucent'; //6, GlossyTranslucent材质,这是一个高光光泽度流程的半透明材质,是满足大多数以 + // 高光光泽度流程 调节材质的一种通用材质。使用此类材质不能设置不透明度 - const TYPE_GLOSSY = 'glossy2'; //Glossy材质,这是一个高光光泽度流程的材质,是满足大多数以 高光光泽度流程 调节材质的 - //一种通用材质。 - - const TYPE_GLOSSYCOATING = 'glossycoating'; //GlossyCoating材质,这是一个高光光泽度流程的材质,是满足大多数以 高光光泽度流程 调 - //节材质的一种通用材质。使用此类材质不能设置不透明度 - - const TYPE_GLOSSYTRANSLUCENT = 'glossytranslucent'; //GlossyTranslucent材质,这是一个高光光泽度流程的半透明材质,是满足大多数以 - //高光光泽度流程 调节材质的一种通用材质。使用此类材质不能设置不透明度 - - - const TYPE_GLASS = 'glass'; //普通的透明材质类型 - - const TYPE_ARCHGLASS = 'archglass'; //一种没色散属性的薄的透明材质类型,使用这种类型的材质,色散参必须要被禁用。用于薄薄的玻璃,折射不重要的地方(在传输过程中跳 - //过折射,传播alpha和阴影光线。如果不使用此选项,还可以将输出节点中的阴影颜色设置为白色,从而实现相同的效果,同时保持相机光线的折射,如果玻 - //璃板的边缘可见,效果会更好。) - - const TYPE_ROUGHGLASS = 'roughglass'; //粗糙玻离材质类型 + const TYPE_GLASS = 'glass'; //7, 普通的透明材质类型 + const TYPE_ARCHGLASS = 'archglass'; //8, 一种没色散属性的薄的透明材质类型,使用这种类型的材质,色散参必须要被禁用。用于薄薄的玻璃,折射不重要的地方(在传输过程中跳 + // 过折射,传播alpha和阴影光线。如果不使用此选项,还可以将输出节点中的阴影颜色设置为白色,从而实现相同的效果,同时保持相机光线的折射,如果玻 + // 璃板的边缘可见,效果会更好。) + const TYPE_ROUGHGLASS = 'roughglass'; //9, 粗糙玻离材质类型 - const TYPE_MATTE = 'matte'; //磨砂材质 - - const TYPE_ROUGHMATTE = 'roughmatte'; //粗糙的磨砂材质 - - const TYPE_MATTETRANSLUCENT = 'mattetranslucent'; //半透明的磨砂材质 - - - const TYPE_CARPAINT = 'carpaint'; //车漆材质,使用此类材质不能设置不透明度 - - const TYPE_CLOTH = 'cloth'; //布料材质 - - const TYPE_VELVET = 'velvet'; //丝绒材质 - - const TYPE_NULL = 'null'; //空的材质 + const TYPE_MATTE = 'matte'; //10, 磨砂材质 + const TYPE_ROUGHMATTE = 'roughmatte'; //11, 粗糙的磨砂材质 + const TYPE_MATTETRANSLUCENT = 'mattetranslucent'; //12, 半透明的磨砂材质 - const TYPE_MIX = 'mix'; //材质混合 - const TYPE_TWOSIDED = 'twosided'; //双面材质 + const TYPE_CARPAINT = 'carpaint'; //13, 车漆材质,使用此类材质不能设置不透明度 + const TYPE_CLOTH = 'cloth'; //14, 布料材质 + const TYPE_VELVET = 'velvet'; //15, 丝绒材质 + const TYPE_NULL = 'null'; //16, 空的材质 + const TYPE_MIX = 'mix'; //17, 材质混合 + const TYPE_TWOSIDED = 'twosided'; //18, 双面材质 /** * @var string 材质类型 @@ -208,7 +195,7 @@ class MaterialsBase extends BaseCfg /** * @param object $value 接收的是一个 由自身set函数 所接收到的值,本函数可以被这些类set函数调用, - * 并判断set函数接收到值是否合法,合法则返回$value,否则抛出一个异常 + * 并判断set函数接收到值是否合法,合法则返回$value,否则抛出一个异常 */ protected static function judgeAttribute($value) { diff --git a/src/scene/objects/Objects.php b/src/scene/objects/Objects.php index 60185d7..ed518ff 100644 --- a/src/scene/objects/Objects.php +++ b/src/scene/objects/Objects.php @@ -57,7 +57,7 @@ class Objects extends BaseCfg /** * @param object $value 接收的是一个 由自身set函数 所接收到的值,本函数可以被这些类set函数调用, - * 并判断set函数接收到值是否合法,合法则返回$value,否则抛出一个异常 + * 并判断set函数接收到值是否合法,合法则返回$value,否则抛出一个异常 */ protected static function judgeAttribute($value) { diff --git a/src/utils/MatHelper.php b/src/utils/MatHelper.php new file mode 100644 index 0000000..9ed9335 --- /dev/null +++ b/src/utils/MatHelper.php @@ -0,0 +1,36 @@ +