1

CIKernelを使用して iOS で OpenGL シェーダーを使用することは可能ですか? そうでない場合、2つを変換する方法はありますか?

サンプル 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 アプリでも同じシェーダーを使用したいと考えています。

4

1 に答える 1

1

You can, but with a few tweaks.

  • vTextureCoord and samplerExternalOES would be passed into a kernel function as arguments.
  • The sTexture type would be __sample (assuming you're using a CIColorKernel which means the kernel can only access the pixel currently being computed)
  • For a color kernel, the function declaration would be kernel vec4 xyzzy(__sample pixel) - you can't name it main.
  • You don't need texture2D in a color kernel. In the example above pixel holds the color of the current pixel.
  • Rather than setting the value of gl_FragColor, your kernel function needs to return the color as a vec4.

If you want to use your code verbatim, you could (at a stretch) consider a Sprite Kit SKShader to generate a SKTexture which can be rendered as a CGImage.

simon

于 2016-06-25T11:05:17.457 に答える