From f89f7c88fea069766b9d70e7dd70231d56d0bf22 Mon Sep 17 00:00:00 2001 From: yuanjiajia <1139393632@qq.com> Date: Thu, 13 Jul 2023 14:35:40 +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 | 88 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/src/utils/MatHelper.php b/src/utils/MatHelper.php index 4120912..aacf2d8 100644 --- a/src/utils/MatHelper.php +++ b/src/utils/MatHelper.php @@ -319,6 +319,50 @@ class MatHelper{ $material->setVroughness($roughnessTexture); } + // 加载法线纹理 + if($matOriginal->matParams->bumpTexture){ + $textureUrl = $matOriginal->matParams->bumpTexture; + $textureSavaPath = $cacheFileDir.'/'.basename($textureUrl); + $textureSavaHandle = fopen($textureSavaPath, "w"); + (new Client())->get($textureUrl, [RequestOptions::SINK => $textureSavaHandle]); + + // 因为 LuxCore 使用 opengl 规范的法线纹理格式,与 babylon 使用的 DirectX 不同, + // 所以这里需要反转 G 通道色值,以保证法线纹理应用效果与 babylon 一致。 + $fileName = preg_replace('/(\.[^\.]+)$/','',basename($textureSavaPath)); + $extension = preg_replace('/^('.$fileName.')+/','',basename($textureSavaPath)); + $textureInvertSavaGPath = $cacheFileDir.'/'.$fileName.'_InvertG'.$extension; + $imagick = new Imagick($textureSavaPath); + $imageIterator = $imagick->getPixelIterator(); + foreach ($imageIterator as $row => $pixels) { + foreach ($pixels as $column => $pixel) { + // 获取每个像素色值; + $value = $pixel->getColor(); + // 反相绿色通道色值; + $r = $value["r"]; + $g = abs(($value["g"] - 255)); + $b = $value["b"]; + $a = $value["a"]; + $pixel->setColor("rgba({$r}, {$g}, {$b}, {$a})"); + } + $imageIterator->syncIterator(); + } + $imagick->setImageCompressionQuality(100); + $imagick->writeImage($textureInvertSavaGPath); + + $bumpTexture = new ImageMap( + ['file' => $textureInvertSavaGPath] + ); + $bumpTexture->gamma = 1; + $bumpTexture->mapping = $mapping; + $scene->registerTexture($bumpTexture); + + $normalTexture = new NormalMap(); + $normalTexture->setTexture($bumpTexture); + $normalTexture->scale = $matOriginal->matParams->bumpLevel; + $scene->registerTexture($normalTexture); + $material->setBumptex($normalTexture); + } + return $material; } @@ -443,6 +487,50 @@ class MatHelper{ $material->setVroughness($roughnessTexture); } + // 加载法线纹理 + if($matOriginal->matParams->bumpTexture){ + $textureUrl = $matOriginal->matParams->bumpTexture; + $textureSavaPath = $cacheFileDir.'/'.basename($textureUrl); + $textureSavaHandle = fopen($textureSavaPath, "w"); + (new Client())->get($textureUrl, [RequestOptions::SINK => $textureSavaHandle]); + + // 因为 LuxCore 使用 opengl 规范的法线纹理格式,与 babylon 使用的 DirectX 不同, + // 所以这里需要反转 G 通道色值,以保证法线纹理应用效果与 babylon 一致。 + $fileName = preg_replace('/(\.[^\.]+)$/','',basename($textureSavaPath)); + $extension = preg_replace('/^('.$fileName.')+/','',basename($textureSavaPath)); + $textureInvertSavaGPath = $cacheFileDir.'/'.$fileName.'_InvertG'.$extension; + $imagick = new Imagick($textureSavaPath); + $imageIterator = $imagick->getPixelIterator(); + foreach ($imageIterator as $row => $pixels) { + foreach ($pixels as $column => $pixel) { + // 获取每个像素色值; + $value = $pixel->getColor(); + // 反相绿色通道色值; + $r = $value["r"]; + $g = abs(($value["g"] - 255)); + $b = $value["b"]; + $a = $value["a"]; + $pixel->setColor("rgba({$r}, {$g}, {$b}, {$a})"); + } + $imageIterator->syncIterator(); + } + $imagick->setImageCompressionQuality(100); + $imagick->writeImage($textureInvertSavaGPath); + + $bumpTexture = new ImageMap( + ['file' => $textureInvertSavaGPath] + ); + $bumpTexture->gamma = 1; + $bumpTexture->mapping = $mapping; + $scene->registerTexture($bumpTexture); + + $normalTexture = new NormalMap(); + $normalTexture->setTexture($bumpTexture); + $normalTexture->scale = $matOriginal->matParams->bumpLevel; + $scene->registerTexture($normalTexture); + $material->setBumptex($normalTexture); + } + return $material; }