圖形學(xué)知識(shí)要點(diǎn)

01

一個(gè)簡(jiǎn)單的OpenGL程序(內(nèi)部一些常見(jiàn)的參數(shù))

#include <GL/glut.h>
void mydisplay(){
      glClear(GL_COLOR_BUFFER_BIT);
      //glColor3f(1.0f, 0.0f, 0.0f); 
      glBegin(GL_POLYGON);        
        glVertex2f(-0.5, -0.5);        
        glVertex2f(-0.5, 0.5);        
        glVertex2f(0.5, 0.5);        
        glVertex2f(0.5, -0.5);    
    glEnd();
    glFlush(); 
}

int main(int argc, char** argv){
    glutInit(&argc,argv); 
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);      
    glutInitWindowSize(500,500);        
    glutInitWindowPosition(0,0); 
    glutCreateWindow("simple");     
    glutDisplayFunc(mydisplay);  
  
    init(); 
   
    glutMainLoop();  
}

02

glutMainLoop()是一個(gè)在我們所有圖形語(yǔ)言中驅(qū)動(dòng)主要操作的函數(shù). 這個(gè)函數(shù)被無(wú)限期迭代. 在每次迭代中, 它檢查事件隊(duì)列是否為空.

03

坐標(biāo)的轉(zhuǎn)換

04

marching cube算法是一種用來(lái)計(jì)算等值線isocurve(或等值面isosurface)的常用算法,其基本思想是線性插值逼近等值線(或等值面)浩峡,下面以二維為例介紹其計(jì)算過(guò)程可岂。

1、在平面上構(gòu)建m*n的網(wǎng)格翰灾,利用已知的函數(shù)v=f(x,y)求出網(wǎng)格節(jié)點(diǎn)的值缕粹;

2、根據(jù)所要求的值(iso-value)在相鄰節(jié)點(diǎn)之間插值標(biāo)出相應(yīng)點(diǎn)纸淮;

3平斩、根據(jù)第二步所得到的點(diǎn),在同一網(wǎng)格內(nèi)連接成線咽块,即求得相應(yīng)的等值線绘面。

注意:使用marching cube算法一定要有快速計(jì)算網(wǎng)格節(jié)點(diǎn)值的方法,要么用函數(shù)v=f(x,y)侈沪,要么直接硬件測(cè)量得到

05

繪制滑動(dòng)五彩小正方形

#include <GL/gl.h>
#include <GL/glut.h>

/* globals */

GLsizei wh = 500, ww = 500; /* initial window size */
GLfloat size = 3.0;   /* half side length of square */

void drawSquare(int x, int y)
{
      y = wh-y;
      glColor3f( (char) random()%256, (char) random()%256,
      (char) random()%256);
      glBegin(GL_POLYGON);
      glVertex2f(x+size, y+size);
      glVertex2f(x-size, y+size);
      glVertex2f(x-size, y-size);
      glVertex2f(x+size, y-size);
      glEnd();
      glFlush();
}

