Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何使用SCNShaderModifierEntryPointGeometry?_Swift_Xcode_Shader_Scenekit - Fatal编程技术网

Swift 如何使用SCNShaderModifierEntryPointGeometry?

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

我正在尝试学习如何设置SCNShaderModifierEntryPointGeometry的动画,以便在SCNPlane上移动纹理

为了尝试理解它,我在前面的问题中找到了一些示例代码:

下面是插入到代码中的示例:

    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”,则可以使用,但遗憾的是,现在我遇到了相同的抖动问题。遗憾的是,它仅在平面或相机移动时才设置动画**