iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 8
0
自我挑戰組

寫遊戲初體驗系列 第 8

Day 8 [OpenGL] OpenGL intro

  • 分享至 

  • xImage
  •  

前言

之前在學校學過一點點的OpenGL 2(沒錯2020還在教OpenGL2),而SFML本身支援OpenGL,所以打算趁這個機會學習一下比較新的OpenGL,並且用在我的小遊戲上,所以接下來我會用幾天來講一點OpenGl

OpenGL

  • OpenGL定義了一套處理幾何(Geometric primitive)的元件,可以將其轉換成螢幕像素格式(Pixel)的流程。

  • OpenGL規範了每個function該如何執行,以及他們的輸出直。但是每個function的實作將由開發者自己決定,因為OpenGL僅僅是一個規範

    • 實際OpenGL的開發者大多由顯卡場(Nvidia, AMD)撰寫,因此出Bug的話通常要透過更新顯卡來解決問題。
  • 核心模式(Core-profile)與立即渲染模式(Immediate mode)

    • 立即渲染模式(Immediate mode)
      • 早期 OpenGL
      • 容易理解、使用
      • 效率低、靈活性低
      • 已被廢棄 = 不用學習了
    • 核心模式(Core-profile)
      • 主流
      • 靈活性高、效率高
      • 上手比較難
  • OpenGL 支援 擴展(Extension),透過擴展,開發者不必等新的OpenGL規範就可以使用新的渲染特性了。通常若一個擴展非常流行或著有用的話,他就會成為新的規範了。

  • OpenGL 本質上是個狀態機(State Machine),OpenGL 的狀態叫做 上下文(Context)

    • 改變狀態:設定參數、操作 buffer
    • 使用當前 Context 來渲染畫面
  • 一個常見的 OpenGL 程式碼可能長這樣

    • 建立 object (拿到id)
    • 綁定到 Context 上
    • 設定option
    • 綁定 0 代表改回默認
// 創建object
unsigned int objectId = 0;
glGenObject(1, &objectId);
// 綁定至context
glBindObject(GL_WINDOW_TARGET, objectId);
// 設定
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 解綁
glBindObject(GL_WINDOW_TARGET, 0);

目前只是一些大致上的描述,往後會有更多實際的例子

準備開始

先在知道一些OpenGL的相關知識了,明天我們會將OpenGL用在SFML這個框架裡。
不過在此之前還有東西要做。

GLAD

我們知道OpenGL只是一個規範,實作都是由開發商根據特定顯卡實作。由於OpenGL的驅動版本眾多,大多的function必須在run-time的時候查詢。這樣開發者就需要在運行時獲取並保存funciton pointer以便之後使用。取得的方法因平台而異。

Windows會大概像這樣

// function's prototype
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// find function and assign to a function pointer
GL_GENBUFFERS glGenBuffers  = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// now can call
GLuint buffer;
glGenBuffers(1, &buffer);

感覺上複雜且繁瑣。但幸運的是有library簡化此過程,有就是GLAD

GLAD使用的是Web Service,在這裡我們告訴GLAD需要定義的OpenGL版本,並根據此版本加載相關的function

進到此頁面將設定完成之後按Generate,他會提供一個zip文件,解壓縮後我們就可以去include

#include <glad/glad.h> 

上一篇
Day 7 Game Class
下一篇
Day 9 Using OpenGL in SFML
系列文
寫遊戲初體驗30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言