void myReshape(GLsizei w, GLsizei h)
{
/* adjust clipping box */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity(); 
    glOrtho(0.0, (GLdouble)w, 0.0, (GLdouble)h, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity(); 

/* adjust viewport and clear */
        glViewport(0,0,w,h);
        glClearColor (0.0, 0.0, 0.0, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);
        glFlush();

/* set global size for use by drawing routine */
    ww = w;
    wh = h; 
}

void myinit(void)
{
    glViewport(0,0,ww,wh);

/* Pick 2D clipping window to match size of screen window 
This choice avoids having to scale object coordinates
each time window is resized */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity(); 
    glOrtho(0.0, (GLdouble) ww , 0.0, (GLdouble) wh , -1.0, 1.0);

/* set clear color to black and clear window */
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glFlush();
}

void mouse(int btn, int state, int x, int y)
{
    if(btn==GLUT_RIGHT_BUTTON&state==GLUT_DOWN)   exit();
}

int main(int argc, char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
    glutCreateWindow("square");
    myinit ();

    glutReshapeFunc (myReshape);
    glutMouseFunc (mouse);
    glutMotionFunc(drawSquare);

    glutMainLoop();
}

繪制結(jié)果

06

橡皮筋技術(shù)

基于異或操作的橡皮筋技術(shù)利用了異或邏輯操作的重要性質(zhì):值A(chǔ)與值B兩次異或揭璃,其值仍然為A;異或邏輯運(yùn)算如下圖所示:也就是:

A B A異或B A異或B異或B
1 1 0 1
1 0 1 1
0 1 1 0
0 0 0 0

將這個(gè)性質(zhì)應(yīng)用到像素的顏色上亭罪,則可以利用兩次異或操作恢復(fù)本來(lái)的像素顏色瘦馍。即:將圖形顯示方式設(shè)置為異或模式(如Visual C++中的函數(shù)SetROP2),畫出圖形(此時(shí)圖形是可見(jiàn)的),在異或模式下应役,將相同的圖形再畫一遍情组,這個(gè)圖形將會(huì)從屏幕上消失,而原來(lái)被它覆蓋的部分將恢復(fù)如初扛吞。

07

OpenGL繪制流水線及各個(gè)模塊的功能

  • 頂點(diǎn)處理
    該模塊的兩個(gè)主要功能是執(zhí)行坐標(biāo)變化和計(jì)算每一個(gè)頂點(diǎn)的顏色值
  • 裁剪和圖元組裝
    由于成像系統(tǒng)不可能一次對(duì)整個(gè)場(chǎng)景成像呻惕,我們必須進(jìn)行裁剪荆责;圖元組裝是把頂點(diǎn)組裝成像線段和多邊形這樣的圖元
  • 光柵化
    光柵化模塊必須確定在幀緩存中那些像素位于圖元的內(nèi)部滥比,該模塊對(duì)于每個(gè)圖元輸出一組片元
  • 片元處理
    片元可以看做是攜帶相關(guān)信息的潛在像素,該模塊利用光柵化模塊生成的片元來(lái)更新幀緩存中的像素

08

雙緩存原理及調(diào)用設(shè)置參數(shù)
圖形硬件具有兩個(gè)幀緩存做院,其中一個(gè)幀緩存用于顯示圖像盲泛,我們稱之為前端緩存,另一個(gè)稱之為后端緩存键耕,用于存儲(chǔ)用戶需要顯示的內(nèi)容寺滚。一段完成了場(chǎng)景的繪制,就可以交換前端緩存和后端緩存的內(nèi)容屈雄,然后清除后端緩存并寫入新的數(shù)據(jù)

glSwapBuffer();

gluInitDisplayModel(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

09

OpenGL的坐標(biāo)系:

  • 對(duì)象坐標(biāo)系
  • 世界坐標(biāo)系
  • 照相機(jī)坐標(biāo)系
  • 裁剪坐標(biāo)系
  • 規(guī)范化的設(shè)備坐標(biāo)系
  • 屏幕坐標(biāo)系

10

正交投影規(guī)范化

使用平移和旋轉(zhuǎn)變換將照相機(jī)坐標(biāo)系下的頂點(diǎn)變換到默認(rèn)的視見(jiàn)體內(nèi)部成為投影規(guī)范化村视,使得變形后的對(duì)象的正交投影與原來(lái)想得到的對(duì)象的投影圖相同

投影變換矩陣:

10

phong模型以及改進(jìn)的phong模型

(1)phong反射模型有4個(gè)向量:n,v,l,r。對(duì)于表面上任意一點(diǎn)p酒奶,向量n是p點(diǎn)處的法向量蚁孔,向量v是從p指向觀察者的向量奶赔。向量l是從點(diǎn)p指向點(diǎn)光源的向量。向量r的方向是從沿著向量l方向入射的光線按照反射定律的出射方向杠氢。phong反射模型考慮了光線和材質(zhì)之間的相互作用:環(huán)境光反射站刑,漫反射,鏡面反射

(2)改進(jìn)的phong模型
引入一個(gè)新的向量——半角向量鼻百,半角向量位于觀察向量v和光源向量l這兩者正中間绞旅,在改進(jìn)的phong模型中(又稱blinn-phong模型),利用半角向量計(jì)算鏡面反射分量r

11

phong著色和gouraud著色的特點(diǎn)

(1)gouraud著色:在這種明暗繪制方法中温艇,我們對(duì)公用一個(gè)頂點(diǎn)的多邊形的法向量取平均值因悲,把歸一化后的平均值定義為該頂點(diǎn)的法向量,這種方法可以獲得更平滑的插值效果勺爱,降低March帶的效果

(2)phong著色:在多邊形內(nèi)部對(duì)方向量進(jìn)行插值(gouraud是對(duì)頂點(diǎn)的明暗值進(jìn)行插值)囤捻,為了求出某個(gè)頂點(diǎn)的法向量,我們對(duì)公用該頂點(diǎn)的多邊形的法向量進(jìn)行插值邻寿。

12

梁友棟算法(liang-barsky算法)

13

bresenham算法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蝎土,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绣否,更是在濱河造成了極大的恐慌誊涯,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒜撮,死亡現(xiàn)場(chǎng)離奇詭異暴构,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)段磨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門取逾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人苹支,你說(shuō)我怎么就攤上這事砾隅。” “怎么了债蜜?”我有些...
    開(kāi)封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵晴埂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我寻定,道長(zhǎng)儒洛,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任狼速,我火速辦了婚禮琅锻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己恼蓬,他們只是感情好沫浆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著滚秩,像睡著了一般专执。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上郁油,一...
    開(kāi)封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天本股,我揣著相機(jī)與錄音,去河邊找鬼桐腌。 笑死拄显,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的案站。 我是一名探鬼主播躬审,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蟆盐!你這毒婦竟也來(lái)了承边?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤石挂,失蹤者是張志新(化名)和其女友劉穎博助,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痹愚,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡富岳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拯腮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窖式。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖动壤,靈堂內(nèi)的尸體忽然破棺而出萝喘,到底是詐尸還是另有隱情,我是刑警寧澤狼电,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布蜒灰,位于F島的核電站,受9級(jí)特大地震影響肩碟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凸椿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一削祈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦髓抑、人聲如沸咙崎。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)褪猛。三九已至,卻和暖如春羹饰,著一層夾襖步出監(jiān)牢的瞬間伊滋,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工队秩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留笑旺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓馍资,卻偏偏與公主長(zhǎng)得像筒主,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸟蟹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1 前言 一直想沿著圖像處理這條線建立一套完整的理論知識(shí)體系乌妙,同時(shí)積累實(shí)際應(yīng)用經(jīng)驗(yàn)。因此有了從使用AVFounda...
    RichardJieChen閱讀 5,664評(píng)論 5 12
  • 1 前言 OpenGL渲染3D模型離不開(kāi)空間幾何的數(shù)學(xué)理論知識(shí)建钥,而本篇文章的目的就是對(duì)空間幾何進(jìn)行簡(jiǎn)單的介紹冠胯,并對(duì)...
    RichardJieChen閱讀 6,991評(píng)論 1 11
  • 本文將要介紹圖形渲染管線,它被認(rèn)為是實(shí)時(shí)圖形學(xué)中的核心部分锦针。圖形渲染管線的主要功能是在給定了的虛擬攝像機(jī)荠察,三維的對(duì)...
    SwordMaster閱讀 15,124評(píng)論 0 19
  • 版本記錄 前言 OpenGL 圖形庫(kù)項(xiàng)目中一直也沒(méi)用過(guò),最近也想學(xué)著使用這個(gè)圖形庫(kù)奈搜,感覺(jué)還是很有意思悉盆,也就自然想著...
    刀客傳奇閱讀 6,066評(píng)論 0 2
  • 公司:寧波大發(fā)化纖有限公司 姓名:陸小燕 期數(shù):六項(xiàng)精進(jìn)234期學(xué)員 組號(hào):利他三組 [日精進(jìn)打卡第196天] [...
    牛媽牛媽閱讀 165評(píng)論 0 1