在《opengl-紋理陣列》一文中看到紋理陣列只用乙個紋理物件就可以載入多個通道資料。
在層卷積中能減少著色器執行次數。
把輸入的多通道資料載入乙個紋理陣列中:
int loadgltextures_arrayg(float *ptexdata,int num)
層卷積:
//核資料,核寬,輸入維度,輸出維度,偏置資料,輸入資料,輸出資料,是否啟用
//核大小:kw * kw * 輸入維度 * 輸出維度。
//輸入資料大小:wh * 輸入維度。 輸出資料大小:wh * 輸出維度。
//加法結果在fbo中,中間不用讀出,relu也在glsl中完成
void conv_glsl_層_紋理陣列g(float* kernel,int kw,int innum,int outnum,float *bias,float *indata, float * &outdata,bool active=true)
; clock_t start_t, end_t;//計算時間
double total_t;
start_t = clock();
int wh=unheight * unwidth;
outdata=new float[wh*outnum];
memset(outdata, 0, wh*outnum*sizeof(float));//清零
float *out=outdata;
float * kernel_s=kernel;//當前核
for(int k=0;k1.0)
out+=wh;
} //清理
if( texture !=0)
}
著色器:
//卷積著色器 convolution.h
#version 400 compatibility
#extension gl_ext_gpu_shader4 : enable
//紋理取樣器
uniform sampler2darray moonimage;
//寬uniform int w;
//高uniform int h;
//核寬
uniform int kw;
//核數量
uniform int knum;
uniform float kernel[2048];
//偏置
uniform float bias;
//啟用
uniform int active;
float relu(float i) else
} vec4 vec4relu(vec4 v)
void main()
index++;//遍歷核
}} //加偏置
fsum += bias;
//啟用
if(active==1)
fsum = vec4relu(fsum);
gl_fragcolor = fsum;
}
這樣,又快一點了
結束
GLSL層卷積(快取物件)
在第11課 11.2 01bufferobject 中講了 著色器可以對 快取物件 讀寫。我們的層卷積中,也用乙個 快取物件 傳送全部卷積核,並 卷積結果 前半部分結果,後半部分核 核資料,核寬,輸入維度,輸出維度,偏置資料,輸入資料,輸出資料,是否啟用 核大小 kw kw 輸入維度 輸出維度。輸入...
GLSL層卷積(寬 高 輸出通道數)(計算單位數)
增加計算單位數,可以加快計算速度。計算單位 從 iwidth iheight 增加到 iwidth iheight outnum mnumgroupsx iwidth int xsize iheight mnumgroupsy outnum mnumgroupsz 1 innum if iheigh...
如何向GLSL中傳入多個紋理
如何向glsl中傳入多個紋理 如下程式,我們在glsl的fragment著色程式中定義了3個sample2d作為紋理引數。cpp view plain copy uniform sampler2d basemap uniform sampler2d reflectmap uniform sample...