Swift 如何使用SCNShaderModifierEntryPointGeometry?
我正在尝试学习如何设置SCNShaderModifierEntryPointGeometry的动画,以便在SCNPlane上移动纹理 为了尝试理解它,我在前面的问题中找到了一些示例代码: 下面是插入到代码中的示例:Swift 如何使用SCNShaderModifierEntryPointGeometry?,swift,xcode,shader,scenekit,Swift,Xcode,Shader,Scenekit,我正在尝试学习如何设置SCNShaderModifierEntryPointGeometry的动画,以便在SCNPlane上移动纹理 为了尝试理解它,我在前面的问题中找到了一些示例代码: 下面是插入到代码中的示例: super.init() self.geometry = SCNPlane(width: 1, height: 1) self.geometry?.firstMaterial?.diffuse.contents = UIImage(named:"art.s
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);" };
预期结果是在平面上设置云纹理动画
错误消息显示:
将“SCNShaderModifierEntryPointGeometry”替换为“SCNShaderModifierEntryPoint.geometry”
但我查看了苹果的文档,它是存在的:
谢谢你的阅读。好的,我已经说过了 在那里,我找到了以下代码:
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:我的理解:(\u geometry.texcoords[0].x+楼层(u\u时间*a/b)/c)
\u 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_时间重新渲染:
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)
不过,我想有更好的办法:\
发布问题后,这行代码似乎是:myMaterial.shaderModifiers=[SCNSHARDModifierPointGeometry:“统一浮点u_时间;_几何体.texcoords[0]=vec2((_几何体.texcoords[0].x+floor(u时间*30.0))/24.0,(_几何体.texcoords[0].y+floor(u时间*30.0/24.0))/1.0);]如果我将“SCNShaderModifierEntryPointGeometry”替换为“SCNShaderModifierEntryPoint.geometry”,则可以使用,但遗憾的是,现在我遇到了相同的抖动问题。遗憾的是,它仅在平面或相机移动时才设置动画**