這篇文章主要是閱讀gpuimage框架中的 glprogram、gpuimagecontext 兩個重要類的原始碼。這兩個類是 gpuimage 框架的基礎,裡面涉及的知識也有 opengl es 基礎 和 多執行緒 基礎。以下是原始碼內容:
glprogram
一 glprogram
glprogram專門處理opengl es程式的建立等相關工作。
- (id)initwithvertexshaderstring:(nsstring *)vshaderstring
fragmentshaderstring:(nsstring *)fshaderstring;
- (id)initwithvertexshaderstring:(nsstring *)vshaderstring
fragmentshaderfilename:(nsstring *)fshaderfilename;
- (id)initwithvertexshaderfilename:(nsstring *)vshaderfilename
fragmentshaderfilename:(nsstring *)fshaderfilename;
初始化的過程包含了頂點片源著色器的建立、編譯,著色器程式的建立,頂點片源著色器附著到著色器程式等過程。以檔案初始化方式最後都會呼叫 initwithvertexshaderstring:fragmentshaderstring: 字串的初始化方式,
- (id)initwithvertexshaderstring:(nsstring *)vshaderstring
fragmentshaderstring:(nsstring *)fshaderstring;
// 編譯片源著色器
// create and compile fragment shader
if (![self compileshader:&fragshader
type:gl_fragment_shader
string:fshaderstring])
// 將頂點片源著色器附著到著色器程式
glattachshader(program, vertshader);
glattachshader(program, fragshader);
}return
self;
}
//著色器變數的儲存和讀取
- (void)addattribute:(nsstring *)attributename;
- (gluint)attributeindex:(nsstring *)attributename;
- (gluint)uniformindex:(nsstring *)uniformname;
具體實現:
- (void)addattribute:(nsstring *)attributename
}// end:addattribute
// start:indexmethods
- (gluint)attributeindex:(nsstring *)attributename
- (gluint)uniformindex:(nsstring *)uniformname
//連線 program
-(bool)link;
- (bool)link
if (fragshader)
// 設定初始化成功標識
self
.initialized = yes;
// cfabsolutetime linktime = (cfabsolutetimegetcurrent() - starttime);
// nslog(@"linked in %f ms", linktime * 1000.0);
return
yes;
}
//使用 program
- (void)use;
- (void)use
//取到log string
-(nsstring *)vertexshaderlog;
-(nsstring *)fragmentshaderlog;
-(nsstring *)programlog;
// start:privatelog 列印 log
- (nsstring *)logforopenglobject:(gluint)object
infocallback:(glinfofunction)infofunc
logfunc:(gllogfunction)logfunc
- (void)dealloc
GPUImage原始碼解讀 十五
gpuimagerawdataoutput gpuimagerawdataoutput實現了gpuimageinput協議,它可以將輸入的幀快取轉換為原始資料。id initwithimagesize cgsize newimagesize resultsinbgraformat bool resu...
GPUImage原始碼解讀 五
從cache中獲取乙個gpuimageframebuffer物件,如果獲取失敗,那麼建立乙個新的gpuimageframebuffer物件。param framebuffersize 物件的大小 param textureoptions 紋理的配置資訊 param onlytexture 指示是否只...
go原始碼解讀(二)
solve the 2,3,5 problem print all numbers with 2,3,or 5 as factor using channels.使用通道解決2,3,5問題 以2 3或5為因子列印所有數字 test the solution,silently.測試解決方案。packa...