1

是否可以使用CIKernel在 iOS 中使用 OpenGL 着色器?如果没有,有没有办法在两者之间转换?

示例 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

你可以,但有一些调整。

  • vTextureCoord并将samplerExternalOES作为参数传递给内核函数。
  • sTexture类型将是(__sample假设您使用的是 aCIColorKernel这意味着内核只能访问当前正在计算的像素)
  • 对于颜色内核,函数声明将是kernel vec4 xyzzy(__sample pixel)- 你不能命名它main
  • 您不需要texture2D颜色内核。在上面的示例中,pixel保存当前像素的颜色。
  • 您的gl_FragColor内核函数需要将颜色作为vec4.

如果您想逐字使用您的代码,您可以(暂时)考虑使用 Sprite KitSKShader来生成SKTexture可以呈现为CGImage.

西蒙

于 2016-06-25T11:05:17.457 回答