日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenGL 笔记1 固定管线实例 + 双缓存测试实例

發布時間:2024/4/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenGL 笔记1 固定管线实例 + 双缓存测试实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

欲以此分類來記錄opengl的學習歷程,此為第一篇,所以先來一個固定管線的例子,以及對雙緩存的測試。

?

一、配置環境

寫之前,先進行配置,然后再講內容。

注:第一部分涉及的代碼均忽略。

【環境配置傳送門】

?

二、所需知識

1. opengl程序結構

? ? main函數結構大體上由如下幾個步驟:

1) glutInit(&argc, argv);讀取命令行參數,初始化glut2) glutInitDisplayMode(unsigned int mode);設置顯示模式(或窗口類型) (本節涉及參數如下)GLUT_RGB GLUT_RGBA GLUT_DOUBLE3) glutInitWindowSize(int, int);設置窗口規格4) glutInitWindowPosition(int, int);設置窗口初始位置5) glutCreateWindow(char*);6) if(glewInit()) ....判斷glew是否初始化成功7) init()初始化數據 ,函數體自己寫8) glutDisplayFunc(函數指針);系統自帶的顯示回調宏,在glut每次更新窗口內容的時候自動調用。9) glutMainLoop();無限循環,一直處理窗口消息,如:判斷是否需要進行重繪,然后自動調用glutDisplayFunc()中注冊的函數(即參數)。

2. 初始化數據

glGen* ?系列函數,用于OpenGL 分配不同類型的對象名稱。

glBind* ?系列函數,將已分配的對象名稱進行綁定,設定為當前活動對象。

以VBO(Vertex Buffer Object ?頂點緩沖對象)為例,來理解上面兩個函數的理念,其中VBO是一個GLuint對象,即無符號整型。

我們程序員想要操控緩沖區,怎么辦呢,緩沖區位于系統硬件中,對編程人員是不可見的。所以,opengl建立了一個映射機制,以一個GLuint的數據對象來代表某一緩存區。

其中,緩存區為映射的一端,VBO為另一端,我們首先要創建所需的VBO對象,然后通過glGenBuffers(VBO數量,VBO取址);來激活VBO對象作為某一映射的映射端。

因為程序員創建的GLuint對象,系統默認為一個普通的對象,只有通過glGenBuffers(),才能使系統將其認定為緩存區映射的對象。

而glBindBuffer(分配緩沖區類型,已激活的VBO對象);用于建立此映射,將VBO綁定到一個緩沖區,將當前VBO代表的緩沖區作為當前活動對象。爾后的所有關于緩沖區的操作均對當前VBO對象代表的緩沖區進行操作。

?

glBufferData(緩沖區類型,大小,數據,數據的讀寫方式);

剛剛說到VBO映射到一塊緩沖區,但是里面并沒有信息數據,所以要將數據傳到緩沖區中,就是上述函數的作用。

?

我們可以通過glBufferData將一組頂點位置坐標信息傳入到VBO1代表的緩沖區中,然后將頂點的顏色信息傳入到VBO2代表的緩沖區中,當我們渲染的時候,需要顏色信息對顏色信息進行處理加工的時候,我們就通過GLBindBuffer,將VBO2綁定為當前活動對象,反之,同理。

?

上述,以VBO為例講述了相關的一些概念,其他類似的函數同理。

?

3. 渲染

glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer)

參數解析表
參數名數值解釋
indexGLuint ? ? 如:0頂點著色器中輸入變量的location值,就是屬性的索引
sizeGLint ? ? ? 如:2每個頂點的屬性數量,如:x、y
typeGLenum ?如:GL_FLOAT頂點屬性變量的數值類型
normalizedGLboolean ?如:GL_FALSE設定了頂點數據存儲前是否進行歸一化
strideGLsizei ? ? 如:0相鄰屬性變量之間間隔的比特長度
pointerGLvoid* ? ?如:BUFFER_OFFSET(0)數據讀取時,開始位置的偏移量

通過該函數告訴管線怎樣解析buffer中的數據

?

glDrawArrays(繪制方式,第一個頂點的索引,頂點數量);

void glFlush(void);

強制所有進行中的OpenGL命令立即完成并傳輸到OpenGL服務端處理。這樣就可以保證它們在一定時間內全部完成。

