NVIDIA Variable Rate Shading

「Variable Rate Shading」(VRS)這項技術(官網),是 NVIDIA 在推出 Turing GPU 架構時(2018 的事了),針對 VR 的需求推出的一項新功能。

這項技術的基本概念,主要就是透過局部性地降低 rasterization 階段的解析度,來減少 Pixel Shader(Fragment Shader)的計算量,藉此達到加速的目的。

下面就是他的基本流程:

閱讀更多»

Qt OpenGL Font 的使用限制

這篇是之前《使用 QGraphicsScene 繪製 widget、產生 OpenGL Texture》和《使用 QGraphicsScene 繪製 widget、產生 OpenGL Texture:續》這兩篇的延伸,主要是針對 Qt OpenGL 裡面,字型的問題做一些研究紀錄。

老實說,最初一直以為 Qt 應該都處理掉了,應該可以一下就弄完,結果沒想到牽扯的問題很多,一堆問題還是無解…

首先,這邊最基本的需求,就是使用 QOpenGLPaintDevice,透過 QGraphicsScene 把 Qt 的圖形介面(QWidget)以 offscreen 的形式、畫成一個 OpenGL Texture。

而現在碰到的主要問題,則是兩個部分:

  • 文字大小超過一定程度,會變成黑框
  • 部分地方的繪製效果不一致
  • High DPI 設定造成顯示結果與預期不同

閱讀更多»

使用 QGraphicsScene 繪製 widget、產生 OpenGL Texture:續

這篇基本上是之前《使用 QGraphicsScene 繪製 widget、產生 OpenGL Texture》一文的後續。

在當時,Heresy 有提過,如果真的用 QOpenGLPaintDevice 來給 QGraphicsScene 繪製到 Frame Buffer Object 上的話,會造成文字的破碎、無法識別的狀況;而 Heresy 當時的解法,是暫時放棄 OpenGL 繪圖,而讓 QGraphicsScene 先畫到 QImage 上(raster)、然後再把它傳到顯示當作為 OpenGL 的 texture。

理論上,這個方法的確是可行的,但是實際上,在後來使用的時候,卻發現:

當介面稍微多一些東西的時候,用 QGraphicsScene 把圖形介面畫在 QImage 上要花超過 150ms… orz

如果是一般視窗環境,或許還算勉強可以接受,但是在 VR 環境下,這樣連 10FPS 都到不了的速度,是完全無法被當作「堪用」的…

閱讀更多»

Qt OpenGL 的一些使用問題

這一篇,算是自己點單紀錄一下,目前使用 Qt 5 來開發 OpenGL 程式時,碰到的一些問題吧…

基本上,Heresy 對於整個 Qt OpenGL 的使用架構不算非常熟,也是邊寫邊摸,所以本文也不盡然正確,很大的機會應該有不少地方是使用錯誤…不過,基本上就算記錄下來,給自己以後參考用了。

首先,Qt 5 基本上應該算是已經深度整合 OpenGL/OpenGL ES 了~預設下載預先編譯好的版本,都有支援 OpenGL、而不用另外自行編譯了。

而他的主要文件,應該可以從《OpenGL and OpenGL ES Integration》這邊開始看。

閱讀更多»

使用 QGraphicsScene 繪製 widget、產生 OpenGL Texture

從去年開始,Heresy 就有在試著用 Qt 搭配 OpenVR,開發支援 SteamVR 的虛擬實境的程式。當時在寫的時候,一部分是參考 GitHub 上的「QVRViewer」這個專案(連結),也算是成功地把 Qt OpenGL(官網)的框架,成功地和 OpenVR 整合到一定程度了。

而接下來,則是希望可以在虛擬實境的環境裡面,顯示圖形介面的部分。這部分,則是參考了 OpenVR 的「helloworldoverlay」這個範例(連結);在它裡面的「openvroverlaycontroller.cpp」這個檔案(連結)就有把 Qt 的 Widget 繪製成 OpenGL Texture、並手動傳送滑鼠事件進去的操作方法。

首先,他這邊的概念,就是透過 Qt Graphics View Framework 的框架,來繪製 QWidget;而和一般使用 QGraphicsScene 時不同的地方,是這邊不會去使用 QGraphicsView 來做呈現,而是特別去設定要使用的 QPainter,來決定要畫到哪裡。

