2015-04-10 6 views
4

Я никогда не сталкивался с таким необъяснимым поведением, как показано ниже для , а не с использованием определенной переменной. Код был получен от кропотливого кипячения большой программы до минимального минимума, необходимого для проявления проблемы.Каковы требования 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 вообще?

+0

Я думаю, что лучше всего получить ответ на этот вопрос - открыть билет технической поддержки через свою учетную запись Apple Developer , – sangony

+0

Хорошее предложение. Я опишу их ответ здесь. – rimsky

ответ

1

Я подал ошибку (# 20629165), как рекомендовано технической поддержкой.

Me: «Почему должна использоваться униформа в шейдере фрагмента? Что произойдет, если форма не используется?»

Apple: «Причина в том, что, если униформа объявлена, но не используется в источнике шейдера, Sprite Kit по-прежнему будет выполнять равномерную загрузку шейдерного изображения на GPU для текущего розыгрыша. объявляется, но не используется, результат все равно будет правильным. Я рекомендую вам указать ошибку: https://developer.apple.com/bug-reporting/ «

+0

Я должен добавить, что я портировал свой код SpriteKit выше на Cocos2d-x и не видел никаких проблем. Все работало, как ожидалось. Я сейчас переношу все свое приложение. Никаких комментариев от Apple пока нет в моем отчете об ошибке. – rimsky

Смежные вопросы