2016-06-20 2 views
1

Est-il possible d'utiliser des shaders OpenGL dans iOS en utilisant CIKernel? Sinon, existe-t-il un moyen de convertir entre les deux?iOS utilisant des shaders OpenGL dans CIKernel

Exemple OpenGL Shader

#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; 

Je suis en train d'utiliser les mêmes filtres pour iOS et Android. Android utilise déjà les shaders OpenGL, donc je voudrais utiliser les mêmes shaders dans mon application iOS.

+0

Je pense qu'une bonne réponse vous dira comment plutôt que de répondre littéralement à la question, mais, le temps étant ce qu'elle est, tout ce que j'ai le temps de dire est: oui, c'est exactement ce que CIKernel est pour. Ainsi, vous pouvez utiliser GLSL pour effectuer une modification d'image sans avoir à se moquer de la reproduction de votre interface utilisateur dans OpenGL. Donc oui. Oui, vous pouvez. – Tommy

Répondre

1

Vous pouvez, mais avec quelques modifications.

  • vTextureCoord et samplerExternalOES serait passé en fonction du noyau comme arguments.
  • Le type sTexture serait __sample (en supposant que vous utilisez un CIColorKernel qui signifie que le noyau ne peut accéder au pixel actuellement calculé)
  • Pour un noyau de couleur, la déclaration de fonction serait kernel vec4 xyzzy(__sample pixel) - vous ne pouvez pas nommer il main.
  • Vous n'avez pas besoin de texture2D dans un noyau de couleur. Dans l'exemple ci-dessus, pixel contient la couleur du pixel courant.
  • Plutôt que de définir la valeur gl_FragColor, votre fonction noyau doit renvoyer la couleur vec4.

Si vous voulez utiliser votre code mot pour mot, vous pourriez (à un bout droit) envisager un Kit Sprite SKShader pour générer un SKTexture qui peut être rendu en CGImage.

simon