Outline 三角網格資料結構 一般繪圖方式 硬體加速繪圖方式 Display List Vertex Array 序列式 :gldrawarrays 索引式 :gldrawelements Vertex Buffer Object 序列式 索引式

Similar documents
OpenGL Render

Chapter 11 It s all about the pipeline: Faster geometry throughput

C/C++ - 文件IO

untitled

概述

Microsoft PowerPoint - Class5.pptx

CC213

<BABAD3EFD1D4CEC4D1A7D7A8D2B5D1A7C9FABBF1B5C3B8F7C0E0D7CAB8F1B4D3D2B5D6A4CAE9C7E9BFF6CDB3BCC6B1ED2E786C73>

大 綱 最 有 利 標 目 的 及 類 型 最 有 利 標 之 辦 理 方 式 準 用 最 有 利 標 取 最 有 利 標 精 神 最 有 利 標 之 類 型 及 其 相 關 規 定 適 用 最 有 利 標 準 用 最 有 利 標 及 取 最 有 利 標 精 神 作 業 程 序 及 實 務 分 析

Microsoft Word - 2AF63內文.doc

01

<4D F736F F F696E74202D DA578C657B27BA6E6ABD8BF76B5B2BA63A475B57BAABABADEB27AA8EEABD7BB50A7EFB669ABD8C4B32DBDB2A7D3B4AD2E BACDBAE65BCD2A6A15D>

untitled

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C Project 30 C Project 3 60 Project 40

C

Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provided by SUNPLUS TECHNOLO

untitled


JLX

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

