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,

Саймон

Другие вопросы по тегам