如何添加/乘以 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 格式的纹理?的主要内容,如果未能解决你的问题,请参考以下文章