3. 給 定 一 整 數 陣 列 a[0] a[1] a[99] 且 a[k]=3k+1, 以 value=100 呼 叫 以 下 兩 函 式, 假 設 函 式 f1 及 f2 之 while 迴 圈 主 體 分 別 執 行 n1 與 n2 次 (i.e, 計 算 if 敘 述 執 行 次 數, 不

Scott Effective C++ C++ C++ Roger Orr OR/2 ISO C++ Effective Modern C++ C++ C++ Scoot 42 Bart Vandewoestyne C++ C++ Scott Effective Modern C++ Damien

摘 要 本 校 多 媒 體 設 計 系 與 上 海 戲 劇 學 院 創 意 學 院 在 多 次 聯 繫 交 流 之 下, 已 簽 署 合 作 備 忘 錄, 積 極 尋 求 兩 校 合 作 教 學 與 共 同 創 作 之 機 會 藉 由 本 系 學 生 作 品 腦 殘 公 寓 入 圍 第 五 屆 中

ACI pdf

c_cpp

Go构建日请求千亿微服务最佳实践的副本

幻灯片 1

untitled

WinMDI 28

PowerPoint 演示文稿

投影片 1

epub 33-8

Autodesk Product Design Suite Standard 系統統需求 典型使用用者和工作流程 Autodesk Product Design Suite Standard 版本為為負責建立非凡凡產品的設計師師和工程師, 提供基本概念設計計和製圖工具, 以取得令人驚驚嘆

The golden pins of the PCI card can be oxidized after months or years

Java

chap02_part2

绘制OpenCascade中的曲线

840 提示 Excel - Excel -- Excel (=) Excel ch0.xlsx H5 =D5+E5+F5+G5 (=) = - Excel 00

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

GV-R7500L Win 98/ 98SE, WinME Win XP Direct X Windows NT WINDO

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Chapter 1 選 用 好 的 燜 燒 罐 選 用 好 的 燜 燒 罐 是 做 好 燜 燒 罐 料 理 最 重 要 的 步 驟, 除 了 須 注 意 使 用 的 材 質 是 否 符 合 食 器 使 用 標 準, 也 須 注 意 燜 燒 罐 的 保 溫 效 果, 才 能 安 心 享 用 燜 燒 罐

Microsoft Word - 3D手册2.doc

高级计算机图形学

untitled


Text 文字输入功能 , 使用者可自行定义文字 高度, 旋转角度 , 行距 , 字间距离 和 倾斜角度。

應用3D/VR虛擬實境技術於踝關節之3D/VR模擬驗證

C/C++ - 数组与指针

C/C++程序设计 - 字符串与格式化输入/输出

Photoshop CS3 影像創造力 基礎講堂 8 學習流程 學習重要性 學習難度 必學指令工具 實作應用範例 創造舞台燈光的漸層繪圖 延伸學習 雜訊與半透明漸層 8-1 Photoshop Photoshop 8 136

Chapter 2 GIGA-BYTE TECHNOLOGY CO., LTD. ("GBT") GBT GBT GBT

GIGA-BYTE TECHNOLOGY CO., LTD. ( GBT ) GBT GBT, GBT

GIGA-BYTE TECHNOLOGY CO., LTD. ("GBT") GBT GBT GBT

Microsoft Word - ACL chapter02-5ed.docx

ROP_bamboofox.key

<4D F736F F D20A7EBBCD0B6B7AABEAAFEA5F3322D3935A67EB2C432A6B8B2C433B2D5C5E3A5DCA564B357BD64AED12E646F63>

四、實務實習課程之實習工作日誌(請貼上掃描檔)

슬라이드 1

C++ 程式設計

桌上型個人電腦採購規格說明表

電腦設備LP _第七組顯示卡規範書

Microsoft Word - LP doc

Microsoft Word - 01.DOC

Move Component Object selection Component selection UV Maya Hotkeys editor Maya USING MAYA POLYGONAL MODELING 55

<ADB6ADB1C25EA8FAA6DB2D4D56432E706466>

JavaIO.PDF

coverage2.ppt

運算子多載 Operator Overloading

桌上型個人電腦採購規格說明表

電腦設備LP 第七組顯示卡規範書

Microsoft Word - 实用案例.doc

obj-c_4.key

(HMI) IO A

chp6.ppt

Internet Explorer Internet Explorer Internet Explorer Internet Explorer

Microsoft Word - ACI chapter00-1ed.docx

Microsoft Word - 桂政发(2016)20号.doc

计算机图形学

Microsoft PowerPoint - cg_ch09_02

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor

; ; 3

高级计算机图形学

Transcription:

Chapter 11 It s all about the pipeline: Faster geometry throughput

Outline 三角網格資料結構 一般繪圖方式 硬體加速繪圖方式 Display List Vertex Array 序列式 :gldrawarrays 索引式 :gldrawelements Vertex Buffer Object 序列式 索引式

三角網格資料結構

三角網格資料結構 struct STriangle { float n[3], a[3], b[3], c[3]; }; STriangle * LoadStlBinary(const char * ppathname, int & ntriangles);

一般繪圖方式

一般繪圖方式 glbegin(gl_triangles); for(int i = 0; i < ntriangles; i++) { } glend(); glnormal3fv(triarray[i].n); glvertex3fv(triarray[i].a); glvertex3fv(triarray[i].b); glvertex3fv(triarray[i].c);

Display List 預先將一連串的繪圖指令編譯並儲存, 在需要使用時再行呼叫

Display List 初始化 Gluint _DisplayList = glgenlists(1); glnewlist(_displaylist, GL_COMPILE); ( 一般繪圖方式或想儲存的 OpenGL 函數 ) glendlist(); 繪圖時 glcalllist(_displaylist); 清除 gldeletelists(_displaylist, 1); Display 個數

無法在 Display List 中儲存的 OpenGL 函數

建立多個 Display List GLuint nlist = glgenlists(3); GLuint A_List, B_List, C_List; A_List = nlist; B_List = nlist + 1; C_List = nlist + 2; glnewlist(a_list,cl_compile);. glendlist(); gldeletelists(nlist, 3);

階層式 Display List glnewlist(a); glcalllist(b); gltranslatef(1.0, 0.0, 0.0); glcalllist(c); gltranslatef(1.0, 0.0, 0.0); glcalllist(c); glendlist(); 不能在 glnewlist/glendlist 之間, 包入 glnewlist/glendlist, 但可以 glcalllist 階層限制為 64, 不過這取決於 OpenGL 的實作, 可調用函式來查看階層上限 glgetintegerv(gl_max_list_nesting, GLint *data);

Vertex Array 將 Vertex 資訊存成陣列, 在需要時利用函式呼叫繪出

Vertex Array 1. 啟用 / 關閉 glenableclintstate(glenum array); GL_VERTEX_ARRAY GL_NORMAL_ARRAY 2. 指定 Array 的數據 glvertexpointer(glint size, GLenum type, GLsizei stride, const GLvoid *pointer); size: 每個頂點的座標數量, 必須為 2 3 或 4 type: 座標的數據類型 (GL_SHORT GL_INT ) stride: 連續的頂點之間的偏移量 pointer: 第一個頂點的第一個座標的地址 3. 彩現 (Render)

Vertex Array - 彩現方式 索引式:能隨機呼叫 glarrayelement gldrawelements glmultidrawelements gldrawrangeelements 序列式:只能依序呼叫 gldrawarrays glmultidrawarrays (頂點數量要等於法向量之數量)

Vertex Array - 索引式 以索引值的陣列來指定物件使用的座標點 不必重複儲存重複的座標點 減少傳遞到顯示卡的記憶體量, 以提高運作效率

Vertex Array - 索引式彩現方式 glenableclientstate(gl_vertex_array); glvertexpointer(2, GL_INT, 0, data); glarrayelement glbegin(gl_triangles) glarrayelement(2); glarrayelement(5); glarrayelement(8); glend(); gldrawelements gldrawelements(mode, count, type, index); glmultidrawelements glmultidrawelements(mode, count, type, index, primcount); glbegin(gl_triangles) glvertex2iv(data+(2*2)); glvertex2iv(data+(5*2)); glvertex2iv(data+(8*2)); glend(); glbegin(mode) for(i=0; i<count; i++) glarrayelement(index[i]); glend(); Cubedx.cpp for(i=0; i<primcount; i++) if(count[i]>0) gldrawelements(mode, count[i], type, index[i]);

Vertex Array 序列式彩現方式 gldrawarrays gldrawarrays(mode, first, count); glmultidrawarrays glbegin(mode) for(i=0; i<count; i++) glarrayelement(first+i); glend(); glmultidrawarrays(mode, first, count, primcount); for(i=0; i<primcount; i++) if(count[i]) gldrawarrays(mode, first[i], count[i]);

Vertex Buffer Object 將主記憶體的資料預先放進顯卡記憶體, 需要繪圖時直接繪圖

Vertex Buffer Object VBO 是 OpenGL 提供給使用者的一個將 vertex data( 包含 position, normal vector, color, etc.) 非即時地上傳到顯示卡記憶體的方法 由於 vertex data 是儲存於顯示卡記憶體, 因此, 相較於其他 render 方式, 具有更高的效能 自 OpenGL 1.5 之後成為標準

VBO Step by step 建立 Buffer Object GLuint _VBO[2]; glgenbuffers(2, _VBO); 綁定 Buffer Object glbindbuffer(glenum target, GLuint buffer); Vertex 資料到 Buffer Object 內 glbufferdata(...); 更新 Buffer Object glbuffersubdata(...); glmapbuffer(...) glunmapbuffer(...) 清除 Buffer Object gldeletebuffers(glsizei n, GLuint *buffer);

VBO Bind Buffer glbindbuffer(glenum target, GLuint buffer); target: GL_ARRAY_BUFFER GL_ELEMENT_ARRAY_BUFFER buffer: 指定將綁定的 Buffer Object ( 如 :_VBO[0]) glbindbuffer 有三個功用 當 buffer 為首次使用之非零 UINT 建立一個新的 Buffer Object, 並將 buffer 分配給此 Buffer Object 當作名稱 當綁定到一個以前建立的 Buffer Object, 設定此 Buffer Object 為 Active 當綁定到一個值為零的 buffer 時,OpenGL 會停止使用 Buffer Object

VBO Buffer Data glbufferdata(glenum target, GLsizeiptr size, const GLvoid *data, GLenum usage) 分配 size 個儲存單位 (byte) 的 OpenGL Device Memory, 用於儲存頂點或索引數據 以前所有與當前綁定對象相關聯的數據都將被刪除 target: GL_ARRAY_BUFFER( 頂點數據 ) GL_ELEMENT_ARRAY_BUFFER( 索引數據 ) GL_PIXEL_UNPACK_BUFFER( 傳遞給 OpenGL 的像素數據 ) GL_PIXEL_PACK_BUFFER( 從 OpenGL 獲取的像素數據 ) size : 儲存相關數據所需的記憶體空間 ( 通常是元素個數 各自儲存長度 ) data: 指向主記憶體中相關數據的指標 ( 用於初始化 Buffer Object) usage: GL_STATIC_DRAW GL_DYNAMIC_READ GL_STREAM_COPY STATIC: 在 VBO 中的資料將不會改變 ( 指定一次多次使用 ) DYNAMIC: 資料將經常改變 ( 反覆指定與使用 ) STREAM: 資料在每個 Frame 都會改變 ( 一次指定一次使用 ) DRAW: 資料送到 GPU 繪出 ( 應用程式 GL) READ: 資料會被讀取到應用程式 (GL 應用程式 ) COPY: 資料會被 DRAW 與 READ(GL GL)

VBO Update Buffer void glbuffersubdata(glenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data); 以 data 所指向的資料替換掉 target 所指向的資料, 從 offset 開始的 size 個 byte void *glmapbuffer(glenum target, GLenum access); GLboolean glunmapbuffer(glenum target); 透過 glmapbuffer 取得 buffer 的指標 針對該 buffer 進行修改 調用 glunmapbuffer 通知 OpenGL 已經完成修改