Spec-Zone .ru
спецификации, руководства, описания, API

Библиотека разработчика Mac

Разработчик

Ссылка платформы SceneKit ссылка на протокол SCNShadable

Опции
Развертывание Target:

На этой странице
Язык:

SCNShadable

SCNShadable протокол определяет интерфейс для SceneKit геометрические и материальные объекты, рендеринг которых можно изменить с программами программы построения теней OpenGL.

SceneKit обеспечивает два способа интегрировать пользовательский Язык Штриховки OpenGL (GLSL) программы в рендеринг Вашей сцены: объекты программы и модификаторы программы построения теней.

Используйте объекты программы заменить штриховку SceneKit

Для полного контроля над вершиной и программами построения теней фрагмента, используемыми для рендеринга объекта, присвойтесь SCNProgram экземпляр к свойству программы объекта. Пользовательская программа полностью заменяет все другие параметры рендеринга, включая существенные настройки. Ваша пользовательская программа берет вводы от SceneKit и ответственна за всех, преобразовывают, освещение и эффекты затенения, которые Вы хотите, чтобы он произвел. Для получения дополнительной информации на пользовательских программах, см. Ссылку класса SCNProgram.

При указании пользовательской программы можно обеспечить, обработчик блокирует тот SceneKit вызовы во время отображения для обновления значений пользовательских переменных в программах построения теней. Посмотрите методы в Обработке Параметров в Пользовательских Программах.

Используйте модификаторы программы построения теней для расширения штриховки SceneKit

Модификаторы программы построения теней являются альтернативой цельной замене программ построения теней SceneKit с Вашим собственным. Можно использовать модификаторы программы построения теней для, например:

  • Параметрически деформируйте поверхность геометрии

  • Моделируйте реалистические поверхности со сложными свойствами материала

  • Добавьте артистические эффекты освещения, такие как штриховка мультипликационного стиля

  • Создайте специальные эффекты пикселями последующей обработки после того, как штриховка SceneKit будет завершена

Модификатор программы построения теней является отрывком исходного кода GLSL, который SceneKit вводит в его собственные программы программы построения теней в определенной точке входа. Поскольку Ваши модификаторы программы построения теней являются дополнениями к программе программы построения теней SceneKit, использование модификаторов программы построения теней оставляет систему рендеринга SceneKit неповрежденной. Т.е. можно все еще использовать свойства материала, модели распространения света и эффекты камеры влиять на представленное изображение.

Вы присоединяете отрывок к a SCNGeometry или SCNMaterial объект с помощью shaderModifiers свойство, связывая его с точкой входа, соответствующей этапу программы программы построения теней SceneKit, которую это изменяет: геометрия, поверхность, освещение или фрагмент. Каждая точка входа определяет контекст для связанного отрывка с входными переменными, обеспечивающими параметры рендеринга SceneKit на том этапе и выходных переменных, в которые отрывок пишет свои результаты.

Для определений каждой точки входа и ее вводов и выводов, посмотрите Ключи Точки входа Модификатора Программы построения теней. SceneKit вставляет Ваши модификаторы программы построения теней в свою программу программы построения теней определенный порядок:

  1. SCNShaderModifierEntryPointGeometry

  2. SCNShaderModifierEntryPointSurface

  3. SCNShaderModifierEntryPointLightingModel

  4. SCNShaderModifierEntryPointFragment

Можно использовать структуры, определенные более ранними точками входа в более поздних точках входа. Например, отрывок связался с SCNShaderModifierEntryPointFragment точка входа может читать из _surface структура, определенная SCNShaderModifierEntryPointSurface точка входа.

Запись отрывка модификатора программы построения теней

