使用glew和glad 新建窗口

一、添加頭文件

首先,將頭文件加到項目的.cpp文件中

1 #include <glad/glad.h>
2 #include <GLFW/glfw3.h>

注:

包含glad的頭文件一定要在包含glfw的頭文件之前使用。因為glad的頭文件包含了正確的openGL頭文件(例如GL/gl.h),所以需要在需要依賴于openGL的頭文件之前使用glad.

二、創建main函數

在main函數中實例化GLFW窗口

int main() {
glfwInit();//調用glfwInit函數來初始化GLFW

// 配置GLFW--告訴GLFW使用OpenGL版本為3.3
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);//主版本號
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3);//次版本號
glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);//告訴GLFW使用的是核心模式(CORE_PROFILE)
return 0;
}

使用glfwWindowHint函數來配置GLFW。

glfwWindowHint函數的第一個參數代表選項的名稱,第二個參數接受一個整形,用來設置這個選項的值。

三、創建窗口對象

這個窗口對象存放了所有和窗口相關的數據,而且會被GLFW的其他函數頻繁的用到。

1 GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
2 if (window == NULL) {
3     cout << "Failed to creat GLFW window" << endl;
4     glfwTerminate();
5     return -1;
6 }
7 glfwMakeContextCurrent(window);

glfwCreateWindow函數需要窗口的寬和高作為它的前兩個參數。第三個參數表示這個窗口的名稱。這個函數將會返回一個GLFWwindow對象,我們會在其它的GLFW操作中使用到。創建完窗口我們就可以通知GLFW將我們窗口的上下文設置為當前線程的主上下文了。

四、初始化GLAD

GLAD用來管理OpenGL函數的指針,所以在調用任何OpenGL的函數之前我們需要初始化GLAD。

1 if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
2     cout << "Failed to initialize GLAD" << endl;
3     return -1;
4 }

我們給GLAD傳入了用來加載系統相關的OpenGL函數指針地址的函數。GLFW給我們的是glfwGetProcAddress

五、視口

在開始渲染圖形之前我們需要告訴OpenGL渲染窗口的尺寸大小,即視口(viewport),這樣OpenGL才知道怎樣根據窗口大小顯示數據和坐標。

glViewPort()將標準化坐標系轉換到屏幕坐標系

當窗口大小改變時,視口也被調整。可以對窗口注冊一個回調函數(callback function),它會在每次窗口大小被調整的時候被調用。這個回調函數的原型為:

幀緩沖大小函數

void frambuffer_size_callback(GLFWwindow* window,int width,int height)

每當窗口改變大小,GLFW會調用這個函數并填充相應的參數供你處理。

void framebuffer_size_callback(GLFWwindow* window, int width, int height) {glViewport(0,0,width,height);
}

我們還需要注冊這個函數,告訴GLFW我們希望每當窗口調整大小的的時候調用這個函數:

glfwSetFramebufferSizeCallback(window,framebuffer_size_callback)

雖然是當窗口大小改變的時候調用這個函數,但是在第一次顯示窗口的時候也會調用這個函數。

六、準備好引擎

我們不希望只繪制一個圖像之后我們的應用程序就立即退出并關閉窗口。我們希望程序在我們主動關閉之前不斷繪制圖像并能夠接受用戶輸入。因此,我們需要在程序中添加一個while循環,我們可以稱之為渲染循環(render loop),它能在我們讓glfw退出前一直保持運行。

下邊是一個簡單的渲染循環:

1 while(!glfwWindowShouldClose(window))
2 {
3     glfwSwapBuffers(window);
4     glfwPollEvents();    
5 }

glfwWindowShouldClose:函數在我們每次循環的開始前檢查一次GLFW是否被要求退出,如果是,該函數返回true然后渲染循環便結束了。

glfwPollEvents函數檢查有沒有出發什么事件(比如鍵盤輸入、鼠標移動等)、更新窗口狀態、并調用對應的回調函數。

glfwSwapBuffers函數交換顏色緩沖。

七、輸入

在GLFW中實現一些輸入控制,可以通過幾個輸入函數完成。

glfwGetKey函數需要一個窗口及一個按鍵作為輸入,這個函數將會返回這個按鍵是否正在被按下。我們可以創建一個processInput函數,在其內放置不同的輸入函數,讓輸入代碼保持整潔。

