GLSL層卷積(紋理陣列)

2021-10-09 11:18:18 字數 1805 閱讀 5154

在《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...