本程式共分為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...