Код GLSL Вы предусматриваете модификатор программы построения теней, должен быть организован в определенной структуре, как проиллюстрировано в ниже примера:

  • // 1. Custom uniform declarations (optional)
  • uniform float intensity = 0.0;
  • // 2. Custom global functions (optional)
  • vec2 sincos(float t) { return vec2(sin(t), cos(t)); }
  • // 3. Pragma directives (optional)
  • #pragma transparent
  • #pragma body
  • // 4. Code snippet
  • _geometry.position.xy = sincos(u_time);
  • _geometry.position.z = intensity;
  1. Пользовательские универсальные объявления. Можно обеспечить собственные вводы для модификатора программы построения теней с помощью универсальных переменных. Для установки значений для пользовательских универсальных форм посмотрите Обеспечение Пользовательских Вводов к Модификатору Программы построения теней.

  2. Пользовательские глобальные функции. Если Ваши преимущества модификатора программы построения теней от факторинга общий код в функции, поместите их определения сюда. При включении пользовательских функций в отрывок необходимо поместить #pragma body директива между Вашими функциональными определениями и основной частью отрывка.

  3. Директивы прагмы. Как отмечено выше, #pragma body директива разделяет пользовательские функциональные определения от основной части отрывка. Если отрывок не содержит функциональных определений, можно опустить эту директиву.

    По умолчанию SceneKit автоматически использует свойства материала, чтобы определить, должен ли объект быть представлен с частичной прозрачностью и использует эту информацию для оптимизации производительности рендеринга. Используйте #pragma transparent или #pragma opaque директива для переопределения установки SceneKit.

  4. Фрагмент кода. Поместите основную часть своего кода модификатора программы построения теней в конце фрагмента кода.

Обеспечение пользовательских вводов к модификатору программы построения теней

Можно также объявить пользовательские универсальные переменные в отрывке модификатора программы построения теней. Вы обеспечиваете значения для пользовательских универсальных переменных с помощью кодирования значения ключа. Для каждой универсальной переменной Вы объявляете в модификаторе программы построения теней, присоединенном к SCNMaterial или SCNGeometry объект, SceneKit наблюдает ключ с тем же именем на том объекте. При установке нового значения SceneKit автоматически связывает то значение с соответствующим универсальным расположением в программе программы построения теней. Если Вы анимируете изменение в значении неявно (с SCNTransaction класс) или явно (с SCNAnimatable протокол), SceneKit интерполирует промежуточные значения и связывает их с универсальной формой для каждого кадра анимации. Например, следующий код анимирует исчезновение материала от насыщенного цвета до шкалы полутонов:

Swift

  • // Set up the shader modifier with a custom uniform and default value.
  • material.shaderModifiers = [ SCNShaderModifierEntryPointFragment:
  • "uniform float mixLevel;\n" +
  • "vec3 gray = vec3(dot(vec3(0.3, 0.59, 0.11), _output.color.rgb));\n" +
  • "_output.color = mix(_output.color, vec4(gray, 1.0), mixLevel);"
  • ]
  • material.setValue(0.0, forKey: "mixLevel")
  • // Later, animate a change to the uniform.
  • SCNTransaction.begin()
  • SCNTransaction.setAnimationDuration(2.0)
  • material.setValue(1.0, forKey: "mixLevel")
  • SCNTransaction.commit()

Objective C

  • // Set up the shader modifier with a custom uniform.
  • myMaterial.shaderModifiers = @{ SCNShaderModifierEntryPointFragment :
  • @"uniform float mixLevel = 0.0;"
  • "vec3 gray = vec3(dot(vec3(0.3, 0.59, 0.11), _output.color.rgb));"
  • "_output.color = mix(_output.color, vec4(gray, 1.0), mixLevel);" };
  • // Later, animate a change to the uniform.
  • [SCNTransaction begin];
  • {
  • [myMaterial setValue:@1.0 forKeyPath:@"mixLevel"];
  • }
  • [SCNTransaction commit];

Поскольку SceneKit связывает значения с универсальными переменными с помощью наблюдения значения ключа, можно обеспечить значения несколькими способами. Если Вы устанавливаете значение с помощью setValue:forKey: или setValue:forKeyPath: метод или набор целевое значение для keypath анимации, значение должно содержаться в объекте Objective C. Для универсальных форм скалярных типов GLSL можно присвоиться NSNumber возразите как значение. Присвоение универсальной формы векторного или матричного типа требует NSValue объект, содержащий данные надлежащего типа. Можно также связать текстуры с использованием сэмплеров GLSL SCNMaterialProperty объекты.

