gpt4 book ai didi

ios - 访问制服的 SKShader 要求是什么?

转载 作者:可可西里 更新时间:2023-11-01 06:06:11 31 4
gpt4 key购买 nike

对于使用已定义的变量,我从未遇到过如下所示的莫名其妙的行为。该代码是通过将一个大型程序煞费苦心地简化为显示问题所需的最低限度而产生的。

我的 SKScene 中的以下代码创建了三个 sprite 并显示了一个,但使用着色器显示作为 uniform 传入的其他 sprite 之一的纹理。

    SKSpriteNode *background = [[SKSpriteNode alloc] initWithImageNamed:@"background"];
SKSpriteNode* piece1 = [[SKSpriteNode alloc] initWithImageNamed:@"piece1"];
SKSpriteNode *piece2 = [[SKSpriteNode alloc] initWithImageNamed:@"piece2"];

SKShader* shader = [SKShader shaderWithFileNamed:@"test.fsh"];
[shader addUniform:[SKUniform uniformWithName:@"u1" texture:background.texture]];
[shader addUniform:[SKUniform uniformWithName:@"piece1Texture" texture:piece1.texture]];
[shader addUniform:[SKUniform uniformWithName:@"u2" float:0.0]];
[shader addUniform:[SKUniform uniformWithName:@"u3" float:0.0]];

piece2.shader = shader;
[self addChild:piece2];

这是着色器:

void main(void) {
gl_FragColor = texture2D(piece1Texture, v_tex_coord);
}

着色器应该显示 piece1 而不是显示 piece2。然而,它实际上显示了背景(来自未使用的“u1”制服)。对于设备和模拟器都是如此。

[嗯,好的......]

如果我更改未使用制服的名称,或更改制服的顺序,或删除其中一个未使用的制服,着色器将按预期工作。

[真的吗?]

此外,在尝试了各种名称之后,我发现了曾经失败但后来成功的名称。

[叹息]

在 SKShader 中 docs ,关于向着色器添加制服有这样令人困惑的评论:

The uniform must be accessed in the fragment shader.

这对我来说听起来很奇怪。为什么这是真的,这是什么意思?在我的真实着色器中,由于 if 条件和用户行为,我有可能无法访问的制服。

可以吗?或者,我是否需要人为地访问每件制服,以防某些制服无法访问?

我知道 SKShader 文档是“初步文档”,但行为如此出乎意料,我不禁想知道是否需要更多解释。这是一个 SpriteKit 问题,还是这对 OpenGL ES 普遍适用?

最佳答案

我按照技术支持的建议提交了一个错误 (#20629165)。

我:“为什么必须在片段着色器中使用制服?如果一个制服没用?”

Apple:“原因是为了效率,如果在着色器源中声明了制服但没有使用,Sprite Kit 仍会为当前绘制执行着色器制服值上传到 GPU。也就是说,如果制服是声明但未使用,结果应该仍然是正确的。我鼓励您提交错误:https://developer.apple.com/bug-reporting/ "

关于ios - 访问制服的 SKShader 要求是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29571096/

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