- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试在 iOS 上的 SceneKit 中实现网格的透明度。我对文档感到困惑,因为似乎有多种方法可以使网格透明:
SCNMaterial.(diffuse|emission|ambient|...).contents
SCNMaterial.transparency
(一个从 0.0 到 1.0 的 CGFloat)SCNMaterial.transparent
(另一个SCNMaterialProperty)SCNNode.opacity
(一个从 0.0(完全透明)到 1.0(完全不透明)的 CGFloat)问题:
SCNMaterial.transparent
如何与其他颜色 channel (例如 diffuse
)交互?最佳答案
一些属性是可动画的,其中一些将一个值统一应用于整个对象,而另一些则允许您使用 alpha channel 纹理来控制每个点的透明度。将值应用于具有子节点的节点允许一次为多个节点设置透明度值。
漫射 alpha channel
有时可以使用具有漫反射纹理的简单网格,而不是使用具有大量顶点的网格,另请参见下面的示例。
SCNMaterial.transparency
统一调整整个 Material 的不透明度。此属性是可动画的。
SCNMaterial.transparent
您可以单独设置每个点的不透明度,通常使用纹理,而不是为整个 Material 设置透明度值。
SCNNode.opacity
设置整个节点和所有子节点的不透明度。
还有更多的控制可能:
SCNMaterial.transparencyMode
通过 Material 的属性 transparencyMode,您可以使用不同的模式:.aOne 使用 alpha channel ,.rgbZero 根据颜色亮度确定透明度。
颜色数学
颜色数学由混合模式决定并在此处描述:
https://developer.apple.com/documentation/scenekit/scnblendmode
case alpha
Blend by multiplying source and destination color values by their corresponding alpha values.
case add
Blend by adding the source color to the destination color.
case subtract
Blend by subtracting the source color from the destination color.
case multiply
Blend by multiplying the source color with the background color.
case screen
Blend by multiplying the inverse of the source color with the inverse of the destination color.
case replace
Blend by replacing the destination color with the source color, ignoring alpha.
例子
树木/叶子
与其使用具有大量顶点的网格,否则会导致帧速率明显甚至 Not Acceptable 降低,通常可以使用透明的漫反射纹理。一个很好的例子是例如树木和树叶。
在这里,您可以在左侧看到一个透明纹理,中间是带有几个简单平面的网格,右侧是 SceneKit 渲染时的样子(网格和纹理取自 http://www.loopix-project.com)。
let mat = SCNMaterial()
mat.diffuse.contents = "palms1.png"
if let geometry = palm.geometry {
geometry.materials = [mat]
}
发光效果
对于不同的效果,可以使用混合模式,例如要获得一种发光效果,可以使用混合模式。添加:
mat.blendMode = .add
淡入/淡出
SCNNode.opacity指的是一个节点包括所有的子节点。此属性是可动画的,因此如果您想淡入或淡出一个节点(或一组节点),这是正确的方法。
您还可以使用它来为每个对象应用透明度。
预乘 alpha 与直接 alpha
在内部 SceneKit 使用预乘 alpha。因此,如果您正在编写着色器,您应该意识到这一点。
如果您只在 API 级别工作,则不会受到影响,例如如果你加载一个带有透明度的 .png 文件,你不需要自己做任何预乘 RGB。
例如互动SCNMaterial.transparent 与其他 channel
透明胶片必须能够针对不同的使用场景一起使用。例如,您想要淡出已经部分透明区域的对象。
人工演示示例
一个带有噪声纹理的球体,该球体已经有透明区域
显示 Material 为 alpha .75 的球体
添加第二个球体进行比较
设置:
let sphere1 = SCNSphere(radius: 0.5)
let material1 = SCNMaterial()
material1.diffuse.contents = "art.scnassets/colorTex.png"
material1.transparent.contents = UIColor(red: 1, green: 1, blue: 1, alpha: 0.75)
sphere1.materials = [material1]
let sphereNode1 = SCNNode(geometry: sphere1)
sphereNode1.position = SCNVector3(x: 0, y: -2, z: 0)
let sphere2 = SCNSphere(radius: 0.25)
let sphereNode2 = SCNNode(geometry: sphere2)
sphereNode2.position = SCNVector3(x: 0, y: -0.5, z: 0)
let spheres = SCNNode()
spheres.addChildNode(sphereNode1)
spheres.addChildNode(sphereNode2)
self.scnScene.rootNode.addChildNode(spheres)
现在通过 SCNNode.opacity 应用淡出:
let fadeOut = SCNAction.customAction(duration: 5) { (node, elapsedTime) -> () in
node.opacity = 1 - elapsedTime / 5
}
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
spheres.runAction(fadeOut)
}
结果是这样的:
关于ios - SceneKit:漫反射 Alpha 与透明/透明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44999255/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我不知道我问的是否可行。 我有一个带有 Color.BLACK 的 Paint 和 0.2f 的 alpha 和两个对象: 它们都使用相同的Paint。我还测试了 2 个不同的 Paint 对象,仅更
Alpha Vantage API 不提供纳斯达克指数的报价(不再?)。我感兴趣的所有其他 indizes 似乎都很有魅力。 例如,调用以下 URL(隐藏 API key )将提供 S&P 的报价(符
问:有没有办法使用默认管道正确混合 Alpha 分量? 问题:我正在将半透明表面绘制到纹理中,然后我想将该纹理传输到主框架后台缓冲区中。通常,当您使用直接的 Alpha 混合来实现透明度或抗锯齿时,会
如果我有一个底层颜色和一个 alpha 值 (C&A),并且想在屏幕上创建一个自定义 C&A,那么确定必须将什么 C&A 作为底层添加到底层之上的层的函数是什么? 编辑: 我想复制 photoshop
我想知道它们之间的区别: 给我的 UIView 分配一个颜色 <1 alpha vs 为它指定一个不透明的颜色,但给 UIView 一个 <1 的 alpha 值。 在屏幕截图上,我制作了两个 UIV
我在 OSX 10.9.4 上试图转换这个 python 正则表达式 p = "(2024 (?:(?:(?:[a-z|.]+ ?)+)) 93)"到 Unix 正则表达式以提高 grep 的速度。
我为 4 张图像制作了这个脚本,第一张图像是 alpha,但从第二张开始什么都没有显示 这是ffmpeg的代码确实有错误,但我没有。不明白:[swscaler @ 0x7fef79845e00] 使用
我正在尝试将文本绘制到具有特定 Alpha 级别的 Canvas 上,并剪辑文本并使用其自己的 Alpha 级别绘制背景颜色: ctx.globalCompositeOperation = '...'
我需要实现Lasso和Ridge回归,并通过交叉验证的方式计算超参数。我找到了执行此操作的代码,但我不太理解它。 lassocv = LassoCV(alphas=None, cv=15, max_i
我得到我的位图,将它用作着色器平铺模式。 除了要绘制的形状轮廓外,PNG 大部分是 alpha。 除了它画出轮廓,但被黑色包围,不是透明的(alpha)。 pnt.reset(); i
我正在开发一个带有 tableViewController 的应用程序。我想在我的表格 View 单元格下方添加背景图片。我想让表格 View 单元格透明,以便我的整个表格 View 可以具有自定义背
如图所示,我有 2 个具有 0.5 alpha 和 1 alpha 的按钮。我想将第一张图片中标题的 alpha 更改为 1,这可能吗? 到目前为止,我尝试了这些都不起作用: button.title
我正在尝试生成一个 python 正则表达式来表示词法分析器的标识符。我的做法是: ([a-zA-Z]([a-zA-Z]|\d)*) 当我使用它时: regex = re.compile("\s*([
我正在尝试删除所有非数字字符的字符串,并且我已阅读 Why isn't isnumeric working? ,或者我必须有一个 unicode 字符串。然而,自从 is.alnum()和is.alp
来自 hadoop 网站上的发布页面: “This release, like previous releases in hadoop-2.x series is still considered a
真的没有与 setAlpha(int) 对应的 XML 属性吗? 如果没有,有什么替代方案? 最佳答案 它比其他响应更容易。有一个 xml 值 alpha 采用 double 值。 android:a
我正在three.js 中构建一个“ Papercut ”世界。我所有的模型都是简单的“平面”,我使用带有 Alpha channel 的 PNG 对它们进行纹理处理,以将平面修剪成更令人愉悦的形状。
我想知道 Graphics2D.setComposite(..., alpha) 之间是否真的有区别和 Graphics2D.setColor(new Color(..., alpha))在 Java
我需要在两个图像之间进行转换 - 两个图像都是隐藏下面的 Sprite 的蒙版。每个面具的一部分是白色的,一部分是透明的。我需要两个图像的总 alpha 每次都为 1,这样蒙版看起来会平滑地改变其形状
我是一名优秀的程序员,十分优秀!