yuanjiajia
2 years ago
4 changed files with 7584 additions and 0 deletions
-
308examples/matRenderTest.php
-
BINsceneTemplate/map/environment.env
-
BINsceneTemplate/map/shendoEnv.exr
-
7276sceneTemplate/map/shendoEnv.hdr
@ -0,0 +1,308 @@ |
|||
<?php |
|||
|
|||
|
|||
|
|||
namespace Blobt\Luxcore\scene; |
|||
|
|||
use Blobt\Luxcore\scene\lights\Emission; |
|||
use Blobt\Luxcore\scene\lights\env\HdrImage; |
|||
use Blobt\Luxcore\scene\materials\Disney; |
|||
use Blobt\Luxcore\scene\materials\Matte; |
|||
use Blobt\Luxcore\scene\objects\Objects; |
|||
use Blobt\Luxcore\scene\render\Batch; |
|||
use Blobt\Luxcore\scene\render\effect\BackgroundImg; |
|||
use Blobt\Luxcore\scene\render\effect\CammaCorrection; |
|||
use Blobt\Luxcore\scene\render\effect\NoiseReducerOIDN; |
|||
use Blobt\Luxcore\scene\render\effect\Pretreatment; |
|||
use Blobt\Luxcore\scene\render\effect\Synthesis; |
|||
use Blobt\Luxcore\scene\render\effect\ToneMapLinear; |
|||
use Blobt\Luxcore\scene\render\FileSaver; |
|||
use Blobt\Luxcore\scene\render\Film; |
|||
use Blobt\Luxcore\scene\render\Filter; |
|||
use Blobt\Luxcore\scene\render\Image; |
|||
use Blobt\Luxcore\scene\render\LightStrategy; |
|||
use Blobt\Luxcore\scene\render\Native; |
|||
use Blobt\Luxcore\scene\render\OpenCL; |
|||
use Blobt\Luxcore\scene\render\Path; |
|||
use Blobt\Luxcore\scene\render\RenderEngine; |
|||
use Blobt\Luxcore\scene\render\Sampler; |
|||
use Blobt\Luxcore\scene\texture\mapping\Mapping; |
|||
use Blobt\Luxcore\scene\texture\procedural\ImageMap; |
|||
use Blobt\Luxcore\utils\MatHelper; |
|||
use GuzzleHttp\Client; |
|||
use GuzzleHttp\RequestOptions; |
|||
|
|||
include dirname(dirname(__FILE__)) . "/vendor/autoload.php"; |
|||
|
|||
const OPEN = true | 1; |
|||
const CLOSE = false | 0; |
|||
/** |
|||
* 标准材质长宽 |
|||
*/ |
|||
const MAT_STANDARD_SIZE = 1000; |
|||
const UNIT_CONVERSION_MM_TO_M = 0.001; |
|||
|
|||
|
|||
|
|||
|
|||
$client = new Client(); |
|||
$response = $client->get("deep3d.backend-api.dev.com/test/render-task"); |
|||
$resContents = $response->getBody()->getContents(); |
|||
$result = json_decode($resContents,false); |
|||
$taskData = $result->data; |
|||
$taskScene = $taskData->scene; |
|||
$taskModel = $taskScene->model; |
|||
$taskCamera = $taskScene->camera; |
|||
|
|||
|
|||
|
|||
|
|||
/** |
|||
* 创建 Luxcore 材质 |
|||
*/ |
|||
function createLuxcoreMat($matOriginal, $textureScaleU, $textureScaleV, $cacheFileDir, $scene){ |
|||
switch($matOriginal->renderType){ |
|||
case 1: |
|||
return MatHelper::createMatOfDisney($matOriginal, $textureScaleU, $textureScaleV, $cacheFileDir, $scene); |
|||
case 2: |
|||
return; |
|||
case 3: |
|||
return; |
|||
case 4: |
|||
return; |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
// 创建一个场景;
|
|||
$scene = new Scene(); |
|||
$sceneTemplatePath = dirname(dirname(__FILE__)) . "/sceneTemplate"; |
|||
|
|||
|
|||
// 一、创建光场:
|
|||
|
|||
// 8、创建环境光
|
|||
$light = new HdrImage([ |
|||
'gain' => "1 1 1", |
|||
'transformation' => "-1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1", |
|||
'file' => "./map/shendoEnv.exr", |
|||
'gamma' => 1, |
|||
'storage' => "float" |
|||
]); |
|||
$light->id = 0; |
|||
$scene->registerLight($light); |
|||
|
|||
// 9、创建地面模型
|
|||
$mapping = new Mapping(); |
|||
$mapping->useUVMapping2d(0, "0", "0.4 -0.966", "0.3 0.983"); |
|||
$texture = new ImageMap([ |
|||
'file' => "./map/方形阴影遮照.png", |
|||
'gain' => 0.6, |
|||
'gamma' => 1, |
|||
]); |
|||
$texture->mapping = $mapping; |
|||
$scene->registerTexture($texture); |
|||
$material = new Disney([ |
|||
'shadowcatcherEnable' => OPEN, |
|||
'photongiEnable' => CLOSE |
|||
]); |
|||
$material->setBaseColor('1 1 1'); |
|||
$material->setTransparencyFront($texture); |
|||
$material->setTransparencyBack($texture); |
|||
$scene->registerMaterial($material); |
|||
$obj = new Objects(); |
|||
$obj->ply = './ply/ground.ply'; |
|||
$obj->setMaterial($material); |
|||
$scene->registerObjects($obj); |
|||
|
|||
|
|||
// 二、添加要渲染的模型
|
|||
foreach($taskModel->childsParams as $childParams){ |
|||
$cacheFileDir = $sceneTemplatePath.'/cacheFiles'; |
|||
$material = null; |
|||
$matOriginal = (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($matOriginal)){ |
|||
$textureScaleU = $taskModel->uvScale*(MAT_STANDARD_SIZE/$matOriginal->width); |
|||
$textureScaleV = $taskModel->uvScale*(MAT_STANDARD_SIZE/$matOriginal->height)*-1; |
|||
$material = createLuxcoreMat($matOriginal, $textureScaleU, $textureScaleV, $cacheFileDir, $scene); |
|||
}else{ |
|||
$material = new Disney(); |
|||
$material->setBaseColor('1 1 1'); |
|||
} |
|||
$scene->registerMaterial($material); |
|||
|
|||
$plyFileSavaPath = $cacheFileDir.'/'.basename($childParams->childPlyFile); |
|||
$plyFileHandle = fopen($plyFileSavaPath, "w"); |
|||
(new Client())->get($childParams->childPlyFile, [RequestOptions::SINK => $plyFileHandle]); |
|||
$obj = new Objects(); |
|||
$obj->ply = $plyFileSavaPath; |
|||
$obj->setMaterial($material); |
|||
$scene->registerObjects($obj); |
|||
} |
|||
|
|||
|
|||
// 三、创建相机
|
|||
$position = $taskCamera->position; |
|||
$position->x = $position->x * UNIT_CONVERSION_MM_TO_M; |
|||
$position->y = $position->y * UNIT_CONVERSION_MM_TO_M; |
|||
$position->z = $position->z * UNIT_CONVERSION_MM_TO_M; |
|||
$target = $taskCamera->target; |
|||
$target->x = $target->x * UNIT_CONVERSION_MM_TO_M; |
|||
$target->y = $target->y * UNIT_CONVERSION_MM_TO_M; |
|||
$target->z = $target->z * UNIT_CONVERSION_MM_TO_M; |
|||
$upVector = $taskCamera->upVector; |
|||
$camera = new camera\Perspective( |
|||
[ |
|||
'autovolumeEnable' => 0, |
|||
'lookatOrig' => "{$position->x} {$position->y} {$position->z}", |
|||
'lookatTarget' => "{$target->x} {$target->y} {$target->z}", |
|||
'up' => "{$upVector->x} {$upVector->y} {$upVector->z}", |
|||
'screenwindow' => "-1 1 -1 1", |
|||
'autofocusEnable' => 0, |
|||
'fieldofview' => $taskCamera->fov, |
|||
'cliphither' => 0.1, |
|||
] |
|||
); |
|||
$camera->bokeh->blades = 0; |
|||
$scene->registerCamera($camera); |
|||
|
|||
|
|||
// 四、设置渲染参数
|
|||
// gpu 渲染
|
|||
$render = ''; |
|||
$renderEngine = new RenderEngine(); |
|||
$render .= $renderEngine; |
|||
|
|||
$openCL = new OpenCL(); |
|||
// $openCL->cpuUse = OpenCL::CLOSE;
|
|||
// $openCL->nativeThreadsCount = 0;
|
|||
$render .= $openCL; |
|||
|
|||
$lightStrategy = new LightStrategy(); |
|||
$render .= $lightStrategy; |
|||
|
|||
$path = new Path(); |
|||
$render .= $path; |
|||
|
|||
$sampler = new Sampler(); |
|||
$render .= $sampler; |
|||
|
|||
$filesaver = new FileSaver(); |
|||
$render .= $filesaver; |
|||
|
|||
$batch = new Batch(); |
|||
$batch->haltspp = 4000; |
|||
// $batch->halttime = 2000;
|
|||
$render .= $batch; |
|||
|
|||
$sceneCfg = new render\Scene(); |
|||
$render .= $sceneCfg; |
|||
|
|||
|
|||
// // cpu 渲染
|
|||
// $render = '';
|
|||
// $renderEngine = new RenderEngine();
|
|||
// $renderEngine->type = RenderEngine::TYPE_PATHCPU;
|
|||
// $render .= $renderEngine;
|
|||
|
|||
// $native = new Native();
|
|||
// $render .= $native;
|
|||
|
|||
// $lightStrategy = new LightStrategy();
|
|||
// $render .= $lightStrategy;
|
|||
|
|||
// $path = new Path();
|
|||
// $render .= $path;
|
|||
|
|||
// $sampler = new Sampler();
|
|||
// $render .= $sampler;
|
|||
|
|||
// $filesaver = new FileSaver();
|
|||
// $filesaver->renderengineType = FileSaver::TYPE_PATHCPU;
|
|||
// $render .= $filesaver;
|
|||
|
|||
// $batch = new Batch();
|
|||
// $batch->haltspp = 200;
|
|||
// // $batch->halttime = 2000;
|
|||
// $render .= $batch;
|
|||
|
|||
// $sceneCfg = new render\Scene();
|
|||
// $render .= $sceneCfg;
|
|||
|
|||
|
|||
// 图像输出设置
|
|||
$imageOutDir = $sceneTemplatePath.'/imageOut'; |
|||
$film = new Film(); |
|||
|
|||
$filter = new Filter(); |
|||
$filter->type = Filter::TYPE_GAUSSIAN; |
|||
$filter->gaussianAlpha = 1; |
|||
$filter->width = 1; |
|||
|
|||
$film->filter = $filter; |
|||
$film->width = 4096; |
|||
$film->heigth = 4096; |
|||
|
|||
$img = new Image(); |
|||
$img->effect = [new Pretreatment(),new ToneMapLinear(),new CammaCorrection()]; |
|||
$film->addImage($img, $imageOutDir); |
|||
|
|||
$film->addImage(new Image(['type' => Image::TYPE_OBJECT_ID]), $imageOutDir); |
|||
$film->addImage(new Image(['type' => Image::TYPE_RGBA]), $imageOutDir); |
|||
|
|||
$img = new Image(); |
|||
// $img->effect[] = new NoiseReducerOIDN();
|
|||
$img->effect[] = new Pretreatment(); |
|||
$img->effect[] = new ToneMapLinear(); |
|||
$img->effect[] = new Synthesis(); |
|||
$img->effect[] = new BackgroundImg( |
|||
[ |
|||
'file' => "./map/纯白242.png" |
|||
] |
|||
); |
|||
$img->effect[] = new CammaCorrection(); |
|||
$film->addImage($img, $imageOutDir); |
|||
$render .= $film; |
|||
|
|||
|
|||
// 五、输出场景文件 scene.scn,及渲染文件 render.cfg
|
|||
$cfgPath = $sceneTemplatePath . "/render.cfg"; |
|||
$scenePath = $sceneTemplatePath . "/scene.scn"; |
|||
$logPath = $sceneTemplatePath . "/log/render.log"; |
|||
|
|||
echo $scene; |
|||
$handle = fopen( $scenePath,'w+'); |
|||
fwrite($handle,$scene); |
|||
fclose($handle); |
|||
|
|||
echo $render ; |
|||
$handle = fopen( $cfgPath,'w+'); |
|||
fwrite($handle,$render); |
|||
fclose($handle); |
|||
|
|||
|
|||
|
|||
|
|||
// 六、启动渲染器
|
|||
$cmd = "luxcoreconsole -o " . $cfgPath . " -f " . $scenePath . " 1>" . $logPath . " 2>&1"; |
|||
echo "\n".$cmd."\n"; |
|||
$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"); |
|||
} |
|||
|
|||
?>
|
7276
sceneTemplate/map/shendoEnv.hdr
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Write
Preview
Loading…
Cancel
Save
Reference in new issue