Iphone 在opengles中更改点的rgb值

Iphone 在opengles中更改点的rgb值,iphone,ios,opengl-es,Iphone,Ios,Opengl Es,我想在运行时制作灰度过滤器,我成功地用这段代码制作了它 NSString *const kGPUImageLuminanceFragmentShaderString = SHADER_STRING ( precision highp float; varying vec2 textureCoordinate; uniform sampler2D inputImageTexture; const highp vec3 W = vec3(0.2125, 0.7154,

我想在运行时制作灰度过滤器,我成功地用这段代码制作了它

NSString *const kGPUImageLuminanceFragmentShaderString = SHADER_STRING
(
  precision highp float;

   varying vec2 textureCoordinate;

    uniform sampler2D inputImageTexture;

    const highp vec3 W = vec3(0.2125, 0.7154, 0.0721);
   void main()
  {     
   float luminance = dot(texture2D(inputImageTexture, textureCoordinate).rgb, W);
    gl_FragColor = vec4(vec3(luminance), 1.0);
  }
 );
我现在想要的是访问每个点的rgb值并应用我的算法,然后根据我的算法更改点rgb值

换句话说,我的问题


我想访问点的rgb值并设置同一点的rgb值

如果“点”是指像素,那么我认为您要查找的是帧缓冲区对象(FBO)。它将允许您将场景渲染为图像,然后您可以将该图像反馈到着色器中以执行您想要执行的操作,然后您可以将其渲染为最终输出

vec3 pixel =  texture2D(inputImageTexture, textureCoordinate).rgb;
 float red = pixel.r;
 float green = pixel.g;
 float blue = pixel.b;


    .
    . manipulate the values as needed
    .

    gl_FragColor = vec4(red, green, blue, 1.0); 
或此选项以保持原始像素的alpha值:

vec4 pixel =  texture2D(inputImageTexture, textureCoordinate).rgba;
.
.
.

    gl_FragColor = vec4(red, green, blue, pixel.a); 

我真的不会对单个组件进行三次单独的纹理读取,而是对单个颜色进行一次vec3或vec4读取。此代码是否分别访问一个点的每个rgb值?是的。浮点变量红、绿、蓝将包含单独的颜色。我只是按照你说的做,但它会崩溃NSString*const kGPUImageLuminanceFragmentShaderString=SHADER_字符串(精度高p浮点;变化的vec2纹理坐标;统一采样器2D inputImageTexture;高p vec3 W=vec3(0.2125,0.7154,0.0721);void main(){vec3 pixel=texture2D(inputImageTexture,texturecoordination).rgb;float red=pixel.r;float green=pixel.g;float blue=pixel.b如果(r>120){gl_FragColor=vec4(红,绿,蓝,1.0);}否则{float luminance=dot(pixel,W);gl u FragColor=vec4(vec3(亮度,1.0);});颜色都在0.0到1.0之间标准化。对于120,使用120/256:if(r>0.46875){}。请检查控制台/调试日志以帮助解决应用程序崩溃问题。鉴于您从我的GPUImage框架中提取了此片段着色器,我强烈建议查看其中各种过滤器中包含的其他片段着色器。它们显示了许多操纵颜色信息的方法,应该是开发应用程序时使用的好例子n fragment shader.如果你现在知道类的名称,它可以产生我想要的东西,我只是对一些R值小于120的rgb值做一个简单的if语句,只应用于灰度过滤器@BradLarsonNo,我没有任何东西可以精确地做到这一点,所以你需要编写你自己的自定义过滤器。就像我说的,取花一点时间,阅读大量的示例过滤器,学习如何自己完成这项工作。你会因此受益匪浅。