【Filament】材质系统

news2024/11/30 20:30:22

1 前言

        本文主要介绍 Filament 的材质系统,官方介绍详见 → Filament Materials Guide。材质系统中会涉及到一些空间和变换的知识点,可以参考:【Unity3D】空间和变换、【Unity3D】Shader常量、变量、结构体、函数、【OpenGL ES】MVP矩阵变换、【OpenGL ES】透视变换原理。

        需要注意的是,Unity 世界空间是左手坐标系,OpenGL 和 Filament 的世界空间是右手坐标系,Filament 的世界空间坐标轴如下。

红 +X, 绿 +Y, 蓝 +Z

        读者如果对 Filament 不太熟悉,请回顾以下内容。

  • Filament环境搭建
  • 绘制三角形
  • 绘制矩形
  • 绘制圆形
  • 绘制立方体
  • 纹理贴图
  • 立方体贴图(6张图)
  • 加载obj和fbx模型
  • 自定义Blinn Phong光照模型
  • 基于物理的光照(PBR)
  • 壁纸

2 材质结构

        材质的格式是一种松散地基于 JSON 的格式,Filament 官方称之为 JSONish 格式。在顶层,材质定义由 JSON 对象表示的 3 个不同块组成,如下。其中,vertex 块是可选的,必须包含 material 和 fragment 块。

material {
    // 材质属性
}

vertex {
    // 顶点着色器(可选)
}

fragment {
    // 片元着色器
}

         JSONish 格式具有以下特点。

  • JSON 格式为【"key" : value】;JSONish 格式为【key : value】,当字符串包含空格时,需要引号;
  • 允许使用单行 C++ 样式的注释;
  • key 区分大小写,value 不区分大小写。

2.1 材质属性(material)

        材质属性(material)中可以定义材质名(name)、外部参数(parameters)、顶点属性参数(requires)、光照模型(shadingModel)、混合模式(blending)等。

material {
    name : "Textured material",
    parameters : [ // 外部参数
        {
           type : sampler2d,
           name : texture
        },
        {
           type : float,
           name : metallic
        },
        {
            type : float,
            name : roughness
        }
    ],
    requires : [ // 顶点属性
        uv0
    ],
    shadingModel : lit, // 光照模型
    blending : opaque // 混合模式
}
  • parameters:外部参数,纹理类型参数可以通过 materialParams_xxx 访问(如 materialParams_texture),其他类型参数可以通过 materialParams.xxx 访问(如 materialParams.metallic)。
  • requires:顶点属性参数,会参与光栅化,取值有:uv0、uv1、color、position、tangents、custom0 ~ custom。
  • shadingModel:光照模型,取值有 lit、subsurface、cloth、unlit、specularGlossiness,默认取 lit。
  • blending:混合模式,取值有:opaque、transparent、fade、add、multiply、screen、masked,默认取 opaque。

2.2 顶点着色器(vertex)

        顶点着色器(vertex)中可以对顶点的属性进行变换,如下。

vertex {
    void materialVertex(inout MaterialVertexInputs material) {
        float3 p = getPosition().xyz;
        float3 u = mulMat4x4Float3(getViewFromClipMatrix(), p).xyz;
        material.eyeDirection.xyz = mulMat3x3Float3(getWorldFromViewMatrix(), u);
    }
}

2.3 片元着色器块(fragment)

        片元着色器(fragment)中可以计算光照模型所需的参数,如下。

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        material.baseColor = texture(materialParams_texture, getUV0());
        material.metallic = materialParams.metallic;
        material.roughness = materialParams.roughness;
    }
}

         其中,materialParams_texture、materialParams.metallic、materialParams.roughness 是材质属性中定义的外部参数。

3 输入结构

        顶点着色器的输入结构体如下。

struct MaterialVertexInputs {
    float4 color;              // if the color attribute is required
    float2 uv0;                // if the uv0 attribute is required
    float2 uv1;                // if the uv1 attribute is required
    float3 worldNormal;        // only if the shading model is not unlit
    float4 worldPosition;      // always available (see note below about world-space)

    mat4   clipSpaceTransform; // default: identity, transforms the clip-space position, only available for `vertexDomain:device`

    // variable* names are replaced with actual names
    float4 variable0;          // if 1 or more variables is defined
    float4 variable1;          // if 2 or more variables is defined
    float4 variable2;          // if 3 or more variables is defined
    float4 variable3;          // if 4 or more variables is defined
};

        片元着色器的输入结构体如下。