Также можно создать SCNMaterial или SCNGeometry разделите на подклассы для своего пользовательского shadable объекта и объявите свойства, имена которых соответствуют те из универсальных переменных в Вашей программе построения теней. При присвоении значения свойству SceneKit автоматически связывает его с соответствующей универсальной формой в программе программы построения теней. В этом случае Ваши свойства могут использовать примитивный, или структура вводит надлежащий соответствующим универсальным переменным GLSL.

Таблица ниже приводит типы Objective C для каждого типа GLSL:

Универсальные типы GLSL

Тип Objective C

int

NSNumber, NSValue (NSInteger, int)

float

NSNumber, NSValue (CGFloat, float, double)

vec2

NSValue (CGPoint)

vec3

NSValue (SCNVector3)

vec4

NSValue (SCNVector4)

mat4

mat4x4

NSValue (CATransform3D)

sampler2D

samplerCube

SCNMaterialProperty

Используя вводы, предоставленные SceneKit

SceneKit объявляет следующие универсальные переменные, содержащие глобальные параметры рендеринга:

Идентификатор

Тип GLSL

Описание

u_time

float

Текущее системное время (в секундах) начиная с SceneKit начало представлять с программой построения теней.

u_boundingBox

mat32

Ограничительная рамка представляемой геометрии, в пространстве модели.

u_boundingBox[0].xyz минимальный угол ограничительной рамки и u_boundingBox[1].xyz максимальный угол.

u_modelTransform

u_viewTransform

u_projectionTransform

u_normalTransform

u_modelViewTransform

u_modelViewProjectionTransform

mat4

Матрицы преобразования, используемые для преобразования позиций вершины и normals между моделью, миром, представлением и координатными пространствами клипа.

Для подробных определений посмотрите, что Рендеринг Преобразовывает Ключи.

u_inverseModelTransform

u_inverseViewTransform

u_inverseProjectionTransform

u_inverseModelViewTransform

u_inverseModelViewProjectionTransform

mat4

Обратные матрицы, соответствующие каждому, преобразовывают.

u_diffuseTexture

u_ambientTexture

u_specularTexture

u_normalTexture

u_reflectiveTexture

u_emissionTexture

u_transparentTexture

u_multiplyTexture

sampler2D или samplerCube

Содержание текстуры соответствующей материальной собственности. Объявленный, только если материальная собственность contents объект обеспечивает изображение текстуры.

Тип GLSL универсальной переменной зависит от того, является ли содержание 2D изображением или картой куба.

Для получения дополнительной информации на материалах, см. Ссылку класса SCNMaterial.

Модификаторы программы построения теней могут содержать любой юридический код GLSL, за исключением того, что SceneKit резервирует для его собственного использования все имена идентификатора с u_, a_, и v_ префиксы.

Наследование


Не применимый

Соответствует


Оператор импорта


Swift

import SceneKit

Objective C

@import SceneKit;

Доступность


