載入順序

  1. sdPBR.pmx
  2. sdPBRGBuffer.x
  3. skybox/*.x
    • 記得調整模型前附件數量為2
  4. skybox/skyboxDisplay*.pmx

設定調整

  • 快速調整:sdPBRconfig.exe
    • 可用帶ocr功能的翻譯app做基本翻譯
  • 設定路徑:shader/sdPBRconfig.fxsub
  • 設定說明:shader/sdPBRconfig解説.fxsub

說明文件

  • 整體說明:readme.html
    • 可用瀏覽器的翻譯功能直接機翻(Chrome等等)
  • 材質說明:material/説明
    • 所有材質參數的基本:基本編.fx
    • 程序紋理:プロシージャルテクスチャ編.fx
    • 法線紋理:法線マップとか編.fx
    • 紋理包:テクスチャパック編.fx
    • 動圖包:アニメーションテクスチャ編.fx
      • 使用動圖包的材質無法使用紋理包
  • 光源說明:lighting/同じ種類のライトをいくつでも置けるようになりました.txt
  • 擴充效果說明:posteffect/各自的資料夾內/(可能會有)違いの分かる男.txt

材質

一般用法是將material資料夾內的fx套用到Main面板,但有幾種material分類:

  • 一般材質:material
    • 場景:bg
      • 自動生成法線效果:autonormal
    • 人物身體:body
    • 人物衣服:cloth
    • 控制器:controllable
      • 控制器的fx建議調整float3行前面的=為*=,否則它的調整只取顏色而不混合貼圖
    • 整體說明內的示範材質:custom
    • 額外材質:etc
    • tool/MaterialImporter導入進來的材質:materialImporter
    • 程序化:procedural
      • 目前有水面
  • 頂點著色器:即vs_(VertexShader)開頭的material資料夾
    • 模型拉伸變形:2bone
    • 連續面分解:fracture
    • 放大、縮小:scale
  • workingfloor用材質:wf_material
    • 內容基本與一般材質一樣,只需要在一般材質內的fx添加以下代碼就能轉變成workingfloor用
#define IN_THE_MIRROR

材質部分參數中文說明

使用例可查看shader/sdPBRcommon.fxsub

路徑代號

  1. FILE - 讀取相對路徑or絕對路徑
  2. SP - 讀取高光紋理槽
  3. TEX - 讀取紋理槽
  4. PACK0 - 讀取紋理包1
  5. PACK1 - 讀取紋理包2
  6. SCREEN - 讀取Screen.bmp
  7. CODE

pack與file的差異是可同時被多個參數使用,比如:r通道給金屬度、b通道給粗糙度用,gb混合通道給法線使用

使用例:

#define NORMAL_FILE "Normal.jpg"
#define NORMAL_FROM NORMAL_FROM_FILE //Normal讀取上述FILE的貼圖路徑
#define TEXTURE_PACK0 "../../texture/hair_normal.jpg"
#define SUBNORMAL_FROM SUBNORMAL_FROM_PACK0 //subNormal讀取上述紋理包1的貼圖路徑

帶紋理參數

此塊會講解材質紋理部分的程式碼,同時可能會有些省略,帶有//的內容是註解。

"程式碼完整狀態"
void SetMaterialParam(inout Material m, float3 n,float3 l, float3 Eye, float2 uv)
{
//程式碼內部
}
//引用的內容,除了連接的前置處理器以及開頭的#define以外全是大寫。
#include "../../shader/sdPBRMaterialTail.fxsub" //連接的前置處理器
"將會被省略成以下內容"
{
//程式碼內部
}
//引用的內容,除了連接的前置處理器以及開頭的#define以外全是大寫。
#include "../../shader/sdPBRMaterialTail.fxsub"

baseColor

材質底色,如果沒有特別設定將會是模型材質的紋理槽路徑。

{
m.baseColor *= float3(R,G,B); //材質底色的乘算色
//m.baseColor += float3(R,G,B); //材質底色的加算色
//m.baseColor -= float3(R,G,B); //材質底色的減算色
//m.baseColor /= float3(R,G,B); //材質底色的除算色
//m.baseColor = float3(R,G,B); //材質底色的顏色,沒有和貼圖混合
m.baseColorLoops = 1; //材質底色循環貼圖次數
m.baseColorScale = 1; //材質底色貼圖深度
}
#define BASECOLOR_FROM BASECOLOR_FROM_TEX //沒有設定時的預設(被省略的)
#define BASECOLOR_GAMMA 2.2 //標準伽瑪值(被省略的)

#include "../../shader/sdPBRMaterialTail.fxsub"

subColor為baseColor的副參數。

Normal

法線,預設是沒有這個參數的。

{
m.normalLoops = 1; //Loop - 密度,數值越大密度越高
m.normalScale = 1; //Scale - 強度,數值越大效果越強
}
#define NORMAL_FROM NORMAL_FROM_SP //法線貼圖使用模型材質內的高光貼圖槽路徑
#define NORMAL_AUTOGEN //以上述的法線貼圖亮度梯度製造法線效果

#include "../../shader/sdPBRMaterialTail.fxsub"

subNormal為Normal的副參數。

AO

環境光遮蔽,預設是沒有這個參數的。

{
m.aoLoops = 1;
m.aoScale = 1;
}
#define AO_FILE "AO.jpg"
#define AO_FROM AO_FROM_FILE //AO的貼圖讀取上述FILE的貼圖路徑

#include "../../shader/sdPBRMaterialTail.fxsub"

Anisotropic

各向異性,預設是沒有這個參數的。

{
m.anisotropic = 1.00; //各向異性的強度
m.anisoAngleX = 0.00; //各向異性效果的左右旋轉
m.anisoAngleY = 0.00; //各向異性效果的上下旋轉

//m.anisotropicLoops = 1; //如不需要貼圖,此項無需使用
//m.anisoAngleXLoops = 1; //如不需要貼圖,此項無需使用
//m.anisoAngleYLoops = 1; //如不需要貼圖,此項無需使用
}
#define ANISOTROPIC_FUZZ //各向異性效果模糊
//#define ANISOANGLE_FROM ANISOANGLE_FROM_FILE
//#define ANISOANGLE_X_FROM ANISOANGLE_X_FROM_FILE
//#define ANISOANGLE_Y_FROM ANISOANGLE_Y_FROM_FILE
//#define ANISOANGLE_FILE "aniso.jpg"
//#define ANISOANGLE_X_FILE "aniso_X.jpg"
//#define ANISOANGLE_Y_FILE "aniso_Y.jpg"

#include "../../shader/sdPBRMaterialTail.fxsub"

可不用貼圖就使用此項

Specular

環境反射

{
m.specular = 1.00; //非金屬反射時,0.5為4%(一般材質常用)
m.specularTint = 1.00; //非金屬反射時,與基本色一起乘算,和金屬參數無法同時使用。
//m.metallic = 1.00;
}
#define TEXTURE_PACK0 "../texture/specular.png"
#define SPECULAR_FROM SPECULAR_FROM_PACK0

#include "../../shader/sdPBRMaterialTail.fxsub"

Roughness

粗糙度

{
m.roughness = 0.5; //可不使用貼圖就使用,0代表乾燥,1代表光滑,想要有凹凸的粗糙感則需使用法線貼圖,皮膚一般使用0.45~0.55。
m.roughnessLoops = 1;
m.subRoughnessLoops = 1; //副粗糙度貼圖密度
}

#define TEXTURE_PACK0 "../../texture/smoothness.png"

#define ROUGHNESS_FROM ROUGHNESS_FROM_PACK0
#define ROUGHNESS_CHANNEL b //上列貼圖使用藍色通道
#define ROUGHNESS_INVERT //因上列貼圖使用的是光滑度,需反轉成粗糙度貼圖使用
#define SUBROUGHNESS_FROM SUBROUGHNESS_FROM_PACK0

#include "../../shader/sdPBRMaterialTail.fxsub"

Height

高度(ParallaxOcclusion用)

{
m.heightLoops = 1.00;
m.heightScale = 1.00;
}
#define TEXTURE_PACK0 "../texture/height.png"
#define HEIGHT_FROM HEIGHT_FROM_PACK0

#include "../../shader/sdPBRMaterialTail.fxsub"

Mofu

絨毛

{
m.mofuLoops = 1.0; //絨毛的粗細
m.mofuScale = 1.0; //絨毛的最大長度(MMD單位,1.0 = 8cm)
}
#define IGNORE_SP //無視模型高光
//MOFU和Height無法同時使用
#define MOFU_FROM MOFU_FROM_FILE
#define MOFU_FILE "../../texture/fur.png"
#define MOFU_LOOPCOUNT 20

#define MOFU_MOFU 1 //數值0~1,絨毛對外觀的影響程度
#define MOFU_OCCLUSION 0.25 //數值0~1,絨毛深度

#include "../../shader/sdPBRMaterialTail.fxsub"

Metallic

金屬

{
m.metallic = 1.00;
}
#define TEXTURE_PACK0 "../texture/specular.png"
#define METALLIC_FROM METALLIC_FROM_PACK0

#include "../../shader/sdPBRMaterialTail.fxsub"

特殊參數

  • smoothShade
    • 平滑陰影,此項可藉由SdPBR.pmx控制整體,可以在Material內單獨使用
  • lightVisibility
    • 直接光的影響程度(x:diffuse,y:specular)
  • ambientVisibility
    • 環境光的影響程度(x:diffuse,y:specular)
  • shadowVisibility
    • 陰影濃度
  • SSDOVisibility
    • 螢幕空間定向遮蔽(SSDO)的影響程度

上述參數編寫參考

{
m.smoothShade = 1.0;
m.lightVisibility = float2(0.5, 1.0); //0.5的是diffuse(x位),1.0的是specular(y位)
m.ambientVisibility = float2(1.0, 1.0);
m.shadowVisibility = 1.0;
m.SSDOVisibility = 1.0;
}

HSV

可放置在Material內,使原本的RGB改以HSV形式使用。

{
float3 hsv = float3(h, s, v);
m.baseColor *= HSVtoRGB(hsv); //baseColor的乘算色使用上述hsv數值轉為RGB

float3 hsv1 = float3(h, s, v);
m.sssColor = HSVtoRGB(hsv1); //sssColor使用上述hsv1數值轉為RGB
}

H = Hue(色相),S = Saturation(飽和),V = Value(明度)

Shade Model ID

PREINTEGRATED_SKIN

皮膚的著色模式,會取用subsurface的曲率,無視toon。

{
m.baseColor *= float3(1.0,1.0,1.0)*1.0; //主色
m.subsurface = 0.5; //透光的程度,值越低會感覺更硬(角質厚重的感覺)
m.sssColor = float3(1.0,0.7,0.75); //透出來的顏色
m.roughness = 0.55; //粗糙程度,值越高越乾
}
#define PREINTEGRATED_SKIN //可以模擬人類皮膚透光感的著色模式

#include "../../shader/sdPBRMaterialTail.fxsub"

IRIDESCENCE

{
m.iridescence = 0.5; //彩虹色濃度(Saturation)
m.iridescenceD = 0.55; //彩虹色的色相(Hue)
}
#define IRIDESCENCE //彩虹色的著色模式

#include "../../shader/sdPBRMaterialTail.fxsub"

ANISOTROPIC_FUZZ

各項異性模糊

COSMETICS

妝感

{
m.porouscoat = 0.1; //sssColor與basecolor的融色程度
m.sssColor = float3(1.0,0.7,0.75);
m.clearcoat = 0.04;
m.subsurface = 0.5; //和皮膚的著色模式一樣。
//m.toon = 0.25; //無視toon
}
#define COSMETICS //妝感的著色模式
#include "../../shader/sdPBRMaterialTail.fxsub"