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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

GLFW--Getting started

發(fā)布時(shí)間:2023/11/27 生活经验 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GLFW--Getting started 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這篇文章是GLFW使用的簡(jiǎn)介。算是翻譯吧:原文在here

Step by step

包含頭文件

在使用OpenGL或GLFW工程源文件里需要包含GLFW3頭文件。

#include <GLFW/glfw3.h>

這個(gè)頭文件中定義了GLFW API所有的常量,類型和函數(shù)原型,同時(shí)也包含了OpenGL頭文件并定義了在本系統(tǒng)平臺(tái)上需要用到的所有常量和類型。

例如:在windows平臺(tái)下,通常要求在GL/gl.h之前包含windows.h,這使得源文件與Windows綁定在一起,同時(shí)會(huì)將整個(gè)Win32 API與代碼空間混淆。

然后,其實(shí)不用包含windows.h,GLFW頭文件就會(huì)處理這些問題。GLFW并不是簡(jiǎn)單的復(fù)制windows.h文件,而是使用它的一部分而已。所以,當(dāng)在源文件里包含了windows.h的時(shí)候,GLFW頭文件就不會(huì)試著去重定義那些符號(hào)了(those symbols)。

也就是說:

  • 不要包含OpenGL頭文件,GLFW會(huì)為你包含的
  • 不要包含windows.h頭文件或者與系統(tǒng)相關(guān)的頭文件,除非你想直接使用這些API。
  • 如果確實(shí)需要包含這些頭文件,那么要在GLFW之前把他們包含進(jìn)去,以便能先檢測(cè)到這些頭文件。

從3.0版本開始,GLU頭文件glu.h就不再是默認(rèn)包含了。如果要使用,需要在GLFW頭文件之前定義GLFW_INCLUDE_GLU

#definne GLFW_INCLUDE_GLU
#include <GLFW/glfw3.h>

初始化和終止GLFW

在使用GLFW之前要對(duì)其進(jìn)行初始化,初始化成功返回GL_TRUE,如果有錯(cuò)誤則返回GL_FALSE。

if(!glfwInit())exit(EXIT_FAILURE);

GLFW使用完成之后,在應(yīng)用退出之前要終止GLFW

glfwTerminate();

設(shè)置錯(cuò)誤回調(diào)函數(shù)(error callback)

大多數(shù)事件是由回調(diào)報(bào)告,比如某個(gè)鍵是否按下,GLFW窗口是否被移動(dòng),錯(cuò)誤是否產(chǎn)生。回調(diào)(Callback)是簡(jiǎn)單地C函數(shù)(或者C++靜態(tài)方法)。這些回調(diào)由帶有描述事件的參數(shù)的GLFW調(diào)用。

如果GLFW函數(shù)調(diào)用失敗,那么錯(cuò)誤就會(huì)報(bào)告給GLFW的粗無回調(diào)函數(shù)(error callback)。你可以收到帶有錯(cuò)誤回調(diào)的報(bào)告。函數(shù)必須要有如下的簽名(signature)。這個(gè)簡(jiǎn)單的錯(cuò)誤回調(diào)函數(shù)只是簡(jiǎn)單的把錯(cuò)誤描述打印到stderr。

void error_callback(int error, const char *description)
{fputs(description, stderr);
}

必須設(shè)置回調(diào)函數(shù),這樣GLFW才能調(diào)用他們。錯(cuò)誤回調(diào)函數(shù)是GLFW函數(shù)初始化之前要調(diào)用的函數(shù)的一部分,這樣在初始化時(shí)和初始化之后顯示出錯(cuò)誤。

glfwSetErrorCallback(error_callback);

創(chuàng)建窗口和上下文(Context)

利用一個(gè)調(diào)用就可以創(chuàng)建一個(gè)窗口和它的上下文,并返回一個(gè)句柄(Handle)。例如,如下創(chuàng)建一個(gè)640x480的窗口和OpenGL 上下文

GLFWwindow *window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);

如果窗口和上下文創(chuàng)建失敗就返回NULL,所以要檢測(cè)其返回值。

if(!window)
{glfwTerminate();exit(EXIT_FAILURE);
}

窗口句柄會(huì)傳遞給所有與window相關(guān)的函數(shù)和所有與window相關(guān)的調(diào)用,這樣就可以決定哪個(gè)window接受消息。

當(dāng)不需要窗口是,就銷毀它。

glfwDestoryWindow(window);

設(shè)置OpenGL的上下文

在使用OpenGL API之前,必須設(shè)置OpenGL上下文環(huán)境。

glfwMakeContextCurrent(window);

檢測(cè)窗口關(guān)閉標(biāo)志

每個(gè)窗口都有標(biāo)志指示一個(gè)窗口是否應(yīng)該關(guān)閉。

當(dāng)用戶試圖關(guān)閉窗口(不管是點(diǎn)擊標(biāo)題欄上的關(guān)閉部件還是使用混合鍵Alt+F4),這個(gè)標(biāo)志就會(huì)置1。注意:此時(shí)窗口并沒有真正關(guān)閉,所以要檢測(cè)這個(gè)標(biāo)志或者由這個(gè)標(biāo)志銷毀窗口或者給用戶一些反饋信息。

while(!glfwWindowShouldClose(window))
{//keep running
}

當(dāng)用戶要關(guān)閉窗口時(shí)可以通過glfwSetWindowCloseCallBack設(shè)置一個(gè)關(guān)閉回調(diào)函數(shù)(Close Callback)來通知用戶。當(dāng)關(guān)閉標(biāo)志置1時(shí)立刻調(diào)用關(guān)閉回調(diào)函數(shù)。