struct MaterialInputs {
    float4 baseColor;           // default: float4(1.0)
    float4 emissive;            // default: float4(0.0, 0.0, 0.0, 1.0)
    float4 postLightingColor;   // default: float4(0.0)

    // no other field is available with the unlit shading model
    float  roughness;           // default: 1.0
    float  metallic;            // default: 0.0, not available with cloth or specularGlossiness
    float  reflectance;         // default: 0.5, not available with cloth or specularGlossiness
    float  ambientOcclusion;    // default: 0.0

    // not available when the shading model is subsurface or cloth
    float3 sheenColor;          // default: float3(0.0)
    float  sheenRoughness;      // default: 0.0
    float  clearCoat;           // default: 1.0
    float  clearCoatRoughness;  // default: 0.0
    float3 clearCoatNormal;     // default: float3(0.0, 0.0, 1.0)
    float  anisotropy;          // default: 0.0
    float3 anisotropyDirection; // default: float3(1.0, 0.0, 0.0)

    // only available when the shading model is subsurface or refraction is enabled
    float  thickness;           // default: 0.5

    // only available when the shading model is subsurface
    float  subsurfacePower;     // default: 12.234
    float3 subsurfaceColor;     // default: float3(1.0)

    // only available when the shading model is cloth
    float3 sheenColor;          // default: sqrt(baseColor)
    float3 subsurfaceColor;     // default: float3(0.0)

    // only available when the shading model is specularGlossiness
    float3 specularColor;       // default: float3(0.0)
    float  glossiness;          // default: 0.0

    // not available when the shading model is unlit
    // must be set before calling prepareMaterial()
    float3 normal;              // default: float3(0.0, 0.0, 1.0)

    // only available when refraction is enabled
    float transmission;         // default: 1.0
    float3 absorption;          // default float3(0.0, 0.0, 0.0)
    float ior;                  // default: 1.5
    float microThickness;       // default: 0.0, not available with refractionType "solid"
}

4 数据类型

NameGLSL typeDescription
bool2bvec2A vector of 2 booleans
bool3bvec3A vector of 3 booleans
bool4bvec4A vector of 4 booleans
int2ivec2A vector of 2 integers
int3ivec3A vector of 3 integers
int4ivec4A vector of 4 integers
uint2uvec2A vector of 2 unsigned integers
uint3uvec3A vector of 3 unsigned integers
uint4uvec4A vector of 4 unsigned integers
float2float2A vector of 2 floats
float3float3A vector of 3 floats
float4float4A vector of 4 floats
float4×4mat4A 4×4 float matrix
float3×3mat3A 3×3 float matrix

5 材质函数

5.1 Math

NameTypeDescription
PIfloatπ
HALF_PIfloatπ / 2
saturate(float x)float将 x 约束在 0 ~ 1 之间
pow5(float x)floatx ^ 5
sq(float x)floatx ^ 2
max3(float3 v)float获取向量中最大的分量
mulMat4×4Float3(float4×4 m, float3 v)float4m * v
mulMat3×3Float3(float4×4 m, float3 v)float4m * v

5.2 Matrices

NameTypeDescription
getViewFromWorldMatrix()float4×4[世界空间->观察空间]的变换矩阵V
getWorldFromViewMatrix()float4×4[观察空间->世界空间]的变换矩阵V'
getClipFromViewMatrix()float4×4[观察空间->裁剪空间]的变换矩阵P
getViewFromClipMatrix()float4×4[裁剪空间->观察空间]的变换矩阵P'
getClipFromWorldMatrix()float4×4[世界空间->裁剪空间]的变换矩阵VP
getWorldFromClipMatrix()float4×4[裁剪空间->世界空间]的变换矩阵(VP)'
getUserWorldFromWorldMatrix()float4×4[世界空间->用户世界空间]的变换矩阵
getWorldFromModelMatrix()float4×4[模型空间->世界空间]的变换矩阵M(Vertex only)
getWorldFromModelNormalMatrix()float3×3[模型空间->世界空间]的法线变换矩阵(Vertex only)

5.3 Frame constants

NameTypeDescription
getResolution()float4(width, height, 1 / width, 1 / height),单位:pixels
getWorldCameraPosition()float3相机的世界空间坐标
getWorldOffset()float3获取 api 级世界空间的位置(已弃用,使用 getUserWorldPosition 替代)
getTime()float获取当前时间,范围:0 ~ 1,单位:s
getUserTime()float4(time, (double)time - time, 0, 0)
getUserTimeMod(float m)float获取当前时间,范围:0 ~ m,单位:s
getExposure()float照相机的曝光度
getEV100()float相机在 ISO 100 下的曝光度