閱讀更多»

OpenVR 搭配 OpenGL 的顯示方法

在今年五月的時候,Heresy 有寫了一篇《HTC Vive 開發方案:OpenVR 簡介》,大概介紹過 OpenVR(GitHub)粗略的架構了;當時 OpenVR 的版本還是 1.0.0,Heresy 主要是針對他的幾個模組的功用,做簡單的說明,並沒有認真地去講程式到底怎麼寫。

後來,其實 Heresy 算是有真得下去寫他的程式,也根據自己的需求、搭配 freeglut 重寫出一些小範例(GitHub)了。

到現在過了超過半年,OpenVR 也更新到 1.0.4 了,和 Heresy 剛開始研究時相比,不但 API 有做了一些修改,「hellovr_opengl」的程式內容,也做了相當程度的調整。

而這篇,就以「hellovr_opengl」這個官方範例,來大概紀錄一下怎麼寫 OpenVR 的 OpenGL 程式吧。

閱讀更多»

可以開始用 Vulkan 寫 3D 程式了!Vulkan 1.0 正式推出

在去年 GDC2015 的時候,Khronos 就已經發表了將使用新的 3D 圖形 API「Vulkan 」來取代現有的 OpenGL 了~在當時也有提過了,OpenGL 和 Vulkan 上會是完全不相容的 API。(參考《Khronos GDC 2015 新消息:Vulkan 與 OpenCL 2.1》)

只是在發表了之後,其實這段期間都沒什麼大消息,而一般的開發者由於欠缺開發環境,也沒有辦法真的開始寫 Vulkan 的程式…

不過在前幾天,Khronos 終於正式釋出 Vulkan 1.0 的規格了~而同時,桌面電腦的三大圖形晶片廠 NVIDIA、AMD、Intel 也都推出了支援 Vulkan 的驅動程式了!再加上 LunarG 的 Vulkan SDK 也已經可以下載了,所以這也代表一般開發者已經可以開始試著玩 Vulkan 了~

下面就是一些主要的連結:

閱讀更多»

Khronos 發布 3D 場景、模型用的格式:glTF

基本上,目前在 3D 電腦圖學這個領域裡面,並沒有一個真正通用的檔案格式;以 3D 模型來說,格式可以說是有千百種,包括了常見的 OBJ、STL、X3D…等等,各家都有個家的規格。而這一點,也導致了在開發程式、以及檔案交換上的困難。

雖然 Khronos 之前也有訂製「COLLADA」這個標準(官網),但是他並沒有針對傳輸以及讀取做最佳化,所以對目前的 WebGL 來說或許已經不太適用了。(也很久沒更新了…)

而為了解決這個問題,Khronos 推出一個新的標準、glTF(GL Transmission Format),希望可以成為「JPEG for 3D」;而他的設計目標,就是希望可以提供一個有效率、並可以方便傳輸的檔案格式、定義,讓程式開發者,可以方便地儲存、讀取 3D 的場景設定、以及模型。

官方的公告是《Khronos Finalizes glTF 1.0 Specification for Efficient, Interoperable Transmission of 3D Scenes and Models》,官網則是:

https://www.khronos.org/gltf/

閱讀更多»

K4W v2 C++ Part 6:使用 OpenGL 繪製場景

之前在《簡單的深度讀取方法》、《使用 OpenCV 顯示深度影像》、《讀取彩色影像與紅外線影像》和《讀取人體位置(Body Index)》這幾篇文章,已經大概解釋過了怎麼去讀取 Kinect for Windows v2 的影像資料了。

而在《簡單的去背程式》一文,則是有大概介紹過 ICoordinateMapper 這個介面,說明怎麼透過他提供的函式,來做不同座標系統的轉換了。不過當時 Heresy 只有說明「彩色空間座標系統」(Color Space)和「深度空間座標系統」(Depth Space)做說明而已,針對「攝影機空間座標系統」(Camera Space) ,基本上是草草帶過。

接下來這篇,就來比較認真一點地介紹攝影機空間座標系統、並把 Kinect 的資料、透過 OpenGL 用 3D 的形式畫出來吧~

閱讀更多»