Доступный в OS X v10.9 и позже.
  • Программа, используемая при рендеринге объекта.

    Объявление

    Swift

    optional var program: SCNProgram! { get set }

    Objective C

    @property(nonatomic, retain) SCNProgram *program

    Обсуждение

    Присвоение программы к объекту переопределяет все другие параметры рендеринга, включая существенные настройки и модификаторы программы построения теней.

    Оператор импорта

    Objective C

    @import SceneKit;

    Swift

    import SceneKit

    Доступность

    Доступный в OS X v10.9 и позже.

  • Указывает блок, который вызовут прежде, чем представить с программами с указанной универсальной переменной GLSL или названием атрибута.

    Объявление

    Swift

    optional func handleBindingOfSymbol(_ symbol: String, usingBlock block: SCNBindingBlock)

    Objective C

    - (void)handleBindingOfSymbol:(NSString *)symbol usingBlock:(SCNBindingBlock)block

    Параметры

    symbol

    Универсальная переменная GLSL или название атрибута.

    block

    Блок, который вызовет SceneKit.

    Обсуждение

    Используйте этот метод для соединения блока с объектом SceneKit (геометрия или материал) для обработки установки атрибута или универсальной переменной в пользовательском SCNProgram программа построения теней связалась с тем объектом. SceneKit вызывает Ваш блок прежде, чем представить объект. В блоке можно выполнить любые команды OpenGL или другой код, необходимый для подготовки пользовательской программы построения теней. Например, следующий блок обновляет time универсальная переменная в пользовательской программе построения теней фрагмента для того, чтобы произвести анимируемые эффекты:

    Swift

    • let startTime = CFAbsoluteTimeGetCurrent()
    • node.geometry.firstMaterial.handleBindingOfSymbol("time") {
    • programID, location, renderedNode, renderer in
    • glUniform1f(GLint(location), GLfloat(CFAbsoluteTimeGetCurrent() - startTime))
    • }

    Objective C

    • CFTimeInterval startTime = CFAbsoluteTimeGetCurrent();
    • [myNode.geometry.firstMaterial handleBindingOfSymbol:@"time" usingBlock:
    • ^(unsigned int programID, unsigned int location, SCNNode *renderedNode, SCNRenderer *renderer) {
    • glUniform1f(location, CFAbsoluteTimeGetCurrent() - startTime);
    • }];

    Оператор импорта

    Objective C

    @import SceneKit;

    Swift

    import SceneKit

    Доступность

    Доступный в OS X v10.9 и позже.

  • Указывает блок, который вызовут после рендеринга с программами с указанной универсальной переменной GLSL или названием атрибута.

    Объявление

    Swift

    optional func handleUnbindingOfSymbol(_ symbol: String, usingBlock block: SCNBindingBlock)

    Objective C

    - (void)handleUnbindingOfSymbol:(NSString *)symbol usingBlock:(SCNBindingBlock)block

    Параметры

    symbol

    Универсальная переменная GLSL или название атрибута.

    block

    Блок, который вызовет SceneKit.

    Обсуждение

    Используйте этот метод для соединения блока с объектом SceneKit (геометрия или материал) для обработки очистки, связанной с атрибутом или универсальной переменной в пользовательском SCNProgram программа построения теней связалась с тем объектом. SceneKit вызовет Ваш блок после рендеринга объекта. В блоке можно выполнить любые команды OpenGL или другой код, необходимый для пострендеринга задач.

    Оператор импорта

    Objective C

    @import SceneKit;

    Swift

    import SceneKit

    Доступность

    Доступный в OS X v10.9 и позже.

