如何添加/乘以 USDZ 格式的纹理?

Posted

技术标签:

【中文标题】如何添加/乘以 USDZ 格式的纹理?【英文标题】:How to add/multiply textures in USDZ format? 【发布时间】:2021-12-21 08:26:50 【问题描述】:

我一直在想办法在 USDZ 中混合纹理,但我找不到任何东西。

假设我有一个具有三个纹理和三个 UV 通道的模型。我在通道 1 上有纹理 A,在通道 2 上有纹理 B,在通道 3 上有一个蒙版纹理。我想使用蒙版纹理将纹理 A 与纹理 B 混合,并将此合成用作颜色纹理。它是一个简单的数学,例如:

(A * mask) + (B * (1 - mask)) 

有没有办法通过编辑 USDA 材料定义来做到这一点?我确实将纹理连接到了各自的 UV 通道,在 ios 上查看时它们会显示指定的 UV,但找不到任何有关添加/倍增纹理的文档。

编辑:插图如下

需要一种在 USDA 代码中定义 Texture3 以获得所需结果的方法。或类似的解决方法:

def Material "MixedMaterial"

    token outputs:surface.connect = </Object1/MixedMaterial/SurfaceShader.outputs:surface>

    def Shader "SurfaceShader"
    
        uniform token info:id = "UsdPreviewSurface"
        color3f inputs:diffuseColor.connect = </Object1/MixedMaterial/Texture3.outputs:rgb>
        token outputs:surface
    

    def Shader "Texture0"
    
        uniform token info:id = "UsdUVTexture"
        asset inputs:file = @textureA.jpg@
        float2 inputs:st.connect = </Object1/MixedMaterial/Texture0/TexCoordReader0.outputs:result>
        token inputs:wrapS = "repeat"
        token inputs:wrapT = "repeat"
        float outputs:r
        float3 outputs:rgb

        def Shader "TexCoordReader0"
        
            uniform token info:id = "UsdPrimvarReader_float2"
            token inputs:varname = "UV_Channel_1"
            float2 outputs:result
        
    

    def Shader "Texture1"
    
        uniform token info:id = "UsdUVTexture"
        asset inputs:file = @textureB.jpg@
        float2 inputs:st.connect = </Object1/MixedMaterial/Texture1/TexCoordReader1.outputs:result>
        token inputs:wrapS = "repeat"
        token inputs:wrapT = "repeat"
        float outputs:r
        float3 outputs:rgb

        def Shader "TexCoordReader1"
        
            uniform token info:id = "UsdPrimvarReader_float2"
            token inputs:varname = "UV_Channel_2"
            float2 outputs:result
        
    

    def Shader "Texture2"
    
        uniform token info:id = "UsdUVTexture"
        asset inputs:file = @Mask.jpg@
        float2 inputs:st.connect = </Object1/MixedMaterial/Texture1/TexCoordReader2.outputs:result>
        token inputs:wrapS = "repeat"
        token inputs:wrapT = "repeat"
        float outputs:r
        float3 outputs:rgb

        def Shader "TexCoordReader2"
        
            uniform token info:id = "UsdPrimvarReader_float2"
            token inputs:varname = "UV_Channel_3"
            float2 outputs:result
        
       
    

【问题讨论】:

【参考方案1】:

美元的 Python 脚本

AFAIK,目前还没有针对 USD 的多通道合成操作。但是,我可能是错的。

CoreImage 合成

CoreImage 框架可以帮助您对纹理应用适当的compositing 操作。有四个过滤器类似于 The Foundry NUKE 的 Merge node 操作:Over、Out、Multiply 和 Plus。

CISourceOverCompositing CISourceOutCompositing CIMultiply 合成 CIAdditionCompositing

流程就这么简单:使用 CoreImage 合成工具将apply math 应用于纹理,将结果保存到磁盘,然后将全新的纹理应用到 RealityKit 中的 USDZ 模型。

【讨论】:

您好,安迪,感谢您的意见。我想我的问题可能不是很清楚。我需要混合纹理而不编辑纹理本身。我正在寻找一种方法来通过编辑 usda 文件中的材料定义来做到这一点。我已经编辑了原始帖子,添加了一个插图来澄清。 抱歉,不知道。只是额外的信息不适合 cmets (字符限制)。 我有一个带有 UV 坐标的 3D 模型。它有三个包含三组 UV 的 UV 通道。每个纹理都使用一组不同的 UV 坐标进行映射 - 即不同的 UV 通道。我将它导出到 USDZ,我需要重新创建材料。 安迪我真的不知道。我对美元没有深入的了解。只是在做一个项目,我需要导出相当多的纹理 3D 模型,以便在 AR 中的 iOS 设备上在线查看。碰巧的是,其中一些模型具有多纹理材料,其中纹理与蒙版混合 - 就像原始问题中的示例一样。它是 3ds max 或 photoshop 中的一个非常简单的合成,可以将其视为一个图层,在另一图层的顶部有一个蒙版。例如,我可以用 three.js 做到这一点。

以上是关于如何添加/乘以 USDZ 格式的纹理?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Xcode 转换器创建 USDZ 文件?

格式化数字 JS 百分比而不乘以 100

从搅拌机导出的 USDZ 模型损坏

从 USDZ 文件到 glTF 文件的转换

USDZ 模型在 SceneKit 中有孔,但在 QuickLook 中没有

移动平台纹理压缩格式选择