Introduction to OpenGL (2)

Slides:



Advertisements
Similar presentations
第6章 Photoshop 的浮动面板 本章节学生应熟练掌握Photoshop的浮动面板的组成和使用。 教学重点:
Advertisements

概述 6.1 导航器面板 6.2 信息面板 6.3 调色板面板 6.4 色板面板 6.5 样式面板 6.6 历史记录面板
C语言程序设计 主讲教师 :张群燕 电话:
第1单元 操作系统概论 第一节 绪论 操作系统定义.
Loops.
动态网页制作 第1章 HTML语言1.
数学文化课程 “可视化”与“实验化”的教学设计 报告人:靖新 沈阳建筑大学 理学院.
第一章 C语言概述 计算机公共教学部.
“走进三国” 读书汇报会 广州市玉岩中学 李玉明( ).
编译原理上机实习
色彩基本原理.
色彩基本認識 2010 年 9 月 Hsiu-fen Wang
计算机图形学 授课教师:陈荣钦 短号: 单位:数信学院.
第十章 真实感图形绘制 基本概念 简单光照模型 基于简单光照模型的多边形绘制.
Unit 2 Topic 2 What does she look like? Section D 龙岩初级中学 余军.
真实感图形 授课教师: 单位:.
第8章 字元與字串處理 8-1 C語言的字元檢查函數 8-2 C語言的字串 8-3 字串的輸入與輸出 8-4 指標與字串
第六章 三维真实感物体显示技术 虚拟现实(Virtual Reality,简称VR)技术是一种逼真的模拟人在自然环境中视觉、听觉、运动等行为的人机界面技术。其目的是:不仅能够在多维空间仿真建模,而且能够帮助人们获取知识和形成新的概念,Mark Green给出了一个简明的虚拟现实应用系统模型,如图6.1所示。
Unit 2 Topic 2 Section A What does she look like? 恩施市芭蕉侗族乡初级中学 贺丹.
计算机图形学 讲 授:董兰芳 研究方向:科学计算可视化 图形、图像处理 模式识别 中国科学技术大学 视觉计算与可视化实验室
Chapter 1 用VC++撰寫程式 Text book: Ivor Horton.
OpenGL常见问题.
OpenGL (7) 靜宜大學資工系 蔡奇偉 副教授
第3章 變數、資料型別與運算子.
C 程式設計— 指標.
C 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
C 程式設計— 指標 台大資訊工程學系 資訊系統訓練班.
第9章 自訂資料型態 – 結構 9-1 結構資料型態 9-2 結構陣列 9-3 指標與結構 9-4 動態記憶體配置 9-5 聯合資料型態
OpenGL使用简介.
C++ 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
第三章 C++中的C 面向对象程序设计(C++).
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
第3章 變數、常數與資料型態 3-1 C語言的識別字 3-2 變數的宣告與初值 3-3 指定敘述 3-4 C語言的資料型態
第三章 基本觀念 電腦繪圖與動畫 (Computer Graphics & Animation) Object Data Image
第3章 變數、資料型別與運算子 3-1 變數與資料型別的基礎 3-2 變數的命名與宣告 3-3 資料型別 3-4 運算式與運算子
2 数字图像基础 赵国庆 博士 北京师范大学教育技术学院
纹理映射.
第四章 图元的属性 曾智勇 软件学院.
PROGRAM 6 Earth E. Angel.
本章中將會更詳細地考慮有關重複的概念,並且會 介紹for和do…while等兩種用來控制重複的敘述 式。 也將會介紹switch多重選擇敘述式。 我們會討論直接和迅速離開某種控制敘述式的 break敘述式,以及用來跳過重複敘述式本體剩餘 部份的continue敘述式。 本章會討論用來組合控制條件的邏輯運算子,最後.
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
色彩基本認識 2006 年 10 月 Hsiu-fen Wang.
Chapter 5 Attributes of Output Primitives (图元的属性)
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
Module - pyopengl 應用於2d,3d圖形繪製.
OpenGL几何变换程序.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
本节内容 字符与字符串 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C语言程序设计 李祥 QQ:
GLUT 事件處理函式 靜宜大學資管系 蔡奇偉 副教授
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第3章 数据类型、运算符与表达式.
第二章 类型、对象、运算符和表达式.
第二章 基本数据类型 ——数据的表示.
P3M1 PTH/SMT电阻电位器的参数识别与简易测试
PROGRAM 7 SQUARE E. Angel.
OpenGL 基础 计算机科学与技术系.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
挑戰C++程式語言 ──第9章 函數.
#include <iostream.h>
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
交互式计算机图形处理系统 哈尔滨工业大学计算机学院 唐好选 2019年7月27日.
光照模型 计算机科学与技术系.
PROGRAM 1 Simple E. Angel, Interactive Computer Graphics A Top-Down Approach with OpenGL, Third Edition Addison-Wesley Longman, 2003.
變數與資料型態  綠園.
自由曲线与曲面(II) 计算机科学与技术.
Presentation transcript:

