gpt4 book ai didi

swift - 如何使用 SCNShaderModifierEntryPointGeometry?

转载 作者:搜寻专家 更新时间:2023-11-01 05:31:50 25 4
gpt4 key购买 nike

我正在尝试学习如何为 SCNShaderModifierEntryPointGeometry 设置动画以跨 SCNPlane 移动纹理。

为了尝试理解它,我在上一个问题上找到了一些示例代码:

Using shader modifiers to animate texture in SceneKit leads to jittery textures over time

这是插入到代码中的示例:

    super.init()
self.geometry = SCNPlane(width: 1, height: 1)

self.geometry?.firstMaterial?.diffuse.contents = UIImage(named:"art.scnassets/cloud.png")

let mTrans = SCNMatrix4MakeTranslation(0, 0, 0)
let mScale = SCNMatrix4MakeScale(1, 1, 1)
self.geometry?.firstMaterial?.diffuse.contentsTransform = SCNMatrix4Mult(mTrans, mScale)

self.geometry?.firstMaterial?.diffuse.wrapS = SCNWrapMode.repeat
self.geometry?.firstMaterial?.diffuse.wrapT = SCNWrapMode.repeat

self.geometry?.firstMaterial?.shaderModifiers = @{ SCNShaderModifierEntryPointGeometry : @"_geometry.texcoords[0] = vec2((_geometry.texcoords[0].x+floor(u_time*30.0))/10.0, (_geometry.texcoords[0].y+floor(u_time*30.0/10.0))/7.0);" };

预期的结果是在平面上动画的云纹理

cloud

错误消息说:

将“SCNShaderModifierEntryPointGeometry”替换为“SCNShaderModifierEntryPoint.geometry”

但我检查了苹果文档,它存在:
https://developer.apple.com/documentation/scenekit/scnshadermodifierentrypointgeometry?language=objc

谢谢阅读。

最佳答案

好的,因为我已经评论过 I found this stack-overflow question

在那里,我找到了这个代码:

myMaterial.shaderModifiers = [ SCNShaderModifierEntryPointGeometry : "uniform float u_time; _geometry.texcoords[0] = vec2((_geometry.texcoords[0].x+floor(u_time*30.0))/24.0, (_geometry.texcoords[0].y+floor(u_time*30.0/24.0))/1.0);" ]

然而,当我更新我的代码时,我遇到了两个问题。

问题 1: SCNShaderModifierEntryPointGeometry 不起作用。

问题 2:计算 (_geometry.texcoords[0].x+floor(u_time*a/b)/c) 使一切变得模糊和紧张。

答案:

答案1:因为我使用的是Xcode beta,我认为定义需要更新为SCNShaderModifierEntryPoint.geometry

答案2:我的理解: (_geometry.texcoords[0].x+floor(u_time*a/b)/c) _geometry.texcoords[0].x+floor = 纹理最初放置的轴点
u_time = 自渲染后耗时,用于不断插入点
a/b = 每秒帧数,我将其更改为“a”,因为我不需要与“b”分开,使用纹理生成的频率
/c = 生成纹理的距离(或位置)。用于生成从上一个点到下一个点的纹理。

为我的目的更新代码:
self.geometry?.shaderModifiers = [ SCNShaderModifierEntryPoint.geometry : "uniform float u_time; _geometry.texcoords[0] = vec2((_geometry.texcoords[0].x+floor(u_time*60.0))/0.99, (_geometry.texcoords[0].y+floor(u_time*1))/1);" ]

有点小技巧,Islowly 移动平面以强制纹理使用 u_time 重新渲染:
let action = SCNAction.rotate(by: 360 * CGFloat(Double.pi / 180), around: SCNVector3(x:0, y:0, z:1), duration: 10000000000000000)
let repeatAction = SCNAction.repeatForever(action)

我猜有更好的方法来做到这一点:\

cloud moving over plane

关于swift - 如何使用 SCNShaderModifierEntryPointGeometry?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57358935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com