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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

基于GLFW的OpenGL学习001_艾孜尔江笔记

發布時間:2024/1/8 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于GLFW的OpenGL学习001_艾孜尔江笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • OpenGL中一個對象是指一些選項的集合,它代表OpenGL狀態的一個子集。比如,我們可以用一個對象來代表繪圖窗口的設置,之后我們就可以設置它的大小、支持的顏色位數等等。可以把對象看做一個C風格的結構體(Struct):
  • struct object_name {float option1;int option2;char[] name; };
  • 使用一個對象時,通常看起來像如下一樣(把OpenGL上下文看作一個大的結構體):
  • // OpenGL的狀態 struct OpenGL_Context {...object* object_Window_Target;... }; // 創建對象 unsigned int objectId = 0; glGenObject(1, &objectId); // 綁定對象至上下文 glBindObject(GL_WINDOW_TARGET, objectId); // 設置當前綁定到 GL_WINDOW_TARGET 的對象的一些選項 glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800); glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600); // 將上下文對象設回默認 glBindObject(GL_WINDOW_TARGET, 0);

    這一小段代碼展現了你以后使用OpenGL時常見的工作流。我們首先創建一個對象,然后用一個id保存它的引用(實際數據被儲存在后臺)。然后我們將對象綁定至上下文的目標位置(例子中窗口對象目標的位置被定義成GL_WINDOW_TARGET)。接下來我們設置窗口的選項。最后我們將目標位置的對象id設回0,解綁這個對象。設置的選項將被保存在objectId所引用的對象中,一旦我們重新綁定這個對象到GL_WINDOW_TARGET位置,這些選項就會重新生效。

  • 必須告訴OpenGL渲染窗口的尺寸大小,即視口(Viewport),這樣OpenGL才只能知道怎樣根據窗口大小顯示數據和坐標。我們可以通過調用glViewport函數來設置窗口的維度(Dimension):
  • glViewport(0, 0, 800, 600);

    glViewport函數前兩個參數控制窗口左下角的位置。第三個和第四個參數控制渲染窗口的寬度和高度(像素)。

  • 添加一個while循環,我們可以把它稱之為渲染循環(Render Loop),它能在我們讓GLFW退出前一直保持運行。下面幾行的代碼就實現了一個簡單的渲染循環:
  • while(!glfwWindowShouldClose(window)) {glfwSwapBuffers(window);glfwPollEvents(); }

    glfwWindowShouldClose函數在我們每次循環的開始前檢查一次GLFW是否被要求退出,如果是的話該函數返回true然后渲染循環便結束了,之后為我們就可以關閉應用程序了。
    glfwPollEvents函數檢查有沒有觸發什么事件(比如鍵盤輸入、鼠標移動等)、更新窗口狀態,并調用對應的回調函數(可以通過回調方法手動設置)。
    glfwSwapBuffers函數會交換顏色緩沖(它是一個儲存著GLFW窗口每一個像素顏色值的大緩沖),它在這一迭代中被用來繪制,并且將會作為輸出顯示在屏幕上。

  • 雙緩沖(Double Buffer): 前緩沖保存著最終輸出的圖像,它會在屏幕上顯示;而所有的的渲染指令都會在后緩沖上繪制。當所有的渲染指令執行完畢后,我們交換(Swap)前緩沖和后緩沖,這樣圖像就立即呈顯出來,之前提到的不真實感就消除了。
  • 當渲染循環結束后我們需要正確釋放/刪除之前的分配的所有資源
  • glfwTerminate(); return 0;
  • 使用GLFW的glfwGetKey函數,它需要一個窗口以及一個按鍵作為輸入。這個函數將會返回這個按鍵是否正在被按下。我們將創建一個processInput函數來讓所有的輸入代碼保持整潔。
  • void processInput(GLFWwindow *window) {if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true); }

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

    我們接下來在渲染循環的每一個迭代中調用processInput:

    while (!glfwWindowShouldClose(window)) {processInput(window);glfwSwapBuffers(window);glfwPollEvents(); }

    這就給我們一個非常簡單的方式來檢測特定的鍵是否被按下,并在每一幀做出處理。

  • 通過調用glClear函數來清空屏幕的顏色緩沖,它接受一個緩沖位(Buffer Bit)來指定要清空的緩沖,可能的緩沖位有GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT。[在每個新的渲染迭代開始的時候我們總是希望清屏,否則我們仍能看見上一次迭代的渲染結果。]

  • 把所有的渲染(Rendering)操作放到渲染循環中:

  • // 渲染循環 while(!glfwWindowShouldClose(window)) {// 輸入processInput(window);// 渲染指令...// 檢查并調用事件,交換緩沖glfwPollEvents();glfwSwapBuffers(window); }
  • glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);

    除了glClear之外,我們還調用了glClearColor來設置清空屏幕所用的顏色。當調用glClear函數,清除顏色緩沖之后,整個顏色緩沖都會被填充為glClearColor里所設置的顏色。在這里,我們將屏幕設置為了類似黑板的深藍綠色。
    glClearColor函數是一個狀態設置函數,而glClear函數則是一個狀態使用的函數,它使用了當前的狀態來獲取應該清除為的顏色。

  • 渲染類型:(圖元)GL_POINTS、GL_TRIANGLES、GL_LINE_STRIP。
  • 顏色每個分量的強度設置在0.0到1.0之間:
  • FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);

    四個分量分別是他們的RGB值和Alpha值。

    2019年10月2日——艾孜爾江筆記

    總結

    以上是生活随笔為你收集整理的基于GLFW的OpenGL学习001_艾孜尔江笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

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