接收輸入事件

每個(gè)窗口都有很多回調(diào)函數(shù)用來接收各種各樣事件。為了接收鍵盤按鍵和釋放的事件,可以創(chuàng)建一個(gè)按鍵回調(diào)函數(shù)。

static void key_callback(GLFWwindow *window, int key, int scancode, int action, int mods)
{if(key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)glfwSetWindowShouldClose(window, GL_TRUE);
}

同其他窗口相關(guān)的調(diào)用一樣,每個(gè)窗口都有對(duì)應(yīng)按鍵回調(diào)函數(shù)。

glfwSetKeyCallback(window, key_callback);

當(dāng)事件產(chǎn)生時(shí),為了事件回調(diào)函數(shù)能夠被調(diào)用,應(yīng)該按如下方法處理事件。

與OpenGL一起渲染

當(dāng)有了OpenGL上下文環(huán)境之后,就可以正常的使用OpenGL了。在這個(gè)教程里,將會(huì)繪制一個(gè)多顏色的三角形。為了使用glViewport要獲取幀緩沖區(qū)的大小

int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0,0, width, height);

讀計(jì)時(shí)器

為了創(chuàng)建平滑的動(dòng)畫,需要time source. GLFW 提供一個(gè)計(jì)時(shí)器可以返回開始初始化到當(dāng)前的時(shí)間間隔。time source 是系統(tǒng)最精確的通常是毫秒或者是微妙。

double time = glfwGetTime();

交換緩沖區(qū)(Swapping buffers)

GLFW默認(rèn)使用雙緩沖區(qū),這表示每個(gè)窗口都有兩個(gè)渲染緩沖區(qū):前緩沖區(qū)和后緩沖區(qū);前緩沖區(qū)是正在繪制的緩沖區(qū),后緩沖區(qū)是等待繪制的緩沖區(qū)。
當(dāng)一個(gè)幀繪制完成后,兩個(gè)緩沖區(qū)需要交換,此時(shí)后緩沖區(qū)變?yōu)榍熬彌_區(qū),反之亦然。

glfwSwaBuffers(window);

交換間隔是指要交換兩個(gè)緩沖區(qū)之間的幀數(shù),即vsync。默認(rèn)情況下,交換間隔為0,即交換會(huì)立刻進(jìn)行。在很快的一些機(jī)器上,不會(huì)看到這些幀,因?yàn)槠聊皇冀K以60-70/s的速度更新,這會(huì)浪費(fèi)很多CPU或GPU周期。

同樣,因?yàn)榫彌_區(qū)交換發(fā)生在屏幕更新中間,就會(huì)造成屏幕撕裂問題screen tearing

由于這個(gè)原因,應(yīng)用通常會(huì)把交換間隔設(shè)置為1。也可以設(shè)置更高的值,但是通常不建議這樣,因?yàn)檫@會(huì)導(dǎo)致輸入延遲。

glfwSwapInterval(1);

處理事件

GLFW需要和窗口系統(tǒng)經(jīng)常交流,為了接收事件和顯示應(yīng)用沒有鎖住。在有可見窗口時(shí)必須進(jìn)行事件處理,通常在每幀緩沖區(qū)交換后。

有兩種方法處理掛起事件(pending event):輪詢(polling)和等待(waiting)。這個(gè)例子將會(huì)使用輪詢,即僅僅在已經(jīng)接收到事件時(shí)處理并立即返回。

glfwPollEvents();

在連續(xù)繪制時(shí)這是最好的選擇,大多數(shù)游戲也是這樣做的。如果你僅僅在接收到新的輸入時(shí)需要這樣做,那么glfwWaitEvents是個(gè)更好的選擇。它等待至少接收到一個(gè)事件,將線程設(shè)置為休眠狀態(tài),并處理所有接收到的事件。這樣做會(huì)節(jié)省大量的CPU周期,通常用于編輯工具。

總結(jié)Demo

現(xiàn)在,你已經(jīng)知道了如何初始化GLFW、創(chuàng)建窗口并輪詢鍵盤輸入。此時(shí),可以創(chuàng)建一個(gè)簡(jiǎn)單的程序。

#include <GLFW/glfw3.h>
#include <stdlib.h>
#include <stdio.h>
static void error_callback(int error, const char* description)
{fputs(description, stderr);
}
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)glfwSetWindowShouldClose(window, GL_TRUE);
}
int main(void)
{GLFWwindow* window;glfwSetErrorCallback(error_callback);if (!glfwInit())exit(EXIT_FAILURE);window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);if (!window){glfwTerminate();exit(EXIT_FAILURE);}glfwMakeContextCurrent(window);glfwSwapInterval(1);glfwSetKeyCallback(window, key_callback);while (!glfwWindowShouldClose(window)){float ratio;int width, height;glfwGetFramebufferSize(window, &width, &height);ratio = width / (float) height;glViewport(0, 0, width, height);glClear(GL_COLOR_BUFFER_BIT);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glRotatef((float) glfwGetTime() * 50.f, 0.f, 0.f, 1.f);glBegin(GL_TRIANGLES);glColor3f(1.f, 0.f, 0.f);glVertex3f(-0.6f, -0.4f, 0.f);glColor3f(0.f, 1.f, 0.f);glVertex3f(0.6f, -0.4f, 0.f);glColor3f(0.f, 0.f, 1.f);glVertex3f(0.f, 0.6f, 0.f);glEnd();glfwSwapBuffers(window);glfwPollEvents();}glfwDestroyWindow(window);glfwTerminate();exit(EXIT_SUCCESS);
}

?

總結(jié)

以上是生活随笔為你收集整理的GLFW--Getting started的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。