Я никогда не сталкивался с таким необъяснимым поведением, как показано ниже для , а не с использованием определенной переменной. Код был получен от кропотливого кипячения большой программы до минимального минимума, необходимого для проявления проблемы.Каковы требования SKShader для доступа к униформе?
Следующий код в моей SKScene создает три спрайта и отображает один, но использует шейдер для отображения текстуры одного из других спрайтов, которые передаются как униформа.
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);
}
Вместо того чтобы показывать piece2, шейдер должен показать piece1. Однако на самом деле это показывает фон (из неиспользуемого «u1»). Это верно как для устройства, так и для симулятора.
[Гм, okaaaay ....]
Если я изменяю имен из неиспользованной формы, или изменить порядок обмундирования, или удалить одну из неиспользуемых мундиров, Шейдер работ как и ожидалось.
[Действительно?]
Кроме того, после того, как играть с разными названиями, я нашел имена, которые когда-то не удалось, но позже удалось.
[Вздох]
В SKShader docs есть это озадачивает комментарий о добавлении формы к шейдера:
Равномерное должны быть доступны в пиксельный шейдер.
Это звучит очень странно для меня. Почему это так и что это значит? В моем реальном шейдере у меня есть униформы, к которым нельзя получить доступ из-за условий и поведения пользователя.
Это нормально? Или мне нужно искусственно получить доступ к каждой униформе только в том случае, если некоторые из них не будут доступны?
Я понимаю, что документ SKShader является «предварительным документом», но поведение настолько неожиданное, что я не могу не задаться вопросом, должно ли быть больше объяснений. Является ли это проблемой SpriteKit, или это справедливо для OpenGL ES вообще?
Я думаю, что лучше всего получить ответ на этот вопрос - открыть билет технической поддержки через свою учетную запись Apple Developer , – sangony
Хорошее предложение. Я опишу их ответ здесь. – rimsky