但是,該函數只是強制所有運行中的命令送入服務端而已,它會立即返回,它并不會等待所有的命令完成,而等待確實我們需要做的。。。

glFinish();

它會一直等待所有當前的OpenGL命令立即執行,等待他們全部完成。但是可想而知,它會拖累程序整體性能。

?

三、代碼

1 //配置代碼 2 #if _MSC_VER>=1900 3 #include "stdio.h" 4 _ACRTIMP_ALT FILE* __cdecl __acrt_iob_func(unsigned); 5 #ifdef __cplusplus 6 extern "C" 7 #endif 8 FILE* __cdecl __iob_func(unsigned i) { 9 return __acrt_iob_func(i); 10 } 11 #endif /* _MSC_VER>=1900 */ 12 14 #include <iostream> 15 using namespace std; 16 17 //我們需要包含 "val.h" 和 "LoadShaders.h" 18 //如果你按照之前配置環境那樣做了,需要: 19 //#include "vgl.h" 21 22 //我這里是自己將兩個文件放到VS庫目錄里面了,總之,只要正確引用兩個文件即可 23 #include <vgl.h> 26 27 //頂點緩沖對象初始下標、緩沖對象數量、頂點屬性數量、頂點數量 28 enum {Arraybuffers, Numbuffers, AttriNum = 3, VerNum}; 29 30 GLuint buffers[Numbuffers]; //頂點緩沖對象數組 the array of VBOs 31 32 void init(); 33 void Display(); 34 35 int main(int argc, char** argv) 36 { 37 //命令行初始化glut 38 glutInit(&argc, argv); 39 40 //初始化顯示模式 41 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); 42 43 //初始化windows 44 glutInitWindowSize(900, 600); 45 glutInitWindowPosition(20, 20); 46 glutCreateWindow("my work 1"); 47 48 //檢查glew是否就緒 49 if (glewInit()) 50 { 51 cout << "glew didn't go work!" << glewGetErrorString(glewInit()) << endl; 52 exit(EXIT_FAILURE); 53 } 54 55 //初始化數據 56 init(); 57 58 //渲染 59 glutDisplayFunc(Display); 60 61 glutMainLoop(); 62 63 return 0; 64 } 65 66 void init() 67 { 68 //頂點數據 69 GLfloat vertices[VerNum][AttriNum] 70 { 71 { 0.8,0.8,0 }, 72 { -0.1,0,0}, 73 {0.8,-0.8,0}, 74 {-0.8,0,0}, 75 }; 76 77 //創建緩沖器 78 glGenBuffers(Numbuffers, buffers); 79 //綁定緩沖器 80 glBindBuffer(GL_ARRAY_BUFFER, buffers[Arraybuffers]); 81 //向緩沖區傳遞數據 82 glBufferData(GL_ARRAY_BUFFER, sizeof vertices, vertices, GL_STATIC_DRAW); 83 84 //設置清除顏色 85 glClearColor(0, 0, 0, 0); 86 } 87 88 void Display() 89 { 90 //清空顏色緩存 91 glClear(GL_COLOR_BUFFER_BIT); 92 93 //開啟頂點屬性數組 94 glEnableVertexAttribArray(0); 95 96 glBindBuffer(GL_ARRAY_BUFFER, buffers[Arraybuffers]); 97 98 glVertexAttribPointer(0, AttriNum, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 99 100 //繪制 兩個三角形 101 glColor4f(1, 0, 0, 0.3); //設置顏色 102 glDrawArrays(GL_TRIANGLES, 0, VerNum); 103 glColor4f(0, 0, 1, 0.8); 104 glDrawArrays(GL_TRIANGLES, 1, VerNum); 105 //1. 將繪制好的兩個三角形放到屏幕前面 106 glutSwapBuffers(); 107 108 //在后面的幀緩存中繼續繪制 一個四邊形 邊框 109 glColor4f(1, 0.1, 0.8, 0.0); 110 glDrawArrays(GL_LINE_LOOP, 0, VerNum); 111 112 //2. 將后面的四邊形邊框幀緩存放到屏幕前面 113 glutSwapBuffers(); 114 115 //此時,理論上講,后臺的幀緩存應該為原來繪制的兩個三角形 116 glColor4f(1, 0.1, 0.8, 0.0); 117 //我們在其基礎上,加上邊框 118 glDrawArrays(GL_LINE_LOOP, 0, VerNum); 119 120 //3. 顯示的是兩個三角形+邊框 121 glutSwapBuffers(); 122 123 //禁用頂點屬性數組 這個要最后禁用 124 glDisableVertexAttribArray(0); 125 126 glFlush(); 127 }

