GPUImage原始碼解讀 十五

2021-08-21 18:16:13 字數 3113 閱讀 1610

gpuimagerawdataoutput

gpuimagerawdataoutput實現了gpuimageinput協議,它可以將輸入的幀快取轉換為原始資料。

- (id)initwithimagesize:(cgsize)newimagesize resultsinbgraformat:(bool)resultsinbgraformat;
- (id)initwithimagesize:(cgsize)newimagesize resultsinbgraformat:(bool)resultsinbgraformat;

self

.enabled = yes;

locknextframebuffer = no;

outputbgra = resultsinbgraformat;

imagesize = newimagesize;

hasreadfromthecurrentframe = no;

_rawbytesforimage = null;

inputrotation = kgpuimagenorotation;

[gpuimagecontext useimageprocessingcontext];

// 如果使用了bgra ,則選擇kgpuimagecolorswizzlingfragmentshaderstring著色器

if ( (outputbgra && ![gpuimagecontext supportsfasttextureupload]) || (!outputbgra && [gpuimagecontext supportsfasttextureupload]) )

// 否則選用kgpuimagepassthroughfragmentshaderstring著色器

else

if (!dataprogram.initialized)

}// 獲取統一變數和屬性

datapositionattribute = [dataprogram attributeindex:@"position"];

datatexturecoordinateattribute = [dataprogram attributeindex:@"inputtexturecoordinate"];

datainputtextureuniform = [dataprogram uniformindex:@"inputimagetexture"];

return

self;

}

// data access

// 獲取特定位置的畫素向量

- (gpubytecolorvector)coloratlocation:(cgpoint)locationinimage;

// 每行資料大小

- (nsuinteger)bytesperrowinoutput;

// 設定紋理大小

- (void)setimagesize:(cgsize)newimagesize;

// 鎖定、與解鎖幀快取

- (void)lockframebufferforreading;

- (void)unlockframebufferafterreading;

// 獲取特定位置的畫素向量

- (gpubytecolorvector)coloratlocation:(cgpoint)locationinimage;

// nslog(@"row end");

// gpubytecolorvector byteatone = imagecolorbytes[1];

// gpubytecolorvector byteatwidth = imagecolorbytes[(int)imagesize.width - 3];

// gpubytecolorvector byteatheight = imagecolorbytes[(int)(imagesize.height - 1) * (int)imagesize.width];

// nslog(@"byte 1: %d, %d, %d, byte 2: %d, %d, %d, byte 3: %d, %d, %d", byteatone.red, byteatone.green, byteatone.blue, byteatwidth.red, byteatwidth.green, byteatwidth.blue, byteatheight.red, byteatheight.green, byteatheight.blue);

// 控制邊界,0 < x < width, 0 < y < height,

cgpoint locationtopickfrom = cgpointzero;

locationtopickfrom.x = min(max(locationinimage.x, 0.0), (imagesize.width - 1.0));

locationtopickfrom.y = min(max((imagesize.height - locationinimage.y), 0.0), (imagesize.height - 1.0));

// 如果是bgra輸出,則把rgba資料轉為bgra資料

if (outputbgra)

else

}// 每行資料大小

- (nsuinteger)bytesperrowinoutput;

// 設定輸出紋理大小

- (void)setimagesize:(cgsize)newimagesize

}// 鎖定幀快取

- (void)lockframebufferforreading;

// 解鎖幀快取

- (void)unlockframebufferafterreading;

// 獲取rgba資料

- (glubyte *)rawbytesforimage;

if (hasreadfromthecurrentframe)

else

else

hasreadfromthecurrentframe = yes;

});return _rawbytesforimage;

}}

GPUImage原始碼解讀 五

從cache中獲取乙個gpuimageframebuffer物件,如果獲取失敗,那麼建立乙個新的gpuimageframebuffer物件。param framebuffersize 物件的大小 param textureoptions 紋理的配置資訊 param onlytexture 指示是否只...

GPUImage原始碼解讀 二

這篇文章主要是閱讀gpuimage框架中的 glprogram gpuimagecontext 兩個重要類的原始碼。這兩個類是 gpuimage 框架的基礎,裡面涉及的知識也有 opengl es 基礎 和 多執行緒 基礎。以下是原始碼內容 glprogram 一 glprogram glprogr...

openTLD 原始碼解讀

首先是run tld 在其次就是tldexample 最後到了初始化函式tldinit 第乙個比較關鍵的函式 bb scan 將影象網格化,將首先 scale 1.2.10 10 21 個規格 在每個規格上打網格 這個函式有乙個比較重要的方法 ntuples 就是重複 因為網格上的點很多點有相同的x...