5.4 Vertex only

NameTypeDescription
getPosition()float4获取模型空间顶点坐标
getCustom0() to getCustom7()float4获取模型的 Custom0 ~ Custom7 的值
getVertexIndex()int获取顶点的索引

5.5 Fragment only

NameTypeDescription
getWorldTangentFrame()float3×3世界空间列向量:tangent、bi-tangent、normal,如果材质没有计算凹凸贴图的切空间法线,或者材质不是各向异性的,那么在这个矩阵中只有法线是有效的。
getWorldPosition()float3片元的世界空间坐标
getUserWorldPosition()float3片元的用户世界空间坐标
getWorldViewVector()float3世界空间下,片元指向相机的单位方向向量
getWorldNormalVector()float3世界空间下,经凹凸映射后的片元的单位法线向量(必须在 prepareMaterial() 之后使用)
getWorldGeometricNormalVector()float3世界空间下,凹凸映射前的片元的单位法线向量 (可以在 prepareMaterial() 之前使用)
getWorldReflectedVector()float3view 向量关于法线的反向量(必须在 prepareMaterial() 之后使用)
getNormalizedViewportCoord()float3标准化的用户视口位置(即 NDC 坐标标准化为 [0,1] 的位置,[1,0] 的深度,可以在prepareMaterial() 之前使用)。因为用户视口比实际的物理视口小,所以在物理视口的不可见区域中,这些坐标可以为负或大于 1。
getNdotV()float获取法线向量与观察向量的点积,即:dot(normal, view),返回结果严格大于 0(必须在 prepareMaterial() 之后使用)
getColor()float4获取片元经光栅化插值后的颜色(当 required 中包含 color 时才可用)
getUV0()float2获取 uv0 纹理坐标(当 required 中包含 uv0 时才可用)
getUV1()float2获取 uv1 纹理坐标(当 required 中包含 uv1 时才可用)
getMaskThreshold()float获取遮罩阈值(当 blending 设置为 masked 才可用
inverseTonemap(float3)float3将逆色调映射操作应用于指定的线性 sRGB 颜色并返回线性 sRGB 颜色。此操作可能是近似的,并且与 “Filmic” 色调映射操作一起使用效果最好
inverseTonemapSRGB(float3)float3将逆色调映射操作应用于指定的非线性 sRGB 颜色并返回线性 sRGB 颜色。此操作可能是近似的,并且与 “Filmic” 色调映射操作一起使用效果最好
luminance(float3)float计算指定的线性 sRGB 颜色的亮度
ycbcrToRgb(float, float2)float3将亮度和 CbCr 对转换为 sRGB 颜色
uvToRenderTargetUV(float2)float2转换 UV 坐标以允许从 RenderTarget 中采样

6 光照模型(Lighting model)

        在 material 块中,通过 shadingModel 属性配置光照模型,取值主要有:lit、subsurface、cloth、unlit、specularGlossiness,默认取 lit。

6.1 lit model

        lit model 官方介绍见 → litmodel,可以配置的参数如下。

PropertyTypeRangeNoteDefinition
baseColorfloat4[0..1]Linear RGB非金属表面的漫射反照率和金属表面的镜面颜色
metallicfloat[0..1]0 or 1表面是介电(0)还是导体(1)
roughnessfloat[0..1]感知表面的平滑度(1)或粗糙(0)
reflectancefloat[0..1]Prefer values > 0.35表面正入射菲涅耳反射率,控制了反射的强度
sheenColorfloat3[0..1]Linear RGB光泽层的强度
sheenRoughnessfloat[0..1]光泽层的平滑度或粗糙度
clearCoatfloat[0..1]0 or 1透明涂层的强度
clearCoatRoughnessfloat[0..1]可感知的透明涂层的平滑度或粗糙度
anisotropyfloat[−1..1]当该值为正值时,各向异性在切线方向上在正切或双切方向上各向异性的数量
anisotropyDirectionfloat3[0..1]Linear RGB,在切空间中编码方向向量切线空间的局部曲面方向
ambientOcclusionfloat[0..1]定义一个表面点可以接触到多少环境光,它是一个介于 0 和 1 之间的每像素阴影因子
normalfloat3[0..1]Linear RGB,在切空间中编码方向向量使用凹凸贴图(法线贴图)来扰动表面的细节法线。
bentNormalfloat3[0..1]Linear RGB,在切空间中编码方向向量指向平均不包含方向的法线,可以用来改善间接照明的质量
clearCoatNormalfloat3[0..1]Linear RGB,在切空间中编码方向向量使用凹凸贴图(法线贴图)来扰动透明涂层的细节法线
emissivefloat4

rgb=[0..n],

a=[0..1]

Linear RGB,alpha 编码曝光权重额外的漫射反照率来模拟发射表面(如霓虹灯等)这个属性在带有 bloom 通道的 HDR 管道中非常有用
postLightingColorfloat4[0..1]Linear RGB额外的颜色,可以与照明计算的结果混合,见 postLightingBlending
iorfloat[1..n]可选,通常由反射率推断折射率,折射物的折射率或作为反射率的替代品
transmissionfloat[0..1]定义了有多少电介质的漫射光通过物体传播,它定义了物体的透明度
absorptionfloat3[0..n]折射率物体的吸收系数
microThicknessfloat[0..n]折射率物体的薄层厚度
thicknessfloat[0..n]折射物体的固体体积的厚度

6.2 subsurface model

        subsurface model 官方介绍见 → subsurfacemodel,官方文档只留着标题,无内容介绍。

6.3 cloth model

        cloth model 官方介绍见 → clothmodel,可以配置的参数如下。

PropertyTypeRangeNoteDefinition
sheenColorfloat3[0..1]Linear RGB高光色调创建双色高光织物(默认值:sqrt(baseColor))
subsurfaceColorfloat3[0..1]Linear RGB通过材料散射和吸收后的漫射色着色

6.4 unlit model

        unlit model 官方介绍见 → unlitmodel,可以配置的参数如下。

PropertyTypeRangeNoteDefinition
baseColorfloat4[0..1]Linear RGB表面漫反射色
emissivefloat4

rgb=[0..n],

a=[0..1]

Linear RGB,alpha 编码曝光权重额外的漫射颜色来模拟发射表面,该属性在带有 bloom pass 的 HDR 管道中非常有用
postLightingColorfloat4[0..1]Linear RGB额外的颜色与基色和发射色混合

6.5 specularGlossiness

        specularGlossiness 官方介绍见 → specularglossiness,可以配置的参数如下。

PropertyTypeRangeNoteDefinition
baseColorfloat4[0..1]Linear RGB表面漫反射色
specularColorfloat3[0..1]Linear RGB高光色调(默认为黑色)
glossinessfloat[0..1]Inverse of roughness光泽度(默认为 0)

7 混合和透明(Blending and transparency)

7.1 blending

        在 material 块中,通过 blending 属性配置混合模式,取值有:opaque、transparent、fade、add、multiply、screen、masked,默认取 opaque,官方介绍见 → blending。

  • opaque:不透明模式,混合被禁用,材质输出的 alpha 通道被忽略。
  • transparent:透明模式,启用混合,材质输出的是与渲染目标通过 alpha 混合的,使用 Porter-Duff 的 source over 规则,这种混合模式假定预先乘以 alph。
  • fade:半透明模式,启用混合,表现透明效果,但透明度也应用到镜面反射光照,在 transparent 模式下,材质的 alpha 值只应用到漫射光照,fade 混合模式对于淡化被照亮的物体很有用。
  • add:叠加模式,启用混合,材质的输出被叠加到渲染目标的内容中。
  • multiply:累乘模式,启用混合,材质的输出与渲染目标的内容相乘,使内容变暗。
  • screen:屏幕模式,启用混合,与 multiply 的效果相反,渲染目标的内容会变亮。
  • masked:遮罩模式,禁用混合,这种混合模式启用 alpha 遮罩,材质输出的 alpha 通道定义了片元是否被丢弃。此外,ALPHA_TO_COVERAGE 对于非半透明视图是启用的,有关更多信息,请参阅 maskThreshold 部分。
material {
    blending : opaque
}

7.2 postLightingBlending

        postLightingColor 属性定义了如何将 postLightingColor 材质属性与光照计算结果混合,官方介绍见 → postlightingblending。取值主要有:opaque、transparent、add、Screen,默认取值:transparent。

material {
    postLightingBlending : add
}

7.3 transparency

        transparency 控制透明物体的渲染方式,它仅在混合模式不是 opaque 且 refractionMode 为 none 时有效,这些方法都不能准确地渲染凹形物体,但在实践中它们往往足够好,官方介绍见 → transparency。取值主要有:default、twoPassesOneSide、twoPassesTwoSides,默认取值:default。

  • default:透明物体正常呈现,遵循剔除模式。
  • twoPassesOneSide:透明物体首先在深度缓冲区中渲染,然后再在颜色缓冲区中渲染,遵循剔除模式,这实际上只呈现了透明物体的一半。
  • twoPassesTwoSides:透明物体在颜色缓冲区中渲染两次,第一次渲染背面,然后渲染正面,该模式允许渲染两面,同时减少或消除排序问题,twoPassesTwoSides 可以与 doubleSided 结合使用,效果更好。
material {
    transparency : twoPassesOneSide
}

7.4 maskThreshold

        当混合模式设置为 masked 时,maskThreshold 用于控制片元不被丢弃的最小 alpha 值;当混合模式未被设置为 masked 时,maskThreshold 将被忽略,官方介绍见 → maskThreshold。取值为 0.0 ~ 1.0 之间的浮点数,默认取值:0.4​​​​​​。

material {
    blending : masked,
    maskThreshold : 0.5
}

7.5 refractionMode

        refractionMode 用于控制折射模式,官方介绍见 → refractionMode。取值主要有:none、cubemap、screenspace,默认取值:none。当 refractionMode 设置为非 none 时才激活折射。

        cubemap 模式只使用 IBL cubemap 作为折射源,这是非常有效的,没有场景对象被折射,只有在 cubemap 中编码的远处环境被折射,该模式对于对象查看器来说是足够的。screenspace 模式采用更先进的屏幕空间折射算法,该算法允许场景中不透明的物体被折射。

        在 cubemap 模式中,假定折射光线从物体的中心发出,厚度参数仅用于计算吸收,而对折射本身没有影响。在 screenspace 模式中,假定折射光线在离开折射介质时平行于观看方向。

material {
    refractionMode : cubemap,
}

7.6 refractionType

        refractionType 用于设置折射模型,官方介绍见 → refractionType。取值主要有:solid、thin,默认取值:solid。当 refractionMode 设置为非 none 时 refractionType 才会生效。

        solid 模型用于厚的物体,如水晶球、冰块或雕塑;thin 模型用于薄的物体,如窗户、装饰球或肥皂泡。

        solid 模型假定所有的折射物体都是与入射点相切且半径厚度的球体。thin 模型假定所有的折射物体都是平面的、薄的、均匀厚度的。

material {
    refractionMode : cubemap,
    refractionType : thin,
}

8 光栅化(Rasterization)

8.1 culling

        culling 用于控制需要剔除哪些三角形,官方介绍见 → culling。取值主要有:none、front、back、frontAndBack,默认取值:back。

  • none:不剔除,渲染双面。
  • front:剔除正面三角形,渲染背面。
  • back:剔除背面三角形,渲染正面。
  • frontAndBack:正面和背面全部剔除。
material {
    culling : none
}

8.2 colorWrite

        colorWrite 用于控制开启 / 禁用写入颜色缓冲区,官方介绍见 → colorWrite。取值有:true、false,默认取值:true。

material {
    colorWrite : false
}

8.3 depthWrite

        depthWrite 用于控制开启 / 禁用写入深度缓冲区,官方介绍见 → depthWrite。取值有:true、false,不透明物体默认取值:true,透明物体默认取值:false。

material {
    depthWrite : false
}

8.4 depthCulling

        depthCulling 用于控制开启 / 禁用深度测试 ,官方介绍见 → depthCulling。取值有:true、false,默认取值:true。

        当深度测试被禁用时,用此材质渲染的物体将始终出现在其他不透明物体的前面。

material {
    depthCulling : false
}

8.5 doubleSided

        doubleSided 用于控制开启 / 禁用双面渲染,官方介绍见 → doubleSided。取值有:true、false,默认取值:false。当设置为 true 时,culling 自动设置为 none。

        如果三角形是面向背面的,则三角形的法线将翻转为面向正面。当显式设置为 false 时,这允许在运行时切换双面性。

material {
    doubleSided : true
}

8.6 alphaToCoverage

        alphaToCoverage 用于控制开启 / 禁用 alpha 覆盖,官方介绍见 → alphaToCoverage。取值有:true、false,默认取值:false。

        当覆盖的 alpha 被启用时,片元的覆盖是从它的 alpha 派生出来的。此属性仅在启用 MSAA 时才可用。注意:将混合模式设置为 masked 会自动启用 alpha 覆盖,如果不希望这样做,可以通过将 alpha 的覆盖设置为 false 来取消此行为。

material {
    blending : masked,
    alphaToCoverage : false
}

9 光照属性(Lighting)

9.1 reflections

        reflections 用于控制材质的镜面反射源,官方介绍见 → reflections。取值有:default、screenspace,默认取值:default。

        当 reflections 设置为 default 时,反射仅来自基于图像的光照(image-based lights,IBL);当此 reflections 设置为 screenspace 时,反射除了来自 IBL 之外,还来自屏幕空间的颜色缓冲区。

material {
    reflections : screenspace
}

9.2 shadowMultiplier

        shadowMultiplier 用于控制开启 / 禁用阴影,该属性仅在 unlit 光照模型下才可用,官方介绍见 → shadowMultiplier。取值有:true、false,默认取值:false。

        当 shadowMultiplier 设置为 true 时,材质计算的最终颜色需要乘以阴影因子(或可见性),它允许创建透明的且接收阴影投射的物体(如:AR 中不可见的地面),它仅接收直射光(directional lights)的阴影。

material {
    shadingModel : unlit,
    shadowMultiplier : true,
    blending : transparent
}

9.3 transparentShadow

        transparentShadow 用于控制开启 / 禁用透明阴影,官方介绍见 → transparentShadow。取值有:true、false,默认取值:false。

        当 shadowMultiplier 设置为 true 时,Filament 使用抖动模式(dithering pattern)模拟透明阴影,它们在方差阴影地图(VSM)和模糊启用时效果最好。阴影的不透明度直接来源于材质的 baseColor 属性的 alpha 通道,透明阴影可以在不透明的物体上启用,使它们与不透明的折射 / 透射物体兼容。

material {
    transparentShadow : true,
    blending : transparent
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        material.baseColor = texture(materialParams_baseColor, getUV0());
    }
}

