swift - SCNShadable 没有动画
问题描述
更新:
我有一个基本的 SceneKit 渲染一个盒子。
我正在尝试使用我在网上找到的简单片段着色器在侧面获得一种波浪效果。
着色器设置遵循指南,但没有任何效果发生。
let box = SCNBox(width: 250, height: 250, length: 250, chamferRadius: 0)
let greenMaterial = SCNMaterial()
greenMaterial.diffuse.contents = UIImage(named: "water_seamless_day")
greenMaterial.locksAmbientWithDiffuse = true
let redMaterial = SCNMaterial()
redMaterial.diffuse.contents = UIImage(named: "water_seamless_day")
redMaterial.locksAmbientWithDiffuse = true
let blueMaterial = SCNMaterial()
blueMaterial.diffuse.contents = UIImage(named: "water_seamless_day")
blueMaterial.locksAmbientWithDiffuse = true
let yellowMaterial = SCNMaterial()
yellowMaterial.diffuse.contents = UIImage(named: "water_seamless_day")
yellowMaterial.locksAmbientWithDiffuse = true
let purpleMaterial = SCNMaterial()
purpleMaterial.diffuse.contents = UIImage(named: "water_seamless_day")
purpleMaterial.locksAmbientWithDiffuse = true
let whiteMaterial = SCNMaterial()
whiteMaterial.diffuse.contents = UIImage(named: "water_seamless_day")
whiteMaterial.locksAmbientWithDiffuse = true
box.materials = [greenMaterial,
redMaterial,
blueMaterial,
yellowMaterial,
purpleMaterial,
whiteMaterial]
box.firstMaterial?.normal.contents = UIImage(named: "waterNormal.png")
let shaders = [SCNShaderModifierEntryPoint.fragment : "// Elapsed time in seconds float waterSpeed = u_time * -0.1;// Texture coordinates that will be used to sample the normal map vec2 uvs = _surface.normalTexcoord; uvs.x *= 2;// Sample the normal map vec3 tn = texture2D(u_normalTexture, vec2(uvs.x, uvs.y + waterSpeed)).xyz; // The texture stores values in the [0, 1] range// Express the coordinates of the normal vector in the [-1, +1] range tn = tn * 2 - 1; // Sample the normal map again, using the `waterSpeed` offset this time // in order to produce the animation effect vec3 tn2 = texture2D(u_normalTexture, vec2(uvs.x + 0.35 , uvs.y + 0.35 + (waterSpeed * 1.3))).xyz; tn2 = tn2 * 2 - 1; // Combine the two normals (static and animated) to produce a richer (more complex and less uniform) effect vec3 rn = (tn + tn2) * 0.5;// Normals in the normal map are expressed in tangent space // Convert them to object space and override the surface normal to simulate wavelets mat3 ts = mat3(_surface.tangent, _surface.bitangent, _surface.geometryNormal); _surface.normal = normalize(ts * rn);" , SCNShaderModifierEntryPoint.surface : "float waterSpeed = u_time * -0.1;vec2 uvs = _surface.normalTexcoord;uvs.x *= 2;vec3 tn = texture2D(u_normalTexture, vec2(uvs.x, uvs.y + waterSpeed)).xyz;tn = tn * 2 - 1;vec3 tn2 = texture2D(u_normalTexture, vec2(uvs.x + 0.35 , uvs.y + 0.35 + (waterSpeed * 1.3))).xyz;tn2 = tn2 * 2 - 1;vec3 rn = (tn + tn2) * 0.5;mat3 ts = mat3(_surface.tangent, _surface.bitangent, _surface.geometryNormal);_surface.normal = normalize(ts * rn);"]
box.firstMaterial?.shaderModifiers = shaders
let boxNode = SCNNode(geometry: box)
self.scene?.rootNode.addChildNode(boxNode)
self.sceneKitView?.rendersContinuously = true
用新的着色器代码编辑。
解决方案
此着色器代码绝对不是 SceneKit 着色器修改器。您发布的链接中有一个片段显示了正确的结构。
推荐阅读
- sql - 如何从查询输出中删除具有开始和结束时间戳的部分/完全重叠事件?
- android - 最新的 React 本机项目未在 android 中构建
- excel - 尝试填充 IE 输入框,单击提交,然后从 IE 中检索值
- android - 工作经理定期任务不适用于三星(Android 9.0 版)
- apache - 如何有条件地更改 Set-Cookie 标头?
- python - 使用带有条件的前向填充和 groupby 重述值(每行将值减少 1)
- google-apps-script - 用于粘贴值的脚本,其中粘贴到位置按日期变化
- javers - 为什么 javers throw 有时无法检测到 WrappedCdo 的类型?
- pandas - 使用不规则 DatetimeIndex 和填充方法从常规 pandas 系列中采样
- c# - 如何将 2 个数组连接成 1 个数组