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 вставляет Ваши модификаторы программы построения теней в свою программу программы построения теней определенный порядок:
Можно использовать структуры, определенные более ранними точками входа в более поздних точках входа. Например, отрывок связался с 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;
Пользовательские универсальные объявления. Можно обеспечить собственные вводы для модификатора программы построения теней с помощью универсальных переменных. Для установки значений для пользовательских универсальных форм посмотрите Обеспечение Пользовательских Вводов к Модификатору Программы построения теней.
Пользовательские глобальные функции. Если Ваши преимущества модификатора программы построения теней от факторинга общий код в функции, поместите их определения сюда. При включении пользовательских функций в отрывок необходимо поместить
#pragma body
директива между Вашими функциональными определениями и основной частью отрывка.Директивы прагмы. Как отмечено выше,
#pragma body
директива разделяет пользовательские функциональные определения от основной части отрывка. Если отрывок не содержит функциональных определений, можно опустить эту директиву.По умолчанию SceneKit автоматически использует свойства материала, чтобы определить, должен ли объект быть представлен с частичной прозрачностью и использует эту информацию для оптимизации производительности рендеринга. Используйте
#pragma transparent
или#pragma opaque
директива для переопределения установки SceneKit.Фрагмент кода. Поместите основную часть своего кода модификатора программы построения теней в конце фрагмента кода.
Обеспечение пользовательских вводов к модификатору программы построения теней
Можно также объявить пользовательские универсальные переменные в отрывке модификатора программы построения теней. Вы обеспечиваете значения для пользовательских универсальных переменных с помощью кодирования значения ключа. Для каждой универсальной переменной Вы объявляете в модификаторе программы построения теней, присоединенном к 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 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
Используя вводы, предоставленные SceneKit
SceneKit объявляет следующие универсальные переменные, содержащие глобальные параметры рендеринга:
Идентификатор |
Тип GLSL |
Описание |
---|---|---|
|
|
Текущее системное время (в секундах) начиная с SceneKit начало представлять с программой построения теней. |
|
|
Ограничительная рамка представляемой геометрии, в пространстве модели.
|
|
|
Матрицы преобразования, используемые для преобразования позиций вершины и normals между моделью, миром, представлением и координатными пространствами клипа. Для подробных определений посмотрите, что Рендеринг Преобразовывает Ключи. |
|
|
Обратные матрицы, соответствующие каждому, преобразовывают. |
|
|
Содержание текстуры соответствующей материальной собственности. Объявленный, только если материальная собственность Тип 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 и позже.
-
shaderModifiers shaderModifiers
СвойствоСловарь отрывков исходного кода GLSL для настройки программ программы построения теней, предоставленных SceneKit.
Объявление
Swift
optional var shaderModifiers: [NSObject : AnyObject]? { get set }
Objective C
@property(nonatomic, copy) NSDictionary *shaderModifiers
Обсуждение
Ключи словаря должны быть от набора констант, описанных в Ключах Точки входа Модификатора Программы построения теней. Каждый ключ представляет возможную точку входа в программах программы построения теней SceneKit, соответствующее значение которых
NSString
объект, содержащий отрывок исходного кода GLSL, который будет включен в программу программы построения теней в той точке входа.Посмотрите Модификаторы Программы построения теней Использования для Расширения Штриховки SceneKit в обзоре протокола для полного обсуждения модификаторов программы построения теней.
Оператор импорта
Objective C
@import SceneKit;
Swift
import SceneKit
Доступность
Доступный в OS X v10.9 и позже.
-
Указывает блок, который вызовут прежде, чем представить с программами с указанной универсальной переменной GLSL или названием атрибута.
Объявление
Swift
optional func handleBindingOfSymbol(_
symbol
: String, usingBlockblock
: 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, usingBlockblock
: 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
свойство материала, затронутого модификатором программы построения теней,YES
true
, отрывок выполняется в стадии обработки фрагмента; иначе отрывок выполняется в стадии обработки вершины.Поверхностная точка входа определяет следующие структуры 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
точка входа. -