9.4 clearCoatIorChange

        clearCoatIorChange 用于控制开启 / 禁用清除折射率变化图层,官方介绍见 → clearCoatIorChange。取值有:true、false,默认取值:true。

        当 clearCoatIorChange 设置为 true 时,会添加一个清除图层,它考虑到折射率(IoR)的变化来修改底层的镜面颜色,这会使 baseColor 变暗。当此效果被禁用时,baseColor 保持不变。

material {
    clearCoatIorChange : false
}

9.5 multiBounceAmbientOcclusion

        multiBounceAmbientOcclusion 用于控制开启 / 禁用多反弹环境遮挡,官方介绍见 → multiBounceAmbientOcclusion。取值有:true、false,默认取值:false。

        当将环境遮挡(ambient occlusion)应用于基于图像的光照(image-based lighting,IBL)时,多反弹环境遮挡(multi-bounce ambient occlusion)考虑了相互反射。开启此功能可避免遮挡区域过度变暗。它还考虑了表面颜色来生成彩色环境遮挡。

material {
    multiBounceAmbientOcclusion : true
}

9.6 specularAmbientOcclusion

        specularAmbientOcclusion 用于控制开启 / 禁用多反弹环境遮挡,官方介绍见 → multiBounceAmbientOcclusion。取值有:none、simple、 bentNormals,默认取值:none。

        静态环境遮挡贴图和动态环境遮挡贴图(SSAO 等)适用于漫射间接光照。当将此属性设置为非 none 时,一个新的环境遮挡项将从表面粗糙度中衍生出来,并应用于镜面间接光照。这种效果有助于消除不需要的镜面反射。当这个值设置为 simple 时,Filament 使用一种便宜但近似的方法来计算高光环境遮挡项。如果将此值设置为 bentNormals, Filament 将使用更精确但更昂贵的方法。