Introduction to OpenGL (2) 靜宜大學資工系 蔡奇偉 副教授 2001-2010 Red Book 第二章

大綱 OpenGL 的命名慣例 OpenGL/GLUT hello 程式 清除視窗的內容 設定目前的繪圖顏色 glFlush() 與 glFinish() OpenGL 的基本幾何元件 設定/讀取 OpenGL 的狀態 設定圖形的屬性

OpenGL 的命名慣例 函式名稱以 gl 開頭,而且名稱中每個字的字首使用大寫,如 glClearColor()。 常數名稱全為大寫字母並以 GL 開頭,名稱中每個字用底線字元(_) 隔開,如 GL_COLOR_BUFFER_BIT。 某些函式的字尾暗示參數的個數與型態,如glVertex3f (float x, float y, float z) /* 3 個浮點數 */ glVertex2i (int x, int y) /* 2 個整數 */ glVetex3fv (float *vl) /* 3 個浮點數組成的陣列 */

此外,參數為陣列的函式通常以字母 v 為結尾。 字尾 資料型態 OpenGL 資料型態 b signed char GLbyte s short GLshort i int (or long) GLint, GLsizei f float GLfloat, GLclampf d double GLdouble, GLclampd ub unsigned char GLubyte, GLboolean us unsigned short GLushort ui unsigned int GLuint, GLenum, GLbitfield (or unsigned long) 此外,參數為陣列的函式通常以字母 v 為結尾。

查詢 OpenGL 的版本資訊 const GLubyte *glGetString(GLenum name); GL_VERSION major.minor major.minor.release GL_VENDOR 傳回 OpenGL 硬體的製造廠名稱。

OpenGL/GLUT hello 程式 hello.c 原始碼 GLUT 初始化函式 事件驅動程式 GLUT callback 函式 GLUT mainloop 函式

/* * hello.c * This is a simple, introductory OpenGL program. */ #include <GL/glut.h>

void display(void) { glClear (GL_COLOR_BUFFER_BIT); /* clear all pixels */ /* draw white polygon (rectangle) with corners at * (0.25, 0.25, 0.0) and (0.75, 0.75, 0.0) */ glColor3f (1.0, 1.0, 1.0); glBegin(GL_POLYGON); glVertex3f (0.25, 0.25, 0.0); glVertex3f (0.75, 0.25, 0.0); glVertex3f (0.75, 0.75, 0.0); glVertex3f (0.25, 0.75, 0.0); glEnd(); /* don't wait! * start processing buffered OpenGL routines glFlush (); }

void init (void) { /* select clearing color */ glClearColor (0.0, 0.0, 0.0, 0.0); /* initialize viewing values */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); }

/* * Declare initial window size, position, and display mode * (single buffer and RGBA). Open window with "hello" * in its title bar. Call initialization routines. * Register callback function to display graphics. * Enter main loop and process events. */ int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (250, 250); glutInitWindowPosition (100, 100); glutCreateWindow ("hello"); init (); glutDisplayFunc(display); glutMainLoop(); return 0; /* ANSI C requires main to return int. */ }

