GPUImge

来源:互联网 发布:软件服务商 编辑:程序博客网 时间:2024/06/16 21:48

一、给glsl中的fragmentshader添加uniform变量

因为GUPImage已经做好了很多基础内容,所以有些地方直接调用函数即可。

向fragment中添加Uniform变量,首先需要往里面添加属性名称,即在initializeAttributes调用GLProgram类的addAttribute方法:

[filterProgram addAttribute:@"testUniform";

这个函数会调用glBindAttribLocation将这个属性绑定到一个索引值上。

接着在initWithVertexShaderFromString(因为initWithFragmenShaderString中会调用这个方法)中获取索引值

testUniformIndex = [filterProgram uniformIndex:@"testUniform"];

uniformIndex函数会调用glGetUniformLocation函数获取"testUniform"的索引值。


最后在renderToTextureWithVertices函数里面进行赋值,赋值时主要使用索引值

glUniform1i(testUniformIndex, 1);

glUniform函数有多种形式,可以根据自己的需求选择,接着就可以将"testUniform"添加到fragmentshader里面进行调用了。


二、OpenGL ES的坐标系以及glsl中的一些参数

1、纹素

纹素即texel,为texture2D方法第二个参数使用的基本单位。texelSizeX = 1.0 / fWidth,这儿的fWidth不是手机窗口的宽度,而是图片原始的宽度或者摄像头输出(这个不太确定)的宽度。所以纹理的坐标都是0-1.0,不管多宽或者多高。


2、gl_FragCoord

因为所有的纹理相关的处理都在fragment shader里面,而这里面有时候也需要对坐标进行处理,但gl_FragCoord虽说是相对于窗口的二维坐标,但这并非真是的物理坐标(即屏幕的像素大小,[[UIScreen mainScreenbounds]),而是可以设置的高宽,目前不太清楚具体如何设置。

0 0
原创粉丝点击