material {
    specularAmbientOcclusion : simple
}

10 抗锯齿(Anti-aliasing)

10.1 specularAntiAliasing

        specularAntiAliasing 用于控制开启 / 禁用镜面抗锯齿,官方介绍见 → specularAntiAliasing。取值有:true、false,默认取值:false。

        当一个对象远离相机,开启抗锯齿可用减少镜面锯齿,并保留镜面高光的形状。这种抗锯齿方案对光滑材料(低粗糙度)特别有效,但增加了渲染成本。抗锯齿效果的强度可以使用另外两个属性来控制:specularAntiAliasingVariance 和 specularAntiAliasingThreshold。

material {
    specularAntiAliasing : true
}

10.2 specularAntiAliasingVariance

        specularAntiAliasingVariance 用于设置应用镜面抗锯齿时使用的过滤器内核的屏幕空间方差,官方介绍见 → specularAntiAliasingVariance。取值类型是 float 型,取值范围是 0 ~ 1,默认取值:0.15。

        较高的 specularAntiAliasingVariance 值将增加过滤器的效果,但可能增加不需要的区域的粗糙度。

material {
    specularAntiAliasingVariance : 0.2
}

10.3 specularAntiAliasingThreshold

        specularAntiAliasingThreshold 用于设置应用镜面抗锯齿时抑制估计误差的夹持阈值(clamping threshold),官方介绍见 → specularAntiAliasingThreshold。取值类型是 float 型,取值范围是 0 ~ 1,默认取值:0.2。

        当设置为 0 时,镜面抗锯齿被禁用。

