移動應用開發(fā)課件:OpenGL(透視與光效)_第1頁
移動應用開發(fā)課件:OpenGL(透視與光效)_第2頁
移動應用開發(fā)課件:OpenGL(透視與光效)_第3頁
移動應用開發(fā)課件:OpenGL(透視與光效)_第4頁
移動應用開發(fā)課件:OpenGL(透視與光效)_第5頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

OpenGL---透視與光效劉寧Email:liuning2@OpenGLES中具有的兩種不同的視口類型。正交(orthogonal)透視(perspective)OpenGL---透視2正交視線永遠不會交匯而且物體不會改變其大小。沒有透視效果。

OpenGL---透視3透視

物體會隨著移遠而越來越小,視線會在物體移離觀察者時最終交匯。這是對真實視覺的模擬,人們就是以這種方式觀察世界的。OpenGL---透視4rightneartopOpenGL---透視5設置正交視口通過glOrthof()通知OpenGLES你希望使用正交視口OpenGL---透視

floatratio=_width/_height;//屏幕寬長比//orthographic:gl.glOrthof(-1,//left1,//right-1/ratio,//bottom1/ratio,//top0.01f,//near100.0f);//far設定視口空間的寬度為兩個單位,沿x軸從-1.0到+1.0。

定義空間的X和Y坐標的寬高比與視窗的寬高比(也就是全屏時的寬高比)一樣,確保視口的X和Y坐標遵循一樣的比例。

6OpenGL---透視righttopwidthheight當視野中的三角形長寬比等于屏幕的長寬比,視覺效果才會更好?!岸x空間的X和Y坐標的寬高比與視窗的寬高比(也就是全屏時的寬高比)一樣,確保視口的X和Y坐標遵循一樣的比例。”top=right*(height/width)=right/(width/height)7near

參數(shù):說明了視口開始的位置。如果我們站在原點處,視口就位于我們的面前,習慣上使用.01

或.001

作為正交視口的起點。使得視口處于原點“前方”一點點。

far描述觀察的深度,根據(jù)你程序的需要來設定。設置正交視口定義了near(遠)和far(近)范圍來描述觀察的深度。OpenGL---透視floatratio=_width/_height;//屏幕長寬比//orthographic:gl.glOrthof(-1,//left1,//right-1/ratio,//bottom1/ratio,//top0.01f,//near100.0f);//far8調(diào)用glOrthof()之后,我們使用視窗矩形來調(diào)用glViewport()。

切換了MatrixMode到GL10.GL_MODELVIEW,設置OpenGL接受關于改變model繪制方式的調(diào)用。

OpenGL---透視

gl.glViewport(0,0,(int)_width,(int)_height);9調(diào)用了glEnable()并使用參數(shù)GL10.GL_DEPTH_TEST。使OpenGLES檢查對象的z方向的順序。如果我們沒有enable它,我們將看到最后被繪制的對象一直顯示在最前面。這意味著,即使這個物體本來應該被更近更大的物體遮蓋,我們依然可以看到它。

OpenGL---透視

gl.glMatrixMode(GL10.GL_MODELVIEW);

gl.glEnable(GL10.GL_DEPTH_TEST);10設置透視視口隨著視線越來越遠,可以看到更廣闊的世界物體隨著遠離觀察者而變小使用透視時可見空間的形狀稱為錐臺(frustum)OpenGL---透視11視野(fieldofvision)

由兩個角度定義的:伸出雙臂手掌合攏伸向前方。你的手臂現(xiàn)在指向你自己錐臺的z軸?,F(xiàn)在慢慢分開你的雙臂,定義了一個逐漸增大的角度。這就是用于定義觀察錐臺的兩個角度之一,它定義了視野的寬度。OpenGL---透視12視野(fieldofvision)

上下展開你的雙臂,定義了另一個角度。如果你的雙手間距只有三厘米,那么角度將非常小。這稱為窄視野。如果你雙手分開兩米,視野的寬度變得很大。這就是所謂寬視角(廣角)。OpenGL---透視13設置透視視口我們選擇一個中間值,45°。使用這個值,我們怎樣計算我們的觀察錐臺?想象一下,從頂部看錐臺是什么樣子。OpenGL---透視45°

下面是示意圖:

14設置透視視口正切函數(shù)定義為直角對邊與相鄰邊的比率。

錐臺遠端寬度的一半就是視野角度正切的一半。將此值乘以near值,就可以得到right值。

right值取反就是left。OpenGL---透視nearright(45/2)°right=near*tan(45/2)15設置透視視口通過glFrustumf()通知OpenGLES你希望使用正交視口OpenGL---透視

floatsize=0.01f*(float)Math.tan(Math.toRadians(45.0)/2);

floatratio=_width/_height;//屏幕長寬比//perspective:gl.glFrustumf(-size,//leftsize,//right

-size/ratio,//bottomsize/ratio,//top0.01f,//near100.0f);//farsize=near*tan(45/2),為左右視野的寬度定義空間的X和Y坐標的寬高比與視窗的寬高比(也就是全屏時的寬高比)一樣,確保視口的X和Y坐標遵循一樣的比例。

rightneartop16OpenGL---透視透視效果隨著幾何體遠離你,它們會變得越來越小,正像火車鐵軌一樣。正交效果第一個四棱錐后面的四棱錐完全被第一個擋住了。因為沒有透視,后面的各幾何體的形狀完全取決于其前方的物體。