GLUT 初始化函式 glutInit (int *argc, char ** argv) 設定啟動 GLUT 所需的初值,然後處理一些指令行的參數(用於 X Window 系統)。呼叫這個函式後才能夠開始呼叫其他的 GLUT 函式。

glutInitDisplayMode (unsigned int mode) 設定顯示的模式。你可以用 bitwise OR(|)的方式來選取以下的模式 : GLUT_RGBA(或 GLUT_RGB), GLUT_INDEX GLUT_SINGLE, GLUT_DOUBLE GLUT_ACCUM GLUT_ALPHA GLUT_DEPTH GLUT_STENCIL GLUT_LUMINANCE

glutInitWindowSize (int width, int height) 設定視窗的初始大小為 width x height 像素。 glutInitWindowPosition (int x, int y) 設定視窗在螢幕上的初始位置為 (x, y) 像素。 glutCreateWindow (char *name) 建立和顯示最上層的視窗並把視窗的標題設成 name。

事件驅動程式 目前流行的視窗系統(如 X Window、MS Windows)是採用事件驅動(event-driven)的模式。視窗系統必須處理許多不同的事件(event)— 如:鍵盤輸入、滑鼠移動、壓下滑鼠按鍵、放開滑鼠按鍵等等使用者的動作,以及視窗遮蓋、視窗浮現等等螢幕狀態的改變。這些事件依序地擺放在所謂的事件佇列(event queue)中,然後用循覆的方式依序處理(稱為事件迴路(event loop))。我們以下圖說明之:

front rear event queue 加入新事件 取出下一個事件 event loop 判斷是何事件 呼叫該事件的 處理函式

GLUT callback 函式 GLUT 利用 callback 函式的機制來註冊事件處理函式。GLUT 提供了一些函式來設定事件處理函式。 glutDisplayFunc (void (*func)(void)) 設定 func 為處理視窗內容變動事件的函式。我們必須把所有繪製視窗內容的程式碼寫在函式 func 之中。

glutReshapeFunc (void (*func)(int w, int h)) 設定 func 為處理視窗大小變動事件的函式。參數 w 和 h 是視窗的新寬度與新高度。 glutKeyboardFunc (void (*func)(unsigned char key, int x, int y)) 設定 func 為處理鍵盤事件的函式。參數 key 是按鍵的 ASCII 碼,參數 (x, y) 是按鍵時滑鼠所在的座標。 glutMouseFunc (void (*func)(int button, int x, int y)) 設定 func 為處理滑鼠按鍵事件的函式。參數 button 是所按下或放開的滑鼠鍵,參數 (x, y) 是按鍵時滑鼠所在的座標。

glutMotionFunc (void (*func)(int x, int y)) 設定 func 為處理按住滑鼠鍵並移動滑鼠事件的函式。參數 x 和 y 是滑鼠目前所在的座標。 glutPassiveMotionFunc (void (*func)(int x, int y)) 設定 func 為處理滑鼠移動事件(未按下滑鼠鍵)的函式。參數 x 和 y 是滑鼠目前所在的座標。 glutIdleFunc (void (*func)(void)) 設定 func 為處理「空事件(即無任何事件發生)」的函式。