material {
    specularAntiAliasingThreshold : 0.1
}

11 颜色处理(Handling colors)

11.1 Linear colors

        线性颜色空间的介绍见 → 【Unity3D】伽马校正,Filament 在线性颜色空间中使用 RGB 颜色,官方介绍见 → linearcolors。

        如果颜色数据来自纹理,请确保使用 sRGB 纹理,以从 sRGB 自动进行硬件转换为线性。如果颜色数据作为材质的参数传递,可以通过在每个颜色通道上运行以下算法将其从 sRGB 转换为线性。

float sRGB_to_linear(float color) {
	return color <= 0.04045 ? color / 12.92 : pow((color + 0.055) / 1.055, 2.4);
}

        可以使用以下两个更便宜但不太准确的方法。

// Cheaper
linearColor = pow(color, 2.2);
// Cheapest
linearColor = color * color;

11.2 Pre-multiplied alpha

        如果一种颜色的 RGB 分量都乘以 alpha 通道,那么它使用了预乘 alpha,官方介绍见 → pre-multipliedalpha。

// Compute pre-multiplied color
color.rgb *= color.a;

        如果颜色是从纹理中取样的,可以简单地确保纹理数据在上传时进行了预乘。在 Android 上,从 Bitmap 上传的任何纹理默认都会进行预乘。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1391884.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flume 之自定义Sink

