在 SKShader 中使用父坐标
Posted
技术标签:
【中文标题】在 SKShader 中使用父坐标【英文标题】:Use parent coordinates in SKShader 【发布时间】:2016-04-19 20:11:33 【问题描述】:我正在使用 SKShader for ios。
void main()
vec4 val = texture2D(u_texture, v_tex_coord);
float len = 0.5 + 0.5 * sin(10.0 * u_time + 0.05 * (gl_FragCoord.x + gl_FragCoord.y));
vec4 c = vec4(vec3(len), 1);
gl_FragColor = c * val;
我想将此着色器分配给连接的精灵,并且我希望精灵之间的效果是平滑的。因此我不认为我可以在着色器中使用 v_tex_coord 。我改用 gl_FragCoord。
问题在于精灵是可以移动的 SKNode 的子节点。由于 gl_FragCoord 位于屏幕坐标中,因此移动会影响动画。
问:有什么方法可以避免精灵着色器受到父节点移动的影响,而无需将包含精灵的位置和 zRotation 的统一数据传递给着色器?
【问题讨论】:
【参考方案1】:是的,而不是更改统一(这将重新编译着色器),将大小作为 SKAttribute 传递并更新您的 SKSceneDelegate
update
方法中的属性。
例如:
let attributeBasedShader = SKShader(fileNamed: "UsingAttributes.fsh")
attributeBasedShader.attributes = [
SKAttribute(name: "a_sprite_position", type: .vectorFloat2)]
let sprite = SKSpriteNode()
sprite.shader = attributeBasedShader
let spritePosition = vector_float2(Float(sprite.position.x),
Float(sprite.position.y))
sprite.setValue(SKAttributeValue(vectorFloat2: spritePosition),
forAttribute: "a_sprite_position")
【讨论】:
以上是关于在 SKShader 中使用父坐标的主要内容,如果未能解决你的问题,请参考以下文章
Unity Shader入门精要学习笔记 - 第7章 基础纹理