1 void processInput(GLFWwindow *window) {
2     if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
3         glfwSetWindowShouldClose(window,true);
4     }
5 }

這里我們檢查用戶是否按下了返回鍵(Esc)(如果沒有按下,glfwGetKey將會返回GLFW_RELEASE。如果用戶的確按下了返回鍵,我們將通過glfwSetwindowShouldClose使用把WindowShouldClose屬性設置為?true的方法關閉GLFW。下一次while循環的條件檢測將會失敗,程序將會關閉。

并添加到while循環中的第一個語句。

八、釋放資源

當渲染循環結束后我們需要正確釋放/刪除之前分配的所有資源。可以在main函數的最后調用glfwTerminate()來完成。

1 glfwTerminate();
2 return 0;

這樣便能清理所有的資源并正確的退出應用程序。

代碼:NEW.cpp

轉載于:https://www.cnblogs.com/keguniang/p/9897420.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253166.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253166.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253166.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

有道詞典筆3新增功能掃讀和點讀是怎么集成的?

2020年12月1日&#xff0c;有道品牌推出了一款硬件新品&#xff0c;名叫有道詞典筆3。 相對有道于2019年8月推出后來被稱為“爆品”的有道詞典筆2來說&#xff0c;有道3硬件最大最明顯差別是屏幕變的更大了&#xff0c;同時增加了點讀功能&#xff08;點讀筆點讀特定教材的功能…

??RTP協議分析

RTP協議分析 一&#xff0e; RTP協議背景.......................................................................................................... 1 二&#xff0e; RTP協議原理及工作機制........................................................................…

mongodb 部署

安裝mongodb-3.4 1&#xff09;將安裝包上傳至服務器 2&#xff09;對壓縮文件進行解壓 tar -zxvf mongodb-linux-x86_64-suse12-v3.4-latest.tar.gz 3&#xff09;把解壓出來的文件修改一下名字&#xff0c;并挪到指定安裝路徑 sudo mv mongodb-linux-x86_64-suse12-3.4.6-22-…

如何選擇一款優秀的兒童讀寫臺燈?

如何選擇一款優秀的兒童閱讀臺燈&#xff1f;除了品牌、外觀、材質、價格等因素外&#xff0c;最關鍵的是技術參數。 先說結論&#xff0c;滿足如下幾點參數&#xff0c;當數優選&#xff1a; 1-光通量&#xff1a;500lm以上 2-顯色指數&#xff1a;≥95 3-色溫&#xff1a…

Python與操作系統有關的模塊

Os模塊Python的標準庫中的os模塊主要涉及普遍的操作系統功能。可以在Linux和Windows下運行&#xff0c;與平臺無關。os.sep 可以取代操作系統特定的路徑分割符。os.name字符串指示你正在使用的平臺。比如對于Windows&#xff0c;它是’nt’&#xff0c;而對于Linux/Unix用戶&am…

數據對拍代碼 c++

碼了一晚上才碼出這個&#xff0c;有點簡陋&#xff0c;待更新 注意&#xff1a;1、數據路徑自己在代碼中修改&#xff0c;直接重定向即可 2、要配置好環境&#xff0c;將cb安裝路徑里的MinGW\bin路徑放到path中 3、三份代碼記得先編譯一遍&#xff0c;再運行這份代碼 #include…

LCD顯示相關知識

無論是筆記本電腦還是桌面系統&#xff0c;采用的LCD顯示屏都是由不同部分組成的分層結構。位于最后面的一層是由熒光物質組成的可以發射光線的背光層。背光層發出的光線在穿過第一層偏振過濾層之后進入包含成千上萬水晶液滴的液晶層。液晶層中的水晶液滴都被包含在細小的單元格…

屏幕防藍光設計方向

屏幕防藍光設計方向&#xff0c;會有哪些呢&#xff1f; 初步想到的如下&#xff1a; 1- 背光燈珠類型&#xff1b; 藍光激發還是全光譜sunlike燈珠&#xff1b; 2-玻璃鍍膜&#xff1b; 3-屏幕貼膜&#xff1b; 4-軟件設置&#xff1b; 除了第一項外&#xff0c;其余均多…

快速冪,矩陣乘法,矩陣快速冪

快速冪利用二進制 復雜度 log級 #include <cstdio> #include <iostream> #include <string> #include <bits/stdc.h>using namespace std; typedef long long ll; typedef unsigned long long ull;int q_power(int a,int b,int c) {int r1;a%c;while (…

標準C++類std::string的內存共享和Copy-On-Write(寫時拷貝)

標準C&#xff0b;&#xff0b;類std::string的內存共享&#xff0c;值得體會&#xff1a; 詳見大牛&#xff1a;https://www.douban.com/group/topic/19621165/ 顧名思義&#xff0c;內存共享&#xff0c;就是兩個乃至更多的對象&#xff0c;共同使用一塊內存&#xff1b; 1.關…

常用類一一枚舉類一一定義和調用

package test;public class EnumTest {/**枚舉* */public static void main(String[] args) {// TODO Auto-generated method stubStudent stu new Student();stu.setName("李華");stu.setSex(Genders.MALE);stu.setAge(24);System.out.println(stu.getSex());}} pa…

HDbaseT 高清傳輸更簡單——只需一根網線

HDbaseT支持最高20Gbps的傳輸速率&#xff0c;能更好的支持未來的3D和2K4K視頻格式&#xff0c;傳輸采用普通的CAT5e/6網絡線纜&#xff0c;連接器也采用普通的 RJ45接頭&#xff0c;而傳輸距離達到了100米&#xff0c;除了提供視頻信號傳輸功能外&#xff0c;還具有網絡連接以…

2017年

2017年對自己來說這一年是最需要成長的一年&#xff0c;肩上的責任越來越大了。轉載于:https://www.cnblogs.com/jimmy1293/p/6543533.html

解決 | 此數據庫文件跟當前sql server實例不兼容 sql server2008無法連接到(local)...

最近在搞ASP.NET&#xff0c;因實驗室VS版本跟PC不一樣可能&#xff0c;拷回來一打開就這樣子&#xff1a; 眉頭一皺的我打開我的古董SQL&#xff0c;自從用了MySQL就沒碰它了我的鍋。。。果然。。連接的時候。。。不慌&#xff0c;(win 10)打開控制面板\系統和安全\管理工具 -…

IP大時代下,網絡槍機技術發展現狀

來源&#xff1a;a&s《評測&選型》 作者&#xff1a;海康威視程瑋 在視頻監控行業內&#xff0c;有很多里程碑式的產品&#xff0c;我們可以從這些產品中了解視頻監控的發展趨勢。2000年左右&#xff0c;第一臺DVR面世奠定了視頻監控行業從CCTV走向數字化的基礎&#x…

JVM調優總結(3):垃圾回收面臨的問題

如何區分垃圾 上面說到的“引用計數”法&#xff0c;通過統計控制生成對象和刪除對象時的引用數來判斷。垃圾回收程序收集計數為0的對象即可。但是這種方法無法解決循環引用。所以&#xff0c;后來實現的垃圾判斷算法中&#xff0c;都是從程序運行的根節點出發&#xff0c;遍歷…

RoHS、無鉛制程、無鹵 的基本介紹

一、RoHS是歐盟對電子電器產品不能超標含有某些有害物質的禁令&#xff1b;在具體產品生產中&#xff0c;從原材料的選擇、采購到制程中可能會污染產品&#xff08;和產品接觸&#xff09;的生產輔助材料&#xff0c;都必須不能超標含有&#xff08;有最大允許濃度&#xff09;…

springCloud分布式事務實戰(九)改造ThemeMicroService 支持分布式事務

&#xff08;1&#xff09; 添加jar <!-- springCloud 事務 關鍵點1 --><dependency><groupId>com.codingapi</groupId><artifactId>transaction-springcloud</artifactId><version>${lcn.last.version}</version><exclu…

日常的一天學習

今天的學習仍然沒有特別明確的計劃&#xff0c;也許自己不應該再徘徊&#xff0c;專心做java編程挺好的啊&#xff0c;也許還能找到不錯的工作&#xff0c;可是自己始終還是想成為一個研究安全的人&#xff0c;只是不知道自己在畢業的時候能不能成長到靠安全來養活自己。 早上主…

庖丁解牛-----Live555源碼徹底解密(根據MediaServer講解Rtsp的建立過程)

live555MediaServer.cpp服務端源碼講解(testRelay.cpp,http://blog.csdn.net/smilestone_322/article/details/18923139) int main(int argc, char** argv) { // Begin by setting up our usage environment: TaskScheduler* scheduler BasicTaskScheduler::createNew(); Usa…