2014-08-27 3 views
1

В документации SCNView (здесь: https://developer.apple.com/library/prerelease/ios/documentation/SceneKit/Reference/SCNView_Class/index.html#//apple_ref/occ/instp/SCNView/eaglContext) говорится, что:Что такое подмножество OpenGL ES 3.0, поддерживаемого SceneKit?

SceneKit supports OpenGL ES 3.0, but some features are disabled when rendering in a OpenGL ES 3.0 context

я не мог найти где-нибудь, которые были отключены функции. Я хотел использовать свой собственный шейдер с SceneKit (назначая SCNProgram для моего материала), и я попытался использовать трехмерную текстуру. Но я получил следующее сообщение об ошибке:

SceneKit: error, C3DBaseTypeFromString: unknown type name 'sampler3D' 

Таким образом, я предполагаю, что 3D текстуры являются частью отключенных функций, но я не мог найти подтверждение в любом месте. Должен ли я отказаться от SceneKit и делать все мои рендеринги с OpenGL вручную, просто для использования 3D-текстур?

Вопрос о бонусе: Почему Apple поддерживает только подмножество OpenGL ES 3.0 в SceneKit, поскольку iOS имеет полную поддержку?

+0

Мне удалось заставить его работать, разделив контекст. Я имею в виду, что я создал контекст OpenGL и установил его как текущий с помощью EAGLContext.setCurrentContext (context) '. После этого я могу выполнить весь мой код настройки для отправки моих данных в виде 3D-текстуры на графическом процессоре. Установив контекст моего представления в тот же контекст 'scnView.eaglContext = context', SceneKit имеет доступ к моей текстуре, поместив следующий код в' handleBindingOfSymbol ("name_of_uniform_for_my_3D_texture") ':' glUniform1i (GLint (location), 0) '. Визуально это работает, но ошибка 'unknown type name 'sampler3D'' все еще здесь. – morph208

ответ

0

Некоторые функции из SceneKit не работают в контексте ES3. Вы все равно должны использовать все функции ES3 в своем коде OpenGL.

Это выглядит как ошибка в SceneKit, обнаруживающая унифицированное объявление для использования с его API-интерфейсами более высокого уровня ... поэтому вы не сможете, скажем, привязать SCNMaterialProperty к этой униформе с помощью setValue:forKey:. Тем не менее, вы все равно должны использовать шейдерную программу - вам придется привязать ее с помощью glBindTexture/glActiveTexture (внутри блока, который вы установили с помощью handleBindingOfSymbol:usingBlock:).

+0

Благодарим вас за ответ. Это то, что я пытался сделать. Я видел, что я не мог использовать 'SCNMaterialProperty' для установки униформы типа' sampler3D'. Поэтому я сделал настройку вручную (используя 'glActiveTexture' и' glBindTexture'). Но, я думаю, я не поставил этот код настройки в нужное место. Если я поместил его в блок 'handleBindingOfSymbol', как вы предположили, он работает, но мой код медленный. Код в блоке 'handleBindingOfSymbol' вызывается перед каждым кадром, правильно? Где я могу его называть только один раз? – morph208