glutTimerFunc (insigned int msec,. void ( glutTimerFunc (insigned int msec, void (*func)(int value ), int value ) 設定 func 為處理定時器事件的函式。參數 msec 是啟動定時器的間隔時間,其單位是毫秒(千分之一秒)。系統會每隔 msec 毫秒自動呼叫函式 func,並以glutTimerFunc 第三個參數 value 的值為其參數值。

void glutMainLoop (void) 在程式中你應該只呼叫glutMainLoop 函式一次來進入事件迴圈。這個函式的責任是不斷地檢驗事件的種類,然後呼叫你所指定的事件處理 callback 函式。此外,這個函式本身是一個無限迴圈,無法結束執行而回到主函式。

清除視窗的內容 glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) 設定清除的顏色。各顏色的成份值必須介於 0.0 和 1.0 之間。值愈小表示成份愈少。所以 (0.0, 0.0, 0.0, 0.0) 代表黑色、 (1.0, 1.0, 1.0, 0.0) 代表白色、 (1.0, 0.0, 0.0, 0.0)代表紅色、…、等等。第四個參數 alpha 用來設定透明度。

glClear (GLbitfield mask) 用目前的清除值來清除參數 mask 所選定的緩衝區。以下的緩衝區可以用 bitwise OR 的方式來選取: GL_COLOR_BUFFER_BIT (glClearColor) GL_DEPTH_BUFFER_BIT (glClearDepth) GL_ACCUM_BUFFER_BIT (glClearAccum) GL_STENCIL_BUFFER_BIT (glClearStencil) 註:不同的緩衝區需要用不同的函式(上表的右方)來設定清除值。

範例: glClearColor(0.0, 0.0, 0.0, 0.0); glClearDepth(1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

設定目前的繪圖顏色 OpenGL 的繪圖函式並不需要指定顏色,而是利用目前所設定的繪圖顏色。目前的繪圖顏色是由 glColor*() 這一類的函式來指定,如: glColor3f (GLfloat red, GLfloat green, GLfloat blue) glColor4f (GLfloat red, GLfloat green, GLfloat blue , GLfloat alpha) glColor3fv(GLfloat *color_array) /* color_array has 3 elements */

常見的顏色值 color name Red Green Blue black 0.0 red 1.0 green yellow blue magenta cyan dark gray 0.25 light gray 0.75 brown 0.6 0.4 0.12 pumpkin orange 0.98 0.625 pastel pink 0.04 0.7 Barney purple white

glFlush() 和 glFinish() glFlush() 函式和 glFinish() 函式都會要求立刻執行之前所下達的 OpenGL 指令。兩者不同的地方在於: glFlush() 要求後就結束函式的執行,而 glFinish() 必須等到這些指令都完成後,才會結束函式的執行。 透過網路來執行的 OpenGL 程式可以運用這兩個函式來增進執行的效率。

OpenGL 的基本幾何元件 Vertices(端點) 由端點組成的基本圖形

Vertices(端點) OpenGL 的幾何圖形都是由端點組成。你可以用 glVertex*() 指令來設定端點的位置: glVertex{234}{sifd}[v] (TYPE coords); 例如: glVertex2s(2, 3); glVertex3d(0.0, 0.0, 3.14159); glVertex4f(2.3, 1.2, 3.1, 2.0); GLdouble dvect[] = {1.0, 2.0, 3.0}; glVertex3dv(dvect);

由端點組成的基本圖形 我們可以用下面的結構來繪製 OpenGL 的基本圖形: glBegin(type); /* 一連串的 glVertex*() 的呼叫 */ glEnd(); 其中 glBegin 函式的參數 type 用來指定所需的圖形,它的可能值與相對的圖形如底下幾頁所示。

GL_POINTS GL_LINES GL_LINE_STRIP GL_LINE_LOOP v0 v2 v4 v1 v3 v5 v0 v2

GL_TRIANGLES GL_QUADS GL_QUADS_STRIP GL_POLYGON v0 v2 v4 v1 v3 v5 v0 GL_TRIANGLE_STRIP v1 v2 v4 v0 v3 GL_TRIANGLE_FAN v0 v2 v4 v1 v3 v5 GL_QUADS v6 v7 v0 v2 v4 v1 v3 v5 GL_QUADS_STRIP v7 v6 v0 v5 v4 v1 v2 v3 GL_POLYGON

glBegin() 和 glEnd() 之間只可以擺下列的 OpenGL 指令: 指令名稱 用途 glVertex*() 設定端點的座標 glColor*() 設定目前的繪圖顏色 glIndex*() 設定目前的繪圖索引色 glNormal*() 設定端點的法向量 glTexCoord*() 設定貼圖座標 glMultiTexCoord*ARB() 設定多重貼圖座標 glEdgeFlag*() 控制端線的繪製方式 glMaterial*() 設定材質的屬性 glArrayElement() 取出端點陣列的資料 glEvalCoord*(), glEvalPoint*() 産生座標值 glCallList(), glCallLists() 執行 display list(s)

設定/讀取 OpenGL 的狀態 OpenGL 用一些內部的狀態變數(state variables)來開啟或關閉若干的高級高能。 void glEnable (GLenum cap) 開啟參數 cap 所代表的功能。 void glDisable (GLenum cap) 關閉參數 cap 所代表的功能。 GLboolean glIsEnable (GLenum cap) 檢驗 cap 所代表的功能是否已經開啟。

若要取出狀態變數的值,我們可以依據其資料型態使用下列適當的函式: void glGetBooleanv (Glenum pname, GLboolean *params) void glGetIntegerv (Glenum pname, GLint *params) void glGetFloatv (Glenum pname, GLfloat *params) void glGetDoublev (Glenum pname, GLdouble *params) void glGetPointerv (Glenum pname, GLvoid *params) 其中的第一個參數是狀態變數的符號名稱,如 GL_CURRENT_COLOR 代表儲存目前繪圖顏色的狀態變數。所以, GLint params[4]; glGetIntegerv (GL_CURRENT_COLOR, params); 把目前的繪圖顏色取出存放在陣列 params 中。

設定圖形的屬性 glPointSize() glLineWidth() glLineStipple()

void glPointSize (GLfloat size) default 設定端點的像素大小(預設值是 1.0)。參數 size 不可以代入 0.0。端點有兩種顯示形狀:在預設的情況下, size 先被四捨五入成整數 n,然後端點被畫成 n  n 個像素的方點。若啟動平滑功能(antialiasing)的話, size 不會被四捨五入,而且端點被畫成近似圓的點。 antialiasing

啟動平滑繪點的功能: glEnable(GL_POINT_SMOOTH); 你可以用下列參數代入函式 glGetFloatv() 及來查詢 OpneGL 系統的能力: GL_ALIASED_POINT_SIZE_RANGE 點大小的允許範圍 GL_SMOOTH_POINT_SIZE_RANGE 平滑點大小的允許範圍 GL_SMOOTH_POINT_SIZE_GRANULARITY 平滑點大小的精確度

glLineWidth(GLfloat width) 設定線段的寛度(預設值是 1.0 個像素)。同端點一樣,反鋸齒的平滑功能是否啟動會影響到線段的繪製方式。在預設的情況下, width 先被四捨五入成整數 n。斜率小於 1 的線,垂直厚度設為 n 個像素,斜率大於 1 的線,則水平厚度設為 n 個像素。若啟動平滑功能,則 width 不會被四捨五入成整數 n,同時線段的周圍用較暗的像素來達成平滑的效果。

平滑 line width = 2 非平滑 line width = 2

啟動平滑繪線的功能: glEnable(GL_LINE_SMOOTH); 你可以用下列參數代入函式 glGetFloatv() 及來查詢 OpneGL 系統的能力: GL_ALIASED_LINE_WIDTH_RANGE 線寛度大小的允許範圍 GL_SMOOTH_LINE_WIDTH_RANGE 平滑線寛度的允許範圍 GL_SMOOTH_LINE_WIDTH_GRANULARITY 平滑線寛度的精確度

glLineStipple(GLint factor, GLushort pattern) 這個函式可用來設定線段的樣式。使用這個函式之前,你必須呼叫 glEnable(GL_LINE_STIPPLE) 來啟動這個功能。參數 pattern 是一個 16-bit 的整數,用來定義線段的樣式,其中的 bits 由右至左地檢視,若為 1,則表示要畫點,若為 0 的話,則表示不要畫點。參數 factor 控制樣式的放大倍數。 Pattern 十六進位 factor 樣式 0000000011111111 0x00FF 1 0000000011111111 0x00FF 2 0000110000001111 0x0C0F 1 1010101010101010 0xAAAA 1