?

四、效果

標號為1.處得到的效果:(將107-122注釋掉)

標號2.處得到的效果(將114-122注釋)

標號3.處的效果,即將后面幀緩存中的效果添加到原來幀緩存的圖形中得到的效果

?

?

通過這一節的測試,我們真正的看到了雙緩存的工作過程,以及內部數據信息。

?

感謝您的閱讀,生活愉快~

轉載于:https://www.cnblogs.com/lv-anchoret/p/9221504.html

總結

以上是生活随笔為你收集整理的OpenGL 笔记1 固定管线实例 + 双缓存测试实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 毛片88 | 长河落日电视连续剧免费观看01 | 黄色一级片黄色一级片 | 欧美一级免费在线观看 | 黄色国产在线播放 | 爱爱视频在线看 | 国产精品久久综合视频 | 91视频在线 | 久久国产劲爆∧v内射 | 91美女片黄在线观看游戏 | 国产精品久久毛片 | 玖草视频在线 | 国产另类xxxxhd高清 | 亚洲高清久久 | 日日燥夜夜燥 | 亚洲一区二区三区在线播放 | 午夜精品久久久久久久99老熟妇 | 国产成人亚洲综合a∨婷婷 台湾a级片 | exo妈妈mv在线播放高清免费 | 中文字幕在线播放av | 日韩精品一区中文字幕 | 日本午夜视频在线观看 | 手机成人免费视频 | 少妇aa| 国产理论一区 | 丁香色欲久久久久久综合网 | 黄色网址大全免费 | 国产毛片视频 | 波多野结衣先锋影音 | 在线免费观看麻豆 | 亚洲天堂8 | 成人免费网视频 | 三级视频在线播放 | 国产精品无码人妻一区二区在线 | 日本黄色的视频 | 不卡影院一区二区 | 99欧美 | 免费色网站| 中国女人内谢69xxxxⅹ视频 | 自拍视频第一页 | 黄页视频在线免费观看 | 911成人网| 九色porny蝌蚪视频 | 国产视频一区二区三区四区 | 五月天精品视频 | 老熟妇一区二区三区 | 大尺度做爰呻吟舌吻情头 | 91黄色免费网站 | 亚洲国产欧洲 | 一个人看的www片免费高清中文 | 亚洲欧美日韩一区二区 | 欧美jizzhd欧美18 | 嫩草综合 | 国产最新毛片 | 欧性猛交ⅹxxx乱大交 | 亚洲成人黄色在线观看 | 蜜桃成人av| 亚洲国产视频在线 | 国产一区二区三区四区精 | 成年人免费视频播放 | 成人黄色动漫在线观看 | 五月天导航 | 粉嫩av一区二区三区 | 欧美精品一区二区三区四区五区 | 日本激情网址 | 免费在线观看av网址 | 91av影视| 日批在线观看 | 手机在线观看免费av | 国产中文一区二区三区 | 91中文在线 | 色在线网站| 欧产日产国产精品98 | 日本做爰高潮又黄又爽 | 日本免费无人高清 | 色婷婷在线观看视频 | 欧美日韩精品久久久免费观看 | 国产精品欧美大片 | 乱色熟女综合一区二区三区 | 四虎影城库| av字幕网| 91色偷偷 | 久久艹这里只有精品 | 国产欧美123 | 精品成人一区二区 | 亚洲精品www久久久久久广东 | 国产综合av | 黄色大片中文字幕 | 国产免费观看视频 | 毛片av在线 | 活大器粗np高h一女多夫 | 人妻换人妻仑乱 | 91操操 | 亚洲天堂第一区 | 欧美大片在线 | 成人精品二区 | 欧美日韩电影一区二区 | 修女也疯狂3免费观看完整版 | 爱的色放韩国电影 |