1、简介 前文我们介绍了 Flume 如何自定义 Source&#xff0c; 并进行案例演示&#xff0c;本文将接着前文&#xff0c;自定义Sink&#xff0c;在这篇文章中&#xff0c;将使用自定义 Source 和 自定义的 Sink 实现数据传输&#xff0c;让大家快速掌握Flume这门技术。 2、自定…

设计一个抽奖系统

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

排序算法9----计数排序(C)

计数排序是一种非比较排序&#xff0c;不比较大小 。 1、思想 计数排序又称为鸽巢原理&#xff0c;是对哈希直接定址法的变形应用。 2、步骤 1、统计数据&#xff1a;统计每个数据出现了多少次。&#xff08;建立一个count数组&#xff0c;范围从[MIN,MAX],MAX代表arr中…

韩愈和白居易,相交不相融的两位大伽

韩愈和白居易&#xff0c;一个百代文宗一个引领诗风&#xff0c;却关系平淡原因何在&#xff1f; 一位就是韩愈&#xff08;768年&#xff0d;824年&#xff09;&#xff0c;一位是白居易&#xff08;772年&#xff0d;846年&#xff09;&#xff0c;都是唐代各有建树的文学领…

2024年华数杯国际赛赛题浅析

21号完赛&#xff0c;28号出成绩的华数杯国际赛&#xff0c;作为美赛最合适的练手赛正式开赛。为了让大家更好地比赛&#xff0c;首先为大家带来本次竞赛两道题目的浅要解析。主要分析两道题目适合的群体&#xff0c;未来大家求解过程中可能遇到的问题。方便大家快速完成选题。…

【Proteus仿真】【Arduino单片机】汽车车窗除霜系统设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用LCD1602显示模块、光线传感器、DS18B20温度传感器、PCF8691 ADC模块、继电器加热模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD…

微软Power Platform使用Power Automate Desktop flow桌面流爬取京东商品信息

微软Power Platform使用Power Automate Desktop flow桌面流爬取京东商品信息 目录 微软Power Platform使用Power Automate Desktop flow桌面流爬取京东商品信息1、创建一个桌面流应用Desktop flow2、启动新的浏览器&#xff0c;跳转到我们需要的URL中3、在文本框中填充文字并点…

Android Studio 如何设置中文

Android Studio 是一个为 Adndroid 平台开发程序的集成开发环境&#xff08;IDE&#xff09;。 如何安装中文插件 在 Jetbrains 家族的插件市场上&#xff0c;是能够搜到语言包插件的&#xff0c;正常情况下安装之后只需要重启即可享受中文界面&#xff0c;可AndroidStudio 中…

