iOS с использованием шейдеров OpenGL в CIKernel
Можно ли использовать шейдеры OpenGL в iOS с использованием CIKernel? Если нет, есть ли способ конвертировать между ними?
Пример OpenGL шейдера
#extension GL_OES_EGL_image_external : require
precision mediump float;
varying vec2 vTextureCoord;
uniform samplerExternalOES sTexture;
void main() {
vec4 textureColor = texture2D(sTexture, vTextureCoord);
vec4 outputColor;
outputColor.r = (textureColor.r * 0.393) + (textureColor.g * 0.769) + (textureColor.b * 0.189);
outputColor.g = (textureColor.r * 0.349) + (textureColor.g * 0.686) + (textureColor.b * 0.168);
outputColor.b = (textureColor.r * 0.272) + (textureColor.g * 0.534) + (textureColor.b * 0.131);
outputColor.a = 1.0;
gl_FragColor = outputColor;
Я пытаюсь использовать одинаковые фильтры для iOS и Android. Android уже использует шейдеры OpenGL, поэтому я хотел бы использовать те же шейдеры в своем приложении для iOS.
1 ответ
Решение
Можно, но с несколькими хитростями.
vTextureCoord
а такжеsamplerExternalOES
будет передан в функцию ядра в качестве аргументов.sTexture
Тип будет__sample
(при условии, что вы используетеCIColorKernel
что означает, что ядро может получить доступ только к пикселю, вычисляемому в данный момент)- Для цветного ядра объявление функции будет
kernel vec4 xyzzy(__sample pixel)
- ты не можешь назвать этоmain
, - Вам не нужно
texture2D
в цветном ядре. В приведенном выше примереpixel
содержит цвет текущего пикселя. - Вместо того, чтобы устанавливать значение
gl_FragColor
ваша функция ядра должна вернуть цвет какvec4
,
Если вы хотите использовать свой код дословно, вы можете (с натяжкой) рассмотреть набор Sprite SKShader
генерировать SKTexture
который может быть представлен как CGImage
,
Саймон