17OpenGL在沒有設置光效的情況下仍然可以看見東西。它只是提供一種十分單調(diào)的整體光讓我們看到物體。但是如果不定義光效,物體看上去都很單調(diào)。OpenGL---光效18OpenGLES實際上定義了兩種shademodel,GL_FLAT

和GL_SMOOTH。

GL_FLAT將指定三角形上的每個像素都同等對待。多邊形上的每個像素都具有相同的顏色,陰影等。它的計算比每個像素按不同方法計算更為廉價,但是在這種方式下,物體看上去極為不真實。

OpenGL---光效19要使3D物體盡量真實,應該使用GL_SMOOTH

繪圖模式,它使用了一種平滑但較快速的陰影算法,稱為Gouraud算法。GL_SMOOTH是默認值。

OpenGL---光效20首先啟動光效。默認情況下,手工指定光效是被禁止的。通常情況下,光效只需在設定時啟動一次。不需要在繪圖開始前后打開和關閉。啟動光效后的效果:

OpenGL---光效//如果不啟用GL_LIGHTING光就什么都看不見gl.glEnable(GL10.GL_LIGHTING);21啟動了光效,但是沒有創(chuàng)建任何光源。除清除緩存用的灰色外,任何繪制的物體都被渲染成絕對的黑色。如果只對光源進行設置、定位甚至啟用,光源不會工作,除非啟用GL_LIGHTING。OpenGLES允許你創(chuàng)建8個光源。有一個常量對應于這些光源中的一個,常量為GL_LIGHT0

到GL_LIGHT7??梢匀我饨M合這些光源中的五個。下面是“打開”第一個光源GL_LIGHT1的方法:OpenGL---光效gl.glEnable(GL10.GL_LIGHT1);//啟用一號光源22一旦啟動了光源,則必須設置光源的一些屬性。一般情況下,有三個不同的要素用來定義光源。光效三要素在OpenGLES中,光由三個元素組成:

環(huán)境元素(ambientcomponent)散射元素(diffusecomponent)高光元素(specularcomponent)OpenGL---光效23高光元素(specularcomponent)定義了光線直接照射并反射到觀察者從而形成了物體上的“熱點”或光澤。光點的大小取決于一些因素,但是如果你看到如上圖黃球所示一個區(qū)域明顯的光斑,那通常就是來自于一個或多個光源的高光部分。散射元素(diffusecomponent)定義了比較平均的定向光源,在物體面向光線的一面具有光澤。

環(huán)境光(ambientcomponent)沒有明顯的光源。其光線折射與許多物體,因此無法確定其來源。環(huán)境元素平均作用于場景中的所有物體的所有面。OpenGL---光效24環(huán)境光(ambient)光效中有越多的環(huán)境元素,就越不會產(chǎn)生引入注目的效果。場景中的總環(huán)境光效是由所有啟動光源的環(huán)境光組合在一起所決定的。如果你使用了不止一個光源,那么最好是只指定一個光源的環(huán)境元素,而設定其他所有光源的環(huán)境因素為黑{0.0,0.0,0.0,1.0}(參數(shù)為(r,g,b,a)),從而很容易地調(diào)整場景的環(huán)境光效。

OpenGL---光效FloatBufferlightAmbient=FloatBuffer.wrap(new

float[]{0.5f,0.5f,0.5f,1.0f});//設置環(huán)境光gl.glLightfv(GL10.GL_LIGHT1,GL10.GL_AMBIENT,lightAmbient);25散射光(diffuse)散射光線是發(fā)散的,因而參數(shù)較柔和的光,一般不會像直射光一樣產(chǎn)生光斑。在OpenGLES中,散射元素使光線均勻地散布到物體之上。然而,由于它是定向光而不是環(huán)境光,只有面向光線的物體面才會反射散射光,而場景中的所有多面體都會被環(huán)境光照射。

OpenGL---光效FloatBufferlightDiffuse=FloatBuffer.wrap(new

float[]{0.5f,0.5f,1.0f,0.5f});//設置漫射光gl.glLightfv(GL10.GL_LIGHT1,GL10.GL_DIFFUSE,lightDiffuse);26高光(specular)以熱點和光暈的形式反射到觀察者的眼中。如果想產(chǎn)生聚光燈的效果,那么應該設置一個很大的高光元素值及很小的散射和環(huán)境元素值。

OpenGL---光效constGLfloatlight0Specular[]={0.7,0.7,0.7,1.0};

27光源位置光源的位置由四個數(shù)值組成。前三個分別是X、Y、Z軸上的位移。第四個參數(shù)區(qū)1.0f,將指定的坐標就是光源的位置

OpenGL---光效//光源的位置FloatBufferlightPosition=FloatBuffer.wrap(new

float[]{0.0f,0.0f,2.0f,1.0f});//設置光源的位置gl.glLightfv(GL10.GL_LIGHT1,GL10.GL_POSITION,lightPosition);28默認值如果不設置光源顏色,默認情況下將是黑色(0.0,0.0,0.0,1.0);如果不設置光源位置,默認情況下將是原點。光源顏色中的透明度對反射顏色和背景顏色沒有影響,但是會影響散射顏色。OpenGL---光效29創(chuàng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論