天天看點

glTF全解析——materialsglTF全解析——materials

glTF全解析——materials

glTF的材質部分,使用的是一組參數來定義材質。這些參數為

PBR

的各種參數,包括金屬性和粗糙性等參數。

結構圖

結構圖中展示了

meshs

materials

再到

textures

之間的過程。

例子

最簡單的例子

{
    "materials": [
        {
            "name": "gold",
            "pbrMetallicRoughness": {
                "baseColorFactor": [ 1.000, 0.766, 0.336, 1.0 ],
                "metallicFactor": 1.0,
                "roughnessFactor": 0.0
            }
        }
    ]
}
           

上述的代碼為最簡單的gltf材質的例子,其中包括了材質的名稱,和PBR的相關參數。

pbrMetallicRoughness

中的

baseColorFactor

為RGBA顔色,

metallicFactor

roughnessFactor

為0到1之間的float值。關于這兩個值如何影響材質的就不展開了,可能會寫PBR的相關文章。

加上紋理的例子

{
    "materials": [
        {
            "name": "Material0",
            "pbrMetallicRoughness": {
                "baseColorFactor": [ 0.5, 0.5, 0.5, 1.0 ],
                "baseColorTexture": {
                    "index": 1,
                    "texCoord": 1
                },
                "metallicFactor": 1,
                "roughnessFactor": 1,
                "metallicRoughnessTexture": {
                    "index": 2,
                    "texCoord": 1
                }
            },
            "normalTexture": {
                "scale": 2,
                "index": 3,
                "texCoord": 1
            },
            "emissiveFactor": [ 0.2, 0.1, 0.0 ]
        }
    ]
}
           

上述為加上圖檔的

material

的資料結構,可以看到在

pbrMetallicRoughness

中有

metallicRoughnessTexture

baseColorTexture

貼圖,但是在一些引擎中分為

metallic

metallic

貼圖,這樣直接兩個對應那張

metallicRoughnessTexture

就可以了。對于

baseColorTexture

來說,主要是對應了引擎中的基礎紋理。除了上述貼圖之外,一個

material

中還有

normalTexture

occlusionTexture

emissiveTexture

這三個結構類似,在texture中會詳細解釋。

其他屬性

{
    "materials": [
        {
            "name": "Material0",
            "pbrMetallicRoughness": {
                "baseColorFactor": [ 0.5, 0.5, 0.5, 1.0 ],
                "metallicFactor": 1,
                "roughnessFactor": 1,
            },
            "doubleSided": true,
            "alphaMode": "OPAQUE"
            "emissiveFactor": [ 0.2, 0.1, 0.0 ]
        }
    ]
}
           

其他屬性中主要有

alphaMode

doubleSided

,

alphaMode

又有三種模式:

  • “OPAQUE”:預設模式,完全不透明,忽略任何的alpha值
  • “MASK”:與另一個屬性

    alphaCutoff

    ,如果小于

    alphaCutoff

    的值則為完全透明,否則為完全不透明。

    alphaCutoff

    值隻有在"MASK"模式中生效,其他模式忽略該值。
  • “BLEND”:混合模式,該模式的顯示效果取決于各個引擎對該屬性的支援。

doubleSided

屬性,是否為雙面貼圖。

雜項——點和線的material

上述的屬性定義的都是三角片面下的各種情況,當物體為一個點或者一條線時。glTF官方沒有給出相關的限制和規範。但是官方也給出了在不同情境的一般處理分為三種情況:

  • 有TANRENT和NORMAL的情況下,按照正常的光照模型和法線貼圖進行渲染。
  • 沒有TANGENT的情況下,沒有法線貼圖。
  • 沒有NORMAL的情況下,隻輸出顔色值,不計算光照。

相關參數

material

類型 描述 是否必須
name

string

材質名 No
extensions

object

材質拓展(draco)用 No
extras

any

其他的補充資訊 No
pbrMetallicRoughness

object

pbr流程的相關參數 No
normalTexture

object

法線貼圖 No
occlusionTexture

object

遮蔽貼圖對應着AO圖 No
emissiveTexture

object

自發光貼圖 No
emissiveFactor

number

[3]

自發光強度 No, default:

[0,0,0]

alphaMode

string

alpha模式 No, default:

"OPAQUE"

alphaCutoff

number

alpha模式中的"MASK"使用 No, default:

0.5

doubleSided

boolean

是否為雙面材質 No, default:

false

pbrMetallicRoughness

類型 描述 是否必須
baseColorFactor

number

[4]

基礎顔色 No, default:

[1,1,1,1]

baseColorTexture

object

基礎的map的圖檔路徑 No
metallicFactor

number

金屬感強度 No, default:

1

roughnessFactor

number

粗糙感強度 No, default:

1

metallicRoughnessTexture

object

金屬或者粗糙度的圖檔 No
extensions

object

屬性拓展 No
extras

any

附加屬性 No

normalTexture

類型 描述 是否必須
index

integer

圖檔的下标 Yes
texCoord

integer

在primitives.attributes中的位置,如果是0則為TEXCOORD_0 No, default:
scale

number

縮放比例,按照

scaledNormal = normalize((<sampled normal texture value> * 2.0 - 1.0) * vec3(<normal scale>, <normal scale>, 1.0))

來設定
No, default:

1

extensions

object

拓展的屬性 No
extras

any

附加資訊 No

occlusionTextureInfo

類型 描述 是否必須
index

integer

圖檔的下标 Yes
texCoord

integer

在primitives.attributes中的位置,如果是0則為TEXCOORD_0 No, default:
strength

number

遮蔽強度 No, default:

1

extensions

object

拓展的屬性 No
extras

any

附加資訊 No

結束

關于各個的屬性的schema,太多了就不貼上來了,想了解具體的直接去官網看就行。

傳送門:https://github.com/KhronosGroup/glTF/tree/master/specification/2.0

繼續閱讀