GPU程式設計之GLSL(五) 二維離散卷積

2021-06-23 05:11:50 字數 4041 閱讀 7365

本程式共分為7個檔案:

1個主程式檔案,2個ctimer檔案,2個creader檔案,2個著色器檔案

兩個creader檔案和2個著色器檔案分別在前邊的(二)和(四)中給出,這裡就不詳細解釋了

首先我們來講一下比較簡單的檔案——ctimer檔案:

主要是為了獲取時間,以便比較程式效能

這是ctimer.h檔案

#ifndef timer_h_

#define timer_h_

#include"windows.h"

#includeclass ctimer;

long gettime(void);

void reset(void);

private:

systemtime time;

long _lstart;

long _lstop;

void init(void);

};#endif /*timer_h_*/

這是ctimer.cpp檔案:

#include "ctimer.h"

void ctimer::init(void)

long ctimer::gettime(void)

void ctimer::reset(void)

接下來是主程式檔案:

共分為6大部分:初始化,準備紋理快取,配置glsl,繪製矩形,計時,讀回結果

1、初始化:包含對glut、glew、fbo的初始化

2、準備紋理快取:定義兩塊紋理,一塊儲存輸入一塊儲存輸出,簡單生成資料傳入輸入資料的紋理快取中

4、繪製矩形:輸出快取ytexid與fbo關聯(計算的結果需要寫入儲存輸出資料的紋理快取),啟用已經儲存有輸入資料的紋理單元,設定顯然物件,使矩形中的每乙個畫素都會被覆蓋到,保證矩形與紋理圖同一尺寸

5、計時:glfinish()可以起到執行緒同步的作用,該函式是控制進入等待狀態,直到所有呼叫的opengl命令都執行完成,它才返回。在計時器開始和結束的時候都要呼叫該函式以保證執行緒同步

6、讀回結果:將結果傳回pfoutput快取,最後完成清理工作

#include #include #include #include #include #include "creader.h"

#include "ctimer.h"

#pragma comment(lib, "glew32.lib")

#define width 1024 //資料塊的寬度

#define height 1024 //資料塊的長度

#define mask_radius 2 //掩膜半徑

using namespace std;

void initglsl(void);

void initfbo(unsigned unwidth,unsigned unheight);

void initglut(int argc,char** argv);

void createtextures(void);

void setuptexture(const gluint texid);

void performcomputation(void);

void transferfromtexture(float* data);

void transfertotexture(float* data,gluint texid);

//紋理識別符號

gluint ytexid;

gluint xtexid;

//glsl 變數 配置glsl(一)

gluint glslprogram;

gluint fragmentshader;

gluint outparam,inparam,radiusparam;

//fbo識別符號

gluint fb;

//「螢幕外視窗」的識別符號,建立乙個有效的opengl環境

gluint glutwindowhandle;

//為opengl紋理準備的結構體,包含了紋理格式、內部格式等

struct structtextureparameterstextureparameters;

//全域性變數

float* pfinput; //輸入資料

float fradius = (float)mask_radius;

unsigned unwidth = (unsigned)width;

unsigned unheight = (unsigned)height;

unsigned unsize = unwidth * unheight;

int main(int argc, char **argv)

//初始化glut,建立的視窗是為有乙個有效的opengl環境

void initglut(int argc,char **argv)

//螢幕外渲染

void initfbo(unsigned unwidth,unsigned unheight)

//初始化glsl執行時元件,並建立著色器 配置glsl(三)

void initglsl(void)

void createtextures(void)

void setuptexture(const gluint texid)

void performcomputation(void)

{ //關聯輸出快取ytexid與fbo

glframebuffertexture2dext(gl_framebuffer_ext,gl_color_attachment0_ext,

textureparameters.textarget,ytexid,0);

//將glslprogram設為當前程式物件

gluseprogram(glslprogram);

//將gl_texture0設為當前紋理單元

glactivetexture(gl_texture0);

//更新uniform變數,將應用程式的fradius的值傳遞至著色器內部

gluniform1f(radiusparam,fradius);

//同步執行緒,以便計時

glfinish();

//計時開始

ctimer timer;

long ltime = 0;

timer.reset();

//將設定寫入紋理快取的型別

gldrawbuffer(gl_color_attachment0_ext);

//將計算範圍定義為同樣包括矩形的內部

glpolygonmode(gl_front,gl_fill);

//用未歸一化的紋理座標設定計算範圍

glbegin(gl_quads);

gltexcoord2f(0.0,0.0);

glvertex2f(0.0,0.0);

gltexcoord2f(unwidth,0.0);

glvertex2f(unwidth,0.0);

gltexcoord2f(unwidth,unheight);

glvertex2f(unwidth,unheight);

gltexcoord2f(0.0,unheight);

glvertex2f(0.0,unheight);

glend();

//同步執行緒,終止計時

glfinish();

ltime = timer.gettime();

cout<<"time elapsed: "<

仇德元.《gpgpu程式設計技術——從glsl、cdpu到opengl》[m].河北省三河市:機械工業出版社,2023年:323.

GPU程式設計之GLSL(八) 配置GLSL

由於昨天重灌系統,導致所有的檔案都需要重新配置,此次配置過程中又發現了一些問題 首先說一下步驟吧 所有的.h檔案放在 c program files x86 microsoft sdks windows v7.0a include gl 所有的.dll檔案放在 c windows syswow64 ...

GPU程式設計之GLSL(二)

首先我們需要有乙個c 的工程 共包含5個檔案 乙個主工程檔案,兩個負責讀寫的,乙個頂點著色器,乙個片段著色器 目前這個程式執行的結果為 乙個旋轉的茶壺 下一節會講有關opengl與著色器的通訊問題。各個檔案 如下 第乙個即為主工程檔案 include include include include ...

程式設計之美 子陣列之和的最大值(二維)

避免使用暴力列舉的方法,我們參考一維陣列的求法,一維的解答可以再線性時間 內完成,具體可以參考我的程式設計珠璣讀書筆記。我們把問題從二維轉壞為一維,現在我們列舉矩陣的上下邊界,然後用一維的方法確定左右邊界,時間複雜度為o n 2 m include include using namespace s...