Типы данных

  • Подпись для блока потребовала привязку или развязывание символа GLSL в пользовательской программе.

    Объявление

    Swift

    typealias SCNBindingBlock = (UInt32, UInt32, SCNNode!, SCNRenderer!) -> Void

    Objective C

    typedef void (^SCNBindingBlock)(unsigned int programID, unsigned int location, SCNNode *renderedNode, SCNRenderer *renderer)

    Обсуждение

    Блок берет следующие параметры:

    programID

    Идентификатор программы OpenGL для тока SCNProgram экземпляр, как используется OpenGL функционирует такой как glValidateProgram.

    location

    Расположение OpenGL индексирует для символа, который будет связан или развязан, как используется функциями OpenGL такой как glUniform.

    renderedNode

    SCNNode представляемый объект.

    renderer

    SCNRenderer объект, ответственный за рендеринг.

    Вызвать handleBindingOfSymbol:usingBlock: или handleUnbindingOfSymbol:usingBlock: связать блок обработчика с символом GLSL для геометрии SceneKit или материала.

    Оператор импорта

    Objective C

    @import SceneKit;

    Swift

    import SceneKit

    Доступность

    Доступный в OS X v10.9 и позже.

  • Ключи для shaderModifiers словарь, каждый соответствующий точке входа в программах программы построения теней SceneKit, где можно присоединить пользовательский отрывок GLSL.

    Объявление

    Swift

    let SCNShaderModifierEntryPointGeometry: NSString! let SCNShaderModifierEntryPointSurface: NSString! let SCNShaderModifierEntryPointLightingModel: NSString! let SCNShaderModifierEntryPointFragment: NSString!

    Objective C

    NSString * const SCNShaderModifierEntryPointGeometry; NSString * const SCNShaderModifierEntryPointSurface; NSString * const SCNShaderModifierEntryPointLightingModel; NSString * const SCNShaderModifierEntryPointFragment;

    Константы

    • SCNShaderModifierEntryPointGeometry

      SCNShaderModifierEntryPointGeometry

      Используйте эту точку входа, чтобы деформировать поверхность геометрии или изменить ее атрибуты вершины.

      Модификаторы программы построения теней для этой точки входа выполняются в стадии обработки вершины.

      Точка входа геометрии объявляет следующую структуру GLSL:

      • struct SCNShaderGeometry {
      • vec3 position;
      • vec3 normal;
      • vec4 tangent;
      • vec2 texcoords[kSCNTexcoordCount];
      • } _geometry;

      Ваш модификатор программы построения теней читает из этой структуры и записей новые значения к той же структуре для изменения геометрических свойств каждой вершины в геометрии.

      position, normal, и tangent поля выражены в пространстве модели. Можно использовать универсальные формы SceneKit (такой как u_modelViewTransform) для работы в различном координатном пространстве но необходимо преобразовать назад в пространство модели прежде, чем записать результаты.

      kSCNTexcoordCount переменная является постоянным целым числом, соответствующим числу геометрии источников координаты текстуры. Каждый набор координат в texcoords поле содержит необработанные значения от геометрии — SceneKit применяется contentsTransform трансформация (если таковые имеются) после модификатора программы построения теней геометрии завершается.

      Ниже модификатора программы построения теней производит анимированную синусоидальную деформацию:

      • uniform float Amplitude = 0.1;
      • _geometry.position +=
      • _geometry.normal *
      • (Amplitude*_geometry.position.y*_geometry.position.x) *
      • sin(1.0 * u_time);

      Доступный в OS X v10.9 и позже.

    • SCNShaderModifierEntryPointSurface

      SCNShaderModifierEntryPointSurface

      Используйте эту точку входа для изменения поверхностных свойств материала, прежде чем будет вычислено освещение.

      Модификаторы программы построения теней для этой точки входа выполняются в стадии обработки фрагмента.

      Поверхностная точка входа определяет следующую структуру GLSL:

      • struct SCNShaderSurface {
      • vec3 view; // Direction from the point on the surface toward the camera (V)
      • vec3 position; // Position of the fragment
      • vec3 normal; // Normal of the fragment (N)
      • vec3 tangent; // Tangent of the fragment
      • vec3 bitangent; // Bitangent of the fragment
      • vec4 ambient; // Ambient property of the fragment
      • vec2 ambientTexcoord; // Ambient texture coordinates
      • vec4 diffuse; // Diffuse property of the fragment. Alpha contains the opacity.
      • vec2 diffuseTexcoord; // Diffuse texture coordinates
      • vec4 specular; // Specular property of the fragment
      • vec2 specularTexcoord; // Specular texture coordinates
      • vec4 emission; // Emission property of the fragment
      • vec2 emissionTexcoord; // Emission texture coordinates
      • vec4 multiply; // Multiply property of the fragment
      • vec2 multiplyTexcoord; // Multiply texture coordinates
      • vec4 transparent; // Transparent property of the fragment
      • vec2 transparentTexcoord; // Transparent texture coordinates
      • vec4 reflective; // Reflective property of the fragment
      • float shininess; // Shininess property of the fragment.
      • float fresnel; // Fresnel property of the fragment.
      • } _surface;

      Ваш модификатор программы построения теней читает из этой структуры и записей новые значения к той же структуре для изменения поверхностных свойств каждого представленного фрагмента. После того, как Ваш модификатор программы построения теней завершается, программа программы построения теней SceneKit использует эти свойства для вычислений освещения.

      Геометрические поля (такой как position и normal) выражены в поле зрения пространство. Можно использовать универсальные формы SceneKit (такой как u_inverseViewTransform) для работы в различном координатном пространстве но необходимо преобразовать назад для просмотра пространства прежде, чем записать результаты.

      Другие поля типа vec4 цвета, предоставленные содержанием соответствия SCNMaterialProperty объект. Поля координаты текстуры содержат значения, преобразованные соответствующей материальной собственностью contentsTransform трансформация.

      Ниже модификатора программы построения теней производит черные и белые дорожки на поверхности:

      • uniform float Scale = 12.0;
      • uniform float Width = 0.25;
      • uniform float Blend = 0.3;
      • vec2 position = fract(_surface.diffuseTexcoord * Scale);
      • float f1 = clamp(position.y / Blend, 0.0, 1.0);
      • float f2 = clamp((position.y - Width) / Blend, 0.0, 1.0);
      • f1 = f1 * (1.0 - f2);
      • f1 = f1 * f1 * 2.0 * (3. * 2. * f1);
      • _surface.diffuse = mix(vec4(1.0), vec4(0.0), f1);

      Доступный в OS X v10.9 и позже.

    • SCNShaderModifierEntryPointLightingModel

      SCNShaderModifierEntryPointLightingModel

      Используйте эту точку входа для обеспечения пользовательского уравнения освещения.

      Модификаторы программы построения теней для этой точки входа могут выполниться или в вершине или в стадии обработки фрагмента. Если litPerPixel свойство материала, затронутого модификатором программы построения теней, YEStrue, отрывок выполняется в стадии обработки фрагмента; иначе отрывок выполняется в стадии обработки вершины.

      Поверхностная точка входа определяет следующие структуры GLSL:

      • struct SCNShaderLightingContribution {
      • vec3 ambient;
      • vec3 diffuse;
      • vec3 specular;
      • } _lightingContribution;
      • struct SCNShaderLight {
      • vec4 intensity;
      • vec3 direction; // Direction from the point on the surface toward the light (L)
      • } _light;

      При рендеринге фрагмента SceneKit выполняет этот модификатор программы построения теней один раз для каждого активного света в сцене. Ваш модификатор программы построения теней читает из _light структура и накапливает результаты Ваших вычислений освещения в _lightingContribution структура. После того, как Ваш модификатор программы построения теней завершается, программа программы построения теней SceneKit комбинирует вклад освещения с поверхностными свойствами для определения цвета фрагмента.

      Все поля в _lightingContribution структура и intensity поле в _light структура является цветами. direction поле выражено в поле зрения пространство.

      Модификатор программы построения теней ниже оберток рассеянное освещение — т.е. это увеличивает все входные стоимости освещения 0.5, и если получающееся значение больше, чем 1.0 это «повторяется» назад к 0.0:

      • uniform float WrapFactor = 0.5;
      • float dotProduct = (WrapFactor + max(0.0, dot(_surface.normal,_light.direction))) / (1 + WrapFactor);
      • _lightingContribution.diffuse += (dotProduct * _light.intensity.rgb);
      • vec3 halfVector = normalize(_light.direction + _surface.view);
      • dotProduct = max(0.0, pow(max(0.0, dot(_surface.normal, halfVector)), _surface.shininess));
      • _lightingContribution.specular += (dotProduct * _light.intensity.rgb);

      Доступный в OS X v10.9 и позже.

    • SCNShaderModifierEntryPointFragment

      SCNShaderModifierEntryPointFragment

      Используйте эту точку входа для изменения цвета фрагмента после того, как будет выполнена вся другая штриховка.

      Модификаторы программы построения теней для этой точки входа выполняются в стадии обработки фрагмента.

      Точка входа фрагмента определяет следующую структуру GLSL:

      • struct SCNShaderOutput {
      • vec4 color;
      • } _output;

      Ваш модификатор программы построения теней читает из этой структуры и записей новый цвет к той же структуре для создания цвета окончательного результата для каждого представленного фрагмента.

      Этот модификатор программы построения теней инвертирует цвет вывода:

      • _output.color.rgb = vec3(1.0) - _output.color.rgb;

      Доступный в OS X v10.9 и позже.

    Обсуждение

    Для получения дополнительной информации на модификаторах программы построения теней, посмотрите Модификаторы Программы построения теней Использования для Расширения Штриховки SceneKit в обзоре протокола.

    SceneKit вставляет Ваши модификаторы программы построения теней в свою программу программы построения теней в порядке, показанном здесь, таким образом, можно использовать структуры, определенные более ранними точками входа в более поздних точках входа. Например, отрывок связался с SCNShaderModifierEntryPointFragment точка входа может читать из _surface структура, определенная SCNShaderModifierEntryPointSurface точка входа.