導航:首頁 > 源碼編譯 > opengl種子填充演算法

opengl種子填充演算法

發布時間:2023-09-24 10:11:29

1. Android OpenGL 的基本使用

由於本人現在在公司做Android上的OpenGL圖像處理相關功能,以前沒有搞過這方面的知識,所以一切只能從頭開始搞起,接下來將會慢慢分享其他方面的內容,先用這篇比較基礎的文章來開頭。

剛才我們談到圖像處理,在做圖像處理我們不是可以用Canvas來繪制嗎,怎麼還要用OpenGL那麼陌生的東西來搞?為什麼要用OpenGL,肯定有它的好處。

接下來我們會來講解如何在Android項目開發過程中加入OpenGL,在開始前我們先了解同OpenGL ES密切相關的載體:GLSurfaceView:

要用OpenGL繪制,首先要有GLSurfaceVie的實例

現在OpenGL ES版本已經到3.0了,Android平台上目前有1.0和2.0,我們使用的是2.0,在使用前在onCreate()方法中檢查是否支持2.0的版本並且確定使用2.0

一般我們只需要使用「configurationInfo.reqGlEsVersion >= 0x20000」,至於加後面主要是用於模擬器檢查,假定模擬器支持2.0。

前面說到GLSurfaceView挖了一個洞,就是為了看見下面的渲染表面,同樣實在onCreate()方法中

通過setEGLContextClientVersion()方法配置surface視圖,設定好使用的OpenGL版本,然後調用setRenderer()傳進有自定義Renderer類的新實例。當Surface創建或者發生變化的時候,以及繪制一幅新幀時,渲染器都會被GLSurfaceView調用。

GLSurfaceView的生命周期要協同好Activity的生命周期,避免造成內存泄漏。

Renderer類也就是我們的渲染類了,它是通過實現Renderer介面來實現功能的。

渲染器介面定義的方法:

實現Renderer的介面方法

首選在onSurfaceCreated()中調用glClearColor設置清空屏幕用的顏色,這里使用紅色。

設置視口的大小

在onDrawFrame()中調用glClear(GL_COLOR_BUFFER_BIT)清空屏幕,會調用glClearColor中定義的顏色來填充整個屏幕。通過這幾個步驟,基本上就可以在GLSurfaceView繪制出東西了,在這里我只是簡單的用紅色繪制整個屏幕。

OpenGL在Android上的使用基本上是這樣,但是,當然沒那麼簡單,在使用OpenGL進行繪制算是比較繁瑣的過程,後面也會慢慢去揭曉其他使用方法,來構造一幅一幅精美的特效靜/動圖。

2. 怎麼用opengl掃描線演算法填充多邊形

掃描線演算法是光柵圖形學的內容,底層硬體實現。opengl是不會關注這種細節的。你寫這樣的代碼
glBegin(GL_POLYGON);
glVertex3f(...);
...
glVertex3f(...);
glEnd();
畫一個多邊形,但底層的光柵化到底是怎麼實現的,是否使用掃描線演算法,你是不可以控制的。

3. 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)等
特殊效果。從而實現了消隱演算法。

閱讀全文

與opengl種子填充演算法相關的資料

熱點內容
6s怎麼外接u盤需要什麼app 瀏覽:131
linux查看文件許可權命令 瀏覽:685
安卓手游存檔怎麼用 瀏覽:761
linuxyum安裝ftp 瀏覽:690
村委會主任可以推行政命令嗎 瀏覽:102
電腦文件夾封面多張圖片 瀏覽:263
網吧總伺服器叫什麼 瀏覽:922
多個演算法解決同一個問題 瀏覽:455
小車解壓後我的購車發票呢 瀏覽:977
做app開發用什麼雲伺服器 瀏覽:177
linux網卡子介面 瀏覽:985
21歲職高畢業學程序員怎麼學 瀏覽:321
vs如何對單個文件編譯 瀏覽:6
為什麼有的電腦不能安裝python 瀏覽:75
金蝶迷你版加密狗檢測到過期 瀏覽:186
硬體描述語言編譯結果 瀏覽:655
程序員逆天改命 瀏覽:19
金斗雲伺服器 瀏覽:447
港口工程pdf 瀏覽:770
程序設計語言pdf 瀏覽:434