球消隱演算法
1. 後向面檢測(Back-face detection)在消隱演算法中起什麼作用 如題
如果是Back-face,就不需要顯示了.
舉個例子吧,如果是個立方體,任何時候,你只能看到三個面,另外三個面通過Back-face剔除.
2. 下面關於深度緩存消隱演算法的論斷哪一條不正確
演算法(Algorithm)是指完成一個任務所需要的具體步驟和方法。也就是說給定初始狀態或輸入數據,能夠得出所要求或期望的終止狀態或輸出數據。
演算法常常含有重復的步驟和一些比較或邏輯判斷。不同的演算法可能用不同的時間、空間或效率來完成同樣的任務。一個演算法的優劣可以用空間復雜度與時間復雜度來衡量。
憑我的直覺,選c好啦!
3. 常見的提高消隱演算法效率的方法有哪些
提高消隱演算法效率的常見方法(利用連貫性,將透視投影轉換成平行投影,包圍盒技術,背面剔除,空間分割技術,物體分層表示)
選擇好的演算法, 小心地實現, 同時確定程序不做額外的事。例如, 即使世界上最優化的字元復制循環也比不上不用復制。
當擔心效率時, 要保持幾樣事情在視野中, 這很重要。首先, 雖然效率是個非常流行的話題, 它並不總是象人們想的那樣重要。大多數程序的大多數代碼並不是時間緊要的。當代碼不是時間緊要時, 通常把代碼寫得清楚和可移植比達到最大效率更重要。記住, 電腦運行得非常非常快, 那些看起來 「低效率」 的代碼, 也許可以編譯得比較有效率, 而運行起來也沒有明顯的延時。
試圖預知程序的 「熱點」 是個非常困難的事。當要關心效率時, 使用 profiling軟體來確定程序中需要得到關注的地方。通常, 實際計算時間都被外圍任務佔用了 (例如 I/O 或內存的分配), 可以通過使用緩沖和超高速緩存來提高速度。
即使對於時間緊要的代碼, 最無效的優化技巧是忙亂於代碼細節。許多常被建議的 「有效的代碼技巧」, 即使是很簡單的編譯器也會自動完成 (例如, 用移位運算符代替二的冪次方乘)。非常多的手動優化有可能是代碼變得笨重而使效率反而低下了, 同時幾乎不可移植。例如, 也許可以在某台機器上提了速, 但在另一台機器上去變慢了。任何情況下, 修整代碼通常最多得到線性信能提高; 更好的演算法可以得到更好的回報。
4. 計算機圖形學 繪制一個不停轉動的彩色立體球,可以繞著任意方向旋轉
Direct3D 好簡單就可以完成。安裝Direct的時候有代碼示例的,都是VC的
5. 數學:設計一個演算法,找出6個球中最重的球.
1:任取兩球放天平兩端
2:如果平衡則取下兩球,再從剩餘球中取兩球放天平兩端;如果不平衡,則取下較輕那端的球,再從餘下的球中取一個球放上
3:如果剩餘球數為0,則較重那端的球就是所求;如果不為0,則轉到2.
6. 1080p圖像消隱區大小怎麼計算
消隱演算法。
當我們觀察空間任何一個不透明的物體時,只能看到該物體朝向我們的那些表面,其餘的表面由於被物體所遮擋我們看不到。若把可見的和不可見的線都畫出來,對視覺會造成多義性。會有後邊兩種情況要消除二義性,就必須在繪制時消除被遮擋的不可見的線或面,習慣上稱作消除隱藏線和隱藏面,簡稱為消隱。消隱不僅與消隱對象有關,還與觀察者的位置有關。
7. OPENGL是什麼
OpenGL三維圖形標準是由AT&T公司UNIX軟體實驗室、IBM
、DEC、SUN、HP、Microsoft和SGI等多家公司在GL圖形庫標準的基礎
上聯合推出的開放式圖形庫,它使在微機上實現三維真實
感圖形的生成與顯示成為可能。由於OpenGL是開放的圖形標
准,用戶原先在UNIX下開發的OpenGL圖形軟體很容易移植到微
機上的WindowsNT/95上。筆者在VisualC++4.1(以下簡稱VC)集
成環境下,開發了基於OpenGL的三維真實感圖形應用程序,現
介紹如下。
微機上的OpenGL開發環境
基於OpenGL標准開發的應用程序必須運行於32位Windows
平台下,如WindowsNT或Windows95環境;而且運行時還需有動態
鏈接庫OpenGL32.DLL、Glu32.DLL,這兩個文件在安裝WindowsNT時已
自動裝載到C:\WINNT\SYSTEM32目錄下(這里假定用戶將WindowsNT
安裝在C盤上);而對於使用Windows95平台的用戶,則需手工將
兩個動態庫復制到Windows95目錄的SYSTEM子目錄中。安裝了
WindowsNT/95和VC4.1後,用戶就具備了基於OpenGL開發三維圖
形軟體的基本條件。
OpenGL程序設計的基本步驟
1.OpenGL在WindowsNT下的運行機制
OpenGL工作在客戶機/伺服器模式下,當客戶方(即基
於OpenGL標准開發的應用程序)向伺服器(OpenGL核心機制)發出
命令時,由伺服器負責解釋這些命令。通常情況下,客戶方
和伺服器是運行在同一台微機上的。由於OpenGL的運行機制
是客戶機/伺服器模式,這使得用戶能夠十分方便地在網
絡環境下使用OpenGL,OpenGL在WindowsNT上的這種實現方式通常
稱為網路透明性。
OpenGL的圖形庫函數封裝在動態鏈接庫OpenGL32.DLL中,
客戶機中的所有OpenGL函數調用,都被傳送到伺服器上,由
WinSrv.DLL實現功能,再將經過處理的指令發送到Win32設備驅
動介面(DDI),從而實現在計算機屏幕上產生圖像。
若使用OpenGL圖形加速卡,則上述機制中將添加兩個
驅動器:OpenGL可裝載客戶模塊(OpenGLICD)將安裝在客戶端;硬
件指定DDI將安裝在伺服器端,與WinDDI同一級別。
2.OpenGL的庫函數
開發基於OpenGL的應用程序,必須先了解OpenGL的庫函
數。OpenGL函數命令方式十分有規律,每個庫函數均有前綴gl
、glu、aux,分別表示該函數屬於OpenGL基本庫、實用庫或輔助
庫。WindowsNT下的OpenGL包含了100多個核心函數,均以gl作為前
綴,同時還支持另外四類函數:
OpenGL實用庫函數:43個,以glu作為前綴;
OpenGL輔助庫函數:31個,以aux作為前綴;
Windows專用庫函數(WGL):6個,以wgl作為前綴;
Win32API函數(WGL):5個,無前綴。
OpenGL的115個核心函數提供了最基本的功能,可以實
現三維建模、建立光照模型、反走樣、紋理映射等;OpenGL實
用庫函數在核心函數的上一層,這類函數提供了簡單的調
用方法,其實質是調用核心函數,目的是減輕開發者的編程
工作量;OpenGL輔助庫函數是一些特殊的函數,可以供初學者
熟悉OpenGL的編程機制,然而使用輔助庫函數的應用程序只
能在Win32環境中使用,可移植性較差,所以開發者應盡量避
免使用輔助庫函數;Windows專用庫函數(WGL)主要針對WindowsNT
/95環境的OpenGL函數調用;Win32API函數用於處理像素存儲格
式、雙緩存等函數調用。
3.VC環境下基於OpenGL的編程步驟
下面介紹在VC環境中建立基於Opeetting菜單選項,在Link欄的Lib輸入域中
添加openg132.lib、glu32.lib,若需使用OpenGL的輔助庫函數,則還
需添加glaux.lib。
(3)選擇View/ClassWizard菜單選項,打開MFC對話框,在
ClassName欄中選擇CMyTestView類,進行以下操作:
選擇WM_CREATE消息,滑鼠單擊EditCode,將OpenGL初始化代碼
添加到OnCreate()函數中:
/*定義像素存儲格式*/
PIXELFORMATDESCRIPTORpfd=
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL,
PFD_TYPE_RGBA,
24,
0,0,0,0,0,0,
0,0,0,0,0,0,0
32,
0,0,
PFD_MAIN_PLANE,
0,
0,0,0,
}
CCLientdc(this);
intpixelFormat=ChoosePixelFormat(dc.m_hDC,&pfd);
BOOLsuccess=SetPixelFormat(dc.m_hDC,pixelFormat,&pfd);
m_hRC=wglCreateContext(dc.m_hDC);
選擇WM_DESTORY消息,在OnDestory()中添加以下代碼:
wglDeleteContext(m_hRC);
在MyTestView.cpp中,將以下代碼添加到PreCreateWindows()函數中:
cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
OpenGL只對WS_CLIPCHILDREN|WS_CLIPSIBLINGS類型窗口有效;
在MyTestView.cpp中,將以下代碼添加到OnDraw()函數中:
wglMakeCurrent(pDC->m_hDC,m_hRC);
DrawScene();//用戶自定義函數,用於繪制三維場景;
wglMakeCurrent(pDC->m_hDC,NULL);
在MyTestView.cpp中,添加成員函數DrawScene():
voidCMyTestView::DrawScene()
{/*繪制三維場景*/}
(4)在MyTestView.h中包含以下頭文件並添加類成員說明:
#include
#include
#include
在CTestView類中的protected:段中添加成員變數聲明:
HGLRCm_hRC;
同時添加成員函數聲明:
DrawScene();
這樣,一個基於OpenGL標準的程序框架已經構造好,用
戶只需在DrawScene()函數中添加程序代碼即可。
建立三維實體模型
三維實體建模是整個圖形學的基礎,要生成高逼真
度的圖像,首先要生成高質量的三維實體模型。
OpenGL中提供了十幾個生成三維實體模型的輔助庫函
數,這些函數均以aux作為函數名的前綴。簡單的模型,如球
體、立方體、圓柱等可以使用這些輔助函數來實現,如
auxWireSphere(GLdoubleradius)(繪制一半徑為radius的網狀球體)。
但是這些函數難以滿足建立復雜三維實體的需要,所以用
戶可以通過其它建模工具(如3DS等)來輔助建立三維實體模
型資料庫。筆者在三維實體的建模過程中採用3DS提供的2D
Shape、3DLofter和3DEditor進行模型的編輯,最後通過將模型數
據以DXF文件格式輸出存儲供應用程序使用。
真實感圖形的繪制
1.定義光照模型和材質
(1)光源。OpenGL提供了一系列建立光照模型的庫函
數,使用戶可以十分方便地在三維場景中建立所需的光照
模型。OpenGL中的光照模型由環境光(AmbientLight)、漫射光
(DiffuseLight)、鏡面反射光(SpecularLight)等組成,同時還可設
置光線衰減因子來模擬真實的光源效果。
例如,定義一個黃色光源如下:
GlfloatLight_position[]={1.0,1.0,1.0,0.0,};
GlfloatLight_diffuse[]={1.0,1.0,0.0,1.0,};
glLightfv(GL_LIGHT0,GL_POSTTION,light_position);//定義光源位置
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);//定義光源漫射光
光源必須經過啟動後才會影響三維場景中的實體,可以通過以下指令使光源有效:<
glEnable(LIGHTING);//啟動光照模型;
glEnable(GL_LIGHT0);//使光源GL_LIGHT0有效;
OpenGL中一共可以定義GL_LIGHT0~GL_LIGHT7八個光源。
(2)材質。OpenGL中的材質是指構成三維實體的材料在
光照模型中對於紅、綠、藍三原色的反射率。與光源的定義
類似,材質的定義分為環境、漫射、鏡面反射成分,另外還
有鏡面高光指數、輻射成分等。通過對三維實體的材質定義
可以大大提高應用程序所繪制的三維場景的逼真程度。例
如:
/*設置材質的反射成分*/
GLfloatmat_ambient[]={0.8,0.8,0.8,1.0};
GLfloatmat_diffuse[]={0.8,0.0,0.8,1.0};/*紫色*/
GLfloatmat_specular[]={1.0,0.0,1.0,1.0};/*鏡面高光亮紫色*/
GLfloatmat_shiness[]={100.0};/*高光指數*/
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);/*定義環境光反射率*/
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);/*定義漫射光反射率*/
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);/*定義鏡面光反射率*/
glMaterialfv(GL_FRONT,GL_SHINESS,mat_shiness);/*定義高光指數*/
(3)材質RGB值與光源RGB值的關系。OpenGL中材質的顏色
與光照模型中光源的顏色含義略有不同。對於光源,R、G、B
值表示三原色在光源中所佔有的比率;而對於材質定義,R、
G、B的值表示具有這種材質屬性的物體對於三原色的反射
比率,場景中物體所呈現的顏色與光照模型、材質定義都相
關。例如,若定義的光源顏色是(Lr,Lg,Lb)=(1.0,1.0,1.0)(白光),
物體的材質顏色定義為(Mr,Mg,Mb)=(0.0,0.0,0.8),則最終到達人
眼的物體顏色應當是(Lr*Mr,Lg*Mg,Lb*Mb)=(0.0,0.0,0.8)(藍色)。
2.讀取三維模型數據
為了繪制三維實體,我們首先必須將預先生成的三
維實體模型從三維實體模型庫中讀出。下圖描述了讀取三
維實體模型的流程。
3.三維實體繪制
由於3DS的DXF文件中對於三維實體的描述是採用三角
形面片逼近的方法,而在OpenGL函數庫中,提供了繪制三角形
面片的方法,所以為三維實體的繪制提供了方便。以下提供
了繪制三角形面片的方法:
glBegin(TRANGLES);//定義三角形繪制開始
glVertexf((GLfloat)x1,(GLfloat)y1,(GLfloat)z1);//第一個頂點
glVertexf((GLfloat)x2,(GLfloat)y2,(GLfloat)z2);//第二個頂點
glVertexf((GLfloat)x3,(GLfloat)y3,(GLfloat)z3);//第三個頂點
glEnd();//繪制結束
為了提高三維實時動畫的顯示速度,我們利用了
OpenGL庫中的顯示列表(DisplayList)的功能,將三維場景中的實
體分別定義為單獨的顯示列表,預先生成三維實體。在圖形
顯示時,只需調用所需的顯示列表即可顯示相應的三維實
體,而不需要重新計算實體在場景中的坐標,避免了大量的
浮點運算。在調用顯示列表前所作的旋轉、平移、光照、材
質的設定都將影響顯示列表中的三維實體的顯示效果。具
體實現演算法如下:
for(ObjectNo=0;ObjectNo<實體個數;ObjectNo++)
{
glNewList(ObjectNo,GL_COMPILE);//創建第ObjectNo個實體的顯示列表
for(Fac
OpenGL是近幾年發展起來的一個性能卓越的三維圖形標准,它是在SGI等多家
世界聞名的計算機公司的倡導下,以SGI的GL三維圖形庫為基礎制定的一個通
用共享的開放式三維圖形標准。目前,包括Microsoft、SGI、IBM、DEC、SUN、
HP等大公司都採用了OpenGL做為三維圖形標准,許多軟體廠商也紛紛以OpenGL
為基礎開發出自己的產品,其中比較著名的產品包括動畫製作軟體Soft Image
和3D Studio MAX、模擬軟體Open Inventor、VR軟體World Tool Kit、CAM軟
件ProEngineer、GIS軟ARC/INFO等等。值得一提的是,隨著Microsoft公司在
Windows NT和最新的Windows 95中提供了OpenGL標准及OpenGL三維圖形加速卡
(如北京黎明電子技術公司的AGC-3D系列三維圖形加速卡)的推出,OpenGL將
在微機中有廣泛地應用,同時也為廣大用戶提供了在微機上使用以前只能在高
性能圖形工作站上運行的各種軟體的機會。
OpenGL實際上是一個開放的三維圖形軟體包,它獨立於窗口系統和操作系統,
以它為基礎開發的應用程序可以十分方便地在各種平台間移植;OpenGL可以
與Visual C++緊密介面,便於實現機械手的有關計算和圖形演算法,可保證算
法的正確性和可靠性;OpenGL使用簡便,效率高。它具有七大功能:
1) 建模 OpenGL圖形庫除了提供基本的點、線、多邊形的繪制函數外,還提
供了復雜的三維物體(球、錐、多面體、茶壺等)以及復雜曲線和曲面
(如Bezier、Nurbs等曲線或曲面)繪制函數。
2) 變換 OpenGL圖形庫的變換包括基本變換和投影變換。基本變換有平移、
旋轉、變比鏡像四種變換,投影變換有平行投影(又稱正射投影)和透
視投影兩種變換。其變換方法與機器人運動學中的坐標變換方法完全一
致,有利於減少演算法的運行時間,提高三維圖形的顯示速度。
3) 顏色模式設置 OpenGL顏色模式有兩種,即RGBA模式和顏色索引(Color Index)。
4) 光照和材質設置 OpenGL光有輻射光(Emitted Light)、環境光
(Ambient Light)、漫反射光(Diffuse Light)和鏡面光(Specular Light)。
材質是用光反射率來表示。場景(Scene)中物體最終反映到人眼的顏色是光
的紅綠藍分量與材質紅綠藍分量的反射率相乘後形成的顏色。
5) 紋理映射(Texture Mapping) 利用OpenGL紋理映射功能可以十分逼真
地表達物體表面細節。
6) 點陣圖顯示和圖象增強 圖象功能除了基本的拷貝和像素讀寫外,還提供
融合(Blending)、反走樣(Antialiasing)和霧(fog)的特殊圖象效果處理。
以上三條可是被模擬物更具真實感,增強圖形顯示的效果。
7) 雙緩存(Double Buffering)動畫 雙緩存即前台緩存和後台緩存,簡而言
之,後台緩存計算場景、生成畫面,前台緩存顯示後台緩存已畫好的畫面。
此外,利用OpenGL還能實現深度暗示(Depth Cue)、運動模糊(Motion Blur)等
特殊效果。從而實現了消隱演算法。
8. 可直接用於圖形消隱的是什麼演算法
提高消隱演算法效率的常見方法(利用連貫性,將透視投影轉換成平行投影,包圍盒技術,背面剔除,空間分割技術,物體分層表示)