From f109caee76d2a0387d70c8a6d7fadbe98589fc6e Mon Sep 17 00:00:00 2001 From: yuanjiajia <1139393632@qq.com> Date: Thu, 6 Jul 2023 14:39:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=B2=E6=9F=93=E6=B5=8B=E5=BC=8F=20?= =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/MatHelper.php | 55 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/src/utils/MatHelper.php b/src/utils/MatHelper.php index 91fb068..b33946b 100644 --- a/src/utils/MatHelper.php +++ b/src/utils/MatHelper.php @@ -3,6 +3,7 @@ namespace Blobt\Luxcore\utils; use Blobt\Luxcore\scene\materials\Disney; +use Blobt\Luxcore\scene\texture\composite\Subtract; use Blobt\Luxcore\scene\texture\mapping\Mapping; use Blobt\Luxcore\scene\texture\procedural\ImageMap; use Blobt\Luxcore\scene\texture\transform\NormalMap; @@ -41,20 +42,20 @@ class MatHelper{ } - // 创建一个铺贴对象 + //创建一个铺贴对象,使用"uvmapping2d"类型的铺贴对象 $mapping = new Mapping(); - // 使用"uvmapping2d"类型的铺贴对象 $mapping->useUVMapping2d( // uv通道 0, // 旋转角度 "0", // 缩放比例 - "$textureScaleU $textureScaleV", + "{$textureScaleU} {$textureScaleV}", // 偏移量 "0 0", ); + // 加载反照率(基础颜色)纹理 if($matOriginal->matParams->albedoTexture){ $textureUrl = $matOriginal->matParams->albedoTexture; $textureSavaPath = $cacheFileDir.'/'.basename($textureUrl); @@ -68,6 +69,8 @@ class MatHelper{ $scene->registerTexture($albedoTexture); $material->setBaseColor($albedoTexture); } + + // 加载金属度纹理、粗糙度纹理 if($matOriginal->matParams->metallicTexture){ $metallicTextureUrl = $matOriginal->matParams->metallicTexture; $metallicTextureSavaPath = $cacheFileDir.'/'.basename($metallicTextureUrl); @@ -103,6 +106,8 @@ class MatHelper{ $scene->registerTexture($roughnessTexture); $material->setRoughness($roughnessTexture); } + + // 加载法线纹理 if($matOriginal->matParams->bumpTexture){ $textureUrl = $matOriginal->matParams->bumpTexture; $textureSavaPath = $cacheFileDir.'/'.basename($textureUrl); @@ -132,7 +137,6 @@ class MatHelper{ $imagick->setImageCompressionQuality(100); $imagick->writeImage($textureInvertGPath); - $bumpTexture = new ImageMap( ['file' => $textureInvertGPath] ); @@ -147,6 +151,49 @@ class MatHelper{ $material->setBumptex($normalTexture); } + // 加载清漆涂层纹理 + if($matOriginal->matParams->isClearCoatEnabled === self::OPEN && $matOriginal->matParams->clearCoatTexture){ + $textureUrl = $matOriginal->matParams->clearCoatTexture; + $savaTexturePath = $cacheFileDir.'/'.basename($textureUrl); + $savaTextureHandle = fopen($savaTexturePath, "w"); + (new Client())->get($textureUrl, [RequestOptions::SINK => $savaTextureHandle]); + + $fileName = preg_replace('/(\.[^\.]+)$/','',basename($savaTexturePath)); + $extension = preg_replace('/^('.$fileName.')+/','',basename($savaTexturePath)); + // 从清漆涂层纹理中 分离 红色通道 作为 清漆涂层强度纹理 + $coatIntensityTextureSavaPath = $cacheFileDir.'/'.$fileName.'_coatIntensity'.$extension; + $imagick = new Imagick($savaTexturePath); + $imagick->separateImageChannel(Imagick::CHANNEL_RED); + $imagick->setImageCompressionQuality(100); + $imagick->writeImage($coatIntensityTextureSavaPath); + $coatIntensityTexture = new ImageMap( + ['file' => $coatIntensityTextureSavaPath] + ); + $coatIntensityTexture->gamma = 1; + $coatIntensityTexture->mapping = $mapping; + $scene->registerTexture($coatIntensityTexture); + $material->setClearcoat($coatIntensityTexture); + // 从清漆涂层纹理中 分离 绿色通道 作为 清漆涂层光泽度纹理 + $coatGlossTextureSavaPath = $cacheFileDir.'/'.$fileName.'_coatGloss'.$extension; + $imagick = new Imagick($savaTexturePath); + $imagick->separateImageChannel(Imagick::CHANNEL_GREEN); + $imagick->setImageCompressionQuality(100); + $imagick->writeImage($coatGlossTextureSavaPath); + $coatGlossTexture = new ImageMap( + ['file' => $coatGlossTextureSavaPath] + ); + $coatGlossTexture->gamma = 1; + $coatGlossTexture->mapping = $mapping; + $scene->registerTexture($coatGlossTexture); + + $subtract = new Subtract(); + $subtract->setTexture1("1"); + $subtract-> setTexture2($coatGlossTexture); + $scene->registerTexture($subtract); + $material->setClearcoatgloss($subtract); + } + + //TODO: 更多贴图通道处理,待后续完善 return $material;