基于vue+Spring Boot家政服务人员预约系统iph9d

通过对家政服务管理内容的学习研究&#xff0c;进而设计并实现一个家政服务系统。系统能实现的主要功能应包括即时通讯、通讯回复、预约订单、接单信息、服务费用管、服务评价的一些操作。还有可以正确的为用户服务&#xff0c;准确显示当前信息[5]。 开发软件有很多种可以用&…

【链路层】点对点协议 PPP

目录 1、PPP协议的特点 2、PPP协议的组成和帧格式 3、PPP协议的工作状态 目前使用得最广泛的数据链路层协议是点对点协议PPP(Point-to-Point Protocol)。 1、PPP协议的特点 我们知道&#xff0c;互联网用户通常都要连接到某个 ISP 才能接入到互联网。PPP 协议就是用户计算机…

本地一键部署grafana+prometheus

本地k8s集群内一键部署grafanaprometheus 说明&#xff1a; 此一键部署grafanaPrometheus已包含&#xff1a; victoria-metrics 存储prometheus-servergrafanaprometheus-kube-state-metricsprometheus-node-exporterblackbox-exporter grafana内已导入基础的dashboard【7个…

2024年华数杯国际赛A题赛题

问题A&#xff1a;来自日本的放射性废水 背景 2011年3月&#xff0c;日本东海岸发生的地震引发了福岛第一核电站的事故。一场大规模海啸摧毁了该核电站的冷却系统&#xff0c;导致三个核反应堆熔毁&#xff0c;核燃料碎片熔化。为了冷却熔化的核燃料&#xff0c;海水不断地注入…

数据仓库面试题

1 思维导图&数仓常见面试题 2 题目 1. 数据仓库是什么&#xff1f; 数据仓库是一个面向主题的&#xff08;订单、支付、退单等&#xff09;、集成的&#xff08;整合多个信息源的大量数据&#xff09;、非易失的&#xff08;一般不会进行删除和修改操作&#xff09;且随时…

使用Java Stream API获取子部门的所有父级部门

使用Java Stream API获取子部门的所有父级部门 在数据库表中&#xff0c;经常会有包含层次结构的部门信息表。本博客将使用Java语言和Stream API演示如何获取给定子部门的所有父级部门&#xff0c;并在代码中加入详细注释。 1. 创建 Department 类 首先&#xff0c;我们需要定…

经典目标检测YOLO系列(二)YOLOV2的复现(1)总体网络架构及前向推理过程

经典目标检测YOLO系列(二)YOLOV2的复现(1)总体网络架构及前向推理过程 和之前实现的YOLOv1一样&#xff0c;根据《YOLO目标检测》(ISBN:9787115627094)一书&#xff0c;在不脱离YOLOv2的大部分核心理念的前提下&#xff0c;重构一款较新的YOLOv2检测器&#xff0c;来对YOLOV2有…

ADA-YOLO:YOLOv8+注意力+Adaptive Head,mAP提升3%

生物医学图像分析中的目标检测和定位至关重要&#xff0c;尤其是在血液学领域&#xff0c;检测和识别血细胞对于诊断和治疗决策至关重要。虽然基于注意力的方法在各个领域中目标检测方面取得了显著的进展&#xff0c;但由于医学影像数据集的独特挑战&#xff0c;其在医学目标检…

cookie和session的工作过程和作用:弥补http无状态的不足

cookie是客户端浏览器保存服务端数据的一种机制。当通过浏览器去访问服务端时&#xff0c;服务端可以把状态数据以key-value的形式写入到cookie中&#xff0c;存储到浏览器。浏览器下次去服务服务端时&#xff0c;就可以把这些状态数据携带给服务器端&#xff0c;服务器端可以根…

C++I/O流——(3)文件输入/输出(第一节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 含泪播种的人一定能含笑收获&#xff…

HBase学习二:RegionServer详解

1、内部结构 RegionServer是HBase系统中最核心的组件&#xff0c;主要负责用户数据写入、读取等基础操作。RegionServer组件实际上是一个综合体系&#xff0c;包含多个各司其职的核心模块&#xff1a;HLog、MemStore、HFile以及BlockCache。 2、HLog 3、MemStore 4、HFile…

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线)

目录 前言 一、膨胀&#xff08;Dilation&#xff09;与 腐蚀&#xff08;Erosion&#xff09; 二、形态学操作 1、开操作&#xff08;Opening&#xff09; 2、闭操作&#xff08;Closing&#xff09; 3、形态学梯度&#xff08;Morphological Gradient&#xff09; 4、…