OpenGL ES 11--單紋理多視圖紋理渲染以及數(shù)學(xué)靈感_第1頁(yè)
OpenGL ES 11--單紋理多視圖紋理渲染以及數(shù)學(xué)靈感_第2頁(yè)
OpenGL ES 11--單紋理多視圖紋理渲染以及數(shù)學(xué)靈感_第3頁(yè)
OpenGL ES 11--單紋理多視圖紋理渲染以及數(shù)學(xué)靈感_第4頁(yè)
OpenGL ES 11--單紋理多視圖紋理渲染以及數(shù)學(xué)靈感_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、OpenGL ES 11單紋理,多視圖,紋理渲染,以及數(shù)學(xué)靈感我在高中的最后一年,我正在做一個(gè)先進(jìn)的數(shù)學(xué)題目,是因?yàn)橛腥?,看著油漆干燥。有不少次我都沒(méi)有談到,因?yàn)槲业哪切┫冗M(jìn)的教學(xué)理念在課堂的環(huán)境根本沒(méi)有激勵(lì)我。有一天,我繼續(xù)坐在教室的后面發(fā)呆,突然我發(fā)現(xiàn)白板上的這樣一行: a b c . d e f 我坐在筆直。我知道這是矩陣數(shù)學(xué),這是我一直暴露在閱讀有關(guān)圖形程序,但我還沒(méi)有完全理解。嗯,我有興趣再次,鼓舞注意,甚至喜歡自己。興趣是一個(gè)有趣的事情。我提到這一點(diǎn),因?yàn)闊o(wú)論我如何努力,我不能完全獲得該教程混合權(quán)利。所以,我剛剛張貼,并決定回來(lái)后,我所有的“靈感” ?,F(xiàn)實(shí)將是我永遠(yuǎn)也不會(huì)得到啟發(fā)尋

2、找在立方體和金字塔,試圖處理日益復(fù)雜的OpenGL ES的概念。其上市時(shí)間開始(緩慢)增加的復(fù)雜性場(chǎng)面在我們正在嘗試英寸這樣,靈感不應(yīng)枯竭。 增加了現(xiàn)場(chǎng)的復(fù)雜性將沿著放緩,但我們不能作出任何巨大的跳躍在任何時(shí)間,以免造成人民后面。但是,增加的復(fù)雜性,我們將和您的結(jié)果將學(xué)習(xí)現(xiàn)場(chǎng)管理,以及在OpenGL ES的概念。 今 天的教程將剛才我們?cè)谒淼?。但是,在我們達(dá)到現(xiàn)場(chǎng),我們有一些其他位做家務(wù)。首先,我們需要支付最后一次專題載入紋理中的iPhone ,但直到去年我離開,因?yàn)樗亲钪匾模ㄩ喿x:我忘記了它) 。然后我們要引起我們的隧道使用4種不同的材質(zhì),但加載從一個(gè)單一的紋理文件。最后,我們會(huì)做一些基

3、本呈現(xiàn)的紋理,觸摸基地再次與融合。iPhones Y != OpenGLs YOpenGLs Y不適合很多的平臺(tái),包括iPhone的。所以當(dāng)我們使用渲染的時(shí)候,y是從上往下的。為了解決這個(gè)問(wèn)題,不要調(diào)用 glRotatef() ,雖然它可以解決這個(gè)問(wèn)題,但是會(huì)浪費(fèi)CPU/GPU的時(shí)間。這是僅于的解決辦法。 1. 改變紋理之前捆綁在一個(gè)圖像編輯器,以便在加載的正確方式。這一工程,但有可能減少跨平臺(tái)的兼容性。還需要更多的工作。我不會(huì)做這件事。 2.改變紋理的坐標(biāo)數(shù)組為右坐標(biāo)。也就是說(shuō),左下角將是(0,1).OpenGL并不關(guān)系你的紋理數(shù)據(jù),它只需要知道每個(gè)頂點(diǎn)對(duì)應(yīng)的紋理坐標(biāo)就可以了。 3.改變 l

4、oadTexture 函數(shù),當(dāng)它加載圖片的時(shí)候自行翻轉(zhuǎn)。但是這樣一來(lái),你每次加載圖片都要浪費(fèi)時(shí)間。并且增加CPU/GPU的消耗?!白罴逊桨浮笔鞘褂玫?點(diǎn)。我將改變 loadTexture 函數(shù)。在本教程里,一切還很好,還沒(méi)有OpenGL不能做的事。唯一的改變事修改下面的函數(shù)。 CGContextRef textureContext = CGBitmapContextCreate(textureData, texWidth, texHeight, 8, texWidth * 4, CGImageGetColorSpace(textureImage), kCGImageAlphaPremultip

5、liedLast);/ Rotate the image - These two lines are newCGContextTranslateCTM(textureContext, 0, texHeight);CGContextScaleCTM(textureContext, 1.0, -1.0);這為我們的圖像指定了正確的方向。從單個(gè)紋理中出來(lái)的多個(gè)紋理做為今天的樂(lè)趣,我們將使用單一的紋理來(lái)生成4個(gè)紋理對(duì)象:兩個(gè)墻的紋理,地板的紋理和天花板的紋理。在 上個(gè)教程里,我們?yōu)榱⒎襟w的每個(gè)面都加載了一個(gè)紋理。我們每一次加載紋理并傳送給OpenGL,它都會(huì)在OpenGL的控制空間里增加一個(gè)副本。因此

6、,我 們可以使用free()去釋放內(nèi)存,在loadTexture里使用malloc()為紋理圖片開啟內(nèi)存。顯然,我們每次改變紋理都需要時(shí)間,每次使用新 的紋理都要通知OpenGL綁定新的紋理。這個(gè)方法給了你一些變革,但它不是真正的性能。雖然是一個(gè)方便的技巧,我只是想告訴你可以使用紋理的一個(gè)部分。第一件事就是創(chuàng)建一個(gè)空白的圖片,大小是512*512,足夠放下4張256*256的圖片。然后我們復(fù)制每個(gè)圖片到這個(gè)大圖片里,保存為png文件。至少有些工作你可以自己完成了,我將分離出每個(gè)紋理通過(guò)控制我的紋理坐標(biāo)。在我們定義紋理坐標(biāo)前,我們需要定位我們使用的頂點(diǎn)坐標(biāo)。我們需要一個(gè)矩形如下: const G

7、Lfloat elementVerticies = -1.0, 1.0, 0.0, / Top left -1.0, -1.0, 0.0, / Bottom left 1.0, -1.0, 0.0, / Bottom right 1.0, 1.0, 0.0 / Top right ;ok,如果我們想繪制木材紋理(左下角的),我們需要指定下面的紋理坐標(biāo)。 const GLfloat combinedTextureCoordinate = / The wood wall texture 0.0, 1.0, / Vertex02 top left of square 0.0, 0.5, / Vert

8、ex35 bottom left of square 0.5, 0.5, / Vertex68 bottom right of square 0.5, 1.0, / Vertex911 top right of square和一起一樣,他們就是坐標(biāo)。每個(gè)紋理坐標(biāo)對(duì)應(yīng)一個(gè)頂點(diǎn)坐標(biāo)。從底部到木材紋理的頂部,正好是全部大小的一半, y坐標(biāo)將是0.5而不是以前的0.0。以前,我們是使用的GLshort,現(xiàn)在我們使用GLfloats。同樣,x方向也是到達(dá)0.5就截至了。這里是四個(gè)紋理的坐標(biāo): const GLfloat combinedTextureCoordinate = / The wood wal

9、l texture 0.0, 1.0, / Vertex02 top left of square 0.0, 0.5, / Vertex35 bottom left of square 0.5, 0.5, / Vertex68 bottom right of square 0.5, 1.0, / Vertex911 top right of square / The brick texture 0.5, 1.0, 0.5, 0.5, 1.0, 0.5, 1.0, 1.0, / Floor texture 0.0, 0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.5, / Cei

10、ling texture 0.5, 0.5, 0.5, 0.0, 1.0, 0.0, 1.0, 0.5 ;最后一件事,我定義了一些宏來(lái)讓代碼閱讀的更加容易,為獲得每個(gè)紋理坐標(biāo)的正確偏移值。#define WOOD_TC_OFFSET 0#define BRICK_TC_OFFSET 8#define FLOOR_TC_OFFSET 16#define CEILING_TC_OFFSET 24繪制隧道完整的隧道是這樣的: 需要注意的第一件事是我們只使用了一個(gè)對(duì)象。繪制隧道的代碼沒(méi)有創(chuàng)建更多的對(duì)象,我們只使用了單獨(dú)一個(gè),只是我們操縱它,讓它看起來(lái)像多重的。事實(shí)上,左邊墻有5個(gè),右邊有5個(gè),上下各有

11、10個(gè)。所以我猜,我可以說(shuō)本教程介紹了最全的代碼重用。在我們繪制任何事情前,我們需要設(shè)置OpenGL繪制紋理映射的狀態(tài)。下面的代碼,你應(yīng)該非常的熟悉了。 glBindTexture(GL_TEXTURE_2D, textures0); glVertexPointer(3, GL_FLOAT, 0, elementVerticies); glEnableClientState(GL_VERTEX_ARRAY); glEnable(GL_TEXTURE_2D); glEnableClientState(GL_TEXTURE_COORD_ARRAY);我們要告訴OpenGL我們的頂點(diǎn)數(shù)組,告訴它去使

12、用它。改變?yōu)榧y理映射并且告訴它去使用它。我們不能告訴OpenGL關(guān)于紋理坐標(biāo)數(shù)組,因?yàn)槲覀儗⑷Q于構(gòu)成的矩形,我們正在繪制的。首先,我們繪制地板。這個(gè)地板由兩塊我們之前定義的矩形組成。移動(dòng)到屏幕的下半部分,旋轉(zhuǎn)90度,讓它看起來(lái)像個(gè)地板。然后并排的繪制。這個(gè)代碼如下: / Draw the Floor / First, point the texture co-ordinate engine at the right offset glTexCoordPointer(2, GL_FLOAT, 0, &combinedTextureCoordinateFLOOR_TC_OFFSET);

13、for (int i = 0; i < 5; i+) glPushMatrix(); glTranslatef(-1.0, -1.0, -2.0+(i*-2.0); glRotatef(-90.0, 1.0, 0.0, 0.0); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glPopMatrix(); glPushMatrix(); glTranslatef(1.0, -1.0, -2.0+(i*-2.0); glRotatef(-90.0, 1.0, 0.0, 0.0); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glPo

14、pMatrix(); 我們用一個(gè)for循環(huán)來(lái)循環(huán)5次。每次循環(huán)中,都有兩個(gè)地板的矩形被繪制出來(lái)。這里需要重視的改變是調(diào)用了 glTexCoordPointer():glTexCoordPointer(2, GL_FLOAT, 0, &combinedTextureCoordinateFLOOR_TC_OFFSET);數(shù)組的參數(shù)指針需要通過(guò)開始坐標(biāo)的正確地址??聪麻_始定義的宏。點(diǎn)擊 “Build & Go”: 現(xiàn)在,輪到墻面了。過(guò)程是相同的,但是這一次,我們把它們?cè)趚軸上移動(dòng)并且在y軸上旋轉(zhuǎn)。 / Draw the walls / This time we'll chan

15、ge the texture coordinate array during the drawing for (int i = 0; i < 5; i+) glPushMatrix(); glTexCoordPointer(2, GL_FLOAT, 0, &combinedTextureCoordinateBRICK_TC_OFFSET); glTranslatef(-1.0, 0.0, -2.0+(i*-2.0); glRotatef(-90.0, 0.0, 1.0, 0.0); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glPopMatrix(

16、); glPushMatrix(); glTexCoordPointer(2, GL_FLOAT, 0, &combinedTextureCoordinateWOOD_TC_OFFSET); glTranslatef(1.0, 0.0, -2.0+(i*-2.0); glRotatef(-90.0, 0.0, 1.0, 0.0); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glPopMatrix(); 請(qǐng)注意,我已經(jīng)修改了紋理坐標(biāo)的偏移值。因?yàn)槲覀円褂貌挥玫募y理去繪制左邊及右邊。 最后,我們繪制天空。和地板相同,只是增加y軸而不是減少。 / Draw

17、the ceiling / Start by setting the texture coordinate pointer glTexCoordPointer(2, GL_FLOAT, 0, &combinedTextureCoordinateCEILING_TC_OFFSET); for (int i = 0; i < 5; i+) glPushMatrix(); glTranslatef(-1.0, 1.0, -2.0+(i*-2.0); glRotatef(90.0, 1.0, 0.0, 0.0); glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

18、glPopMatrix(); glPushMatrix(); glTranslatef(1.0, 1.0, -2.0+(i*-2.0); glRotatef(90.0, 1.0, 0.0, 0.0); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glPopMatrix(); 這就是我們完成的隧道. 當(dāng)然,這個(gè)沒(méi)有什么特別的。這只是為給我們一個(gè)合適的場(chǎng)景來(lái)表示各種繪制效果。在這里我們開始處理,比如屏幕管理,從世界底圖里渲染地板和墻壁。紋理渲染:輕松紋理渲染的過(guò)程就是由已經(jīng)被繪制到屏幕上的來(lái)創(chuàng)建一個(gè)新的紋理。所以不是從我們的應(yīng)用程序包里加載紋理,我們讓OpenGL渲染

19、屏幕,這時(shí)候我們復(fù)制全部或部分的場(chǎng)景到我們的一個(gè)緩沖區(qū),然后在提交它完成屏幕之前重新添加它。哦!深呼吸。這不是很復(fù)雜,并且這很有用。一個(gè)簡(jiǎn)單的例子,紋理渲染是復(fù)制你渲染緩沖中的一部分。你應(yīng)該這樣想,當(dāng)我們渲染緩沖中的光線效果,透明度和混合都已經(jīng)完成了。所以你只需要復(fù)制它就可以使用這些效果了,而不需要重新計(jì)算燈光,陰影等。I wasnt going to cover render to texture yet as its probably a bit further on than where Im up to so far, but theres been a few requests so

20、 I will cover the easy way to achieve this effect now. We wont see the best yet because we have not yet covered details such as lighting but youll get the idea.在我們隧道的世界里,我們要添加一個(gè)圖片在隧道的盡頭,并且使用提供的紋理來(lái)支持反射效果。首先一個(gè)事,我們添加一個(gè)對(duì)象。這不是光; 在我隧道的盡頭是Romo 第一件事,我們加載兩張新的紋理。一個(gè)是背景效果,然后我們繪制第二張紋理(Romo),我的英雄,在前面。這樣我就可以展示混合的紋

21、理效果了。增加兩行新的函數(shù)在 initWithCoder:self loadTexture:"bluetex.png" intoLocation:textures1;self loadTexture:"romo.png" intoLocation:textures2;在繪制天花板之后,加載我們的紋理,然后我們將產(chǎn)生隧道盡頭。首先我們需要設(shè)置標(biāo)準(zhǔn)的紋理坐標(biāo)數(shù)組從我們紋理中,然后我們繪制不透明的紋理矩形,然后是部分透明的矩形。 const GLfloat standardTextureCoordinates = 0.0, 1.0, 0.0, 0.0, 1.0

22、, 0.0, 1.0, 1.0 ; / Draw the Blue texture glBindTexture(GL_TEXTURE_2D, textures1); glTexCoordPointer(2, GL_FLOAT, 0, standardTextureCoordinates); glPushMatrix(); glTranslatef(0.0, 0.0, -6.0); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glPopMatrix(); glBindTexture(GL_TEXTURE_2D, textures2); glEnable(GL_BLE

23、ND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glPushMatrix(); glTranslatef(0.0, 0.0, -5.9); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glPopMatrix(); glDisable(GL_BLEND);有了對(duì)混合教程的失敗例子來(lái)比較,這是一個(gè)好的多的例子。記不記得,在混合教程里面,你需要首先繪制不透明的物體,然后在繪制半透明的物體?這就是我們要做的。Romo的圖片只是其中一個(gè),還有一個(gè)相同尺寸的藍(lán)色紋理。繪制結(jié)束以后就是這樣:通過(guò)這個(gè)混合的例子。注銷

24、掉 glEnable(GL_BLEND), 你只需要注銷掉這行。你就可以得到以下的內(nèi)容: romo的紋理圖片掩蓋了后面的藍(lán)色紋理,注意到了沒(méi)?這是非混合。我這里給你看到的是,僅僅是繪制一個(gè)紋理,包羅所有效果。反注釋 glEnable(GL_BLEND). 我們將使用的紋理渲染將不需要這個(gè)效果?,F(xiàn)在我們?cè)O(shè)置。我將告訴你紋理渲染有那些過(guò)程。紋理渲染:過(guò)程紋理渲染的過(guò)程是很簡(jiǎn)單。只有四步:1。創(chuàng)建渲染紋理是從那個(gè)從我們渲染圖片復(fù)制出內(nèi)容而創(chuàng)建的目標(biāo)紋理。使用的方法完全同其他的紋理加載,你可以使用loadTexture.2。渲染到你的屏幕。我們是這樣做的;我們有romo在隧道里面的一部分混合效果以證明

25、我們是從渲染緩沖中復(fù)制出來(lái)的。3。從我們第一步設(shè)置的紋理中復(fù)制一部分(或全部)出來(lái)。4。渲染新的紋理?,F(xiàn)在你知道四個(gè)步驟是什么了,只有第3步是全新的,其他的將有新的內(nèi)容,但是你會(huì)非常熟悉。創(chuàng)建紋理渲染通 常情況下,我們想用做紋理的圖片,都是加載它,格式化它,然后調(diào)用glTexImage2D()發(fā)送它到OpenGL。如果一個(gè)渲染紋理,我們步需要用 了,但是我們依然需要獲得OpenGL開啟的空間,這是是從渲染屏幕中復(fù)制出的當(dāng)前的存儲(chǔ)紋理的空間。這是很簡(jiǎn)單的。到initWithCoder, 然后在加載紋理之后,為了渲染紋理添加下面的代碼/ Render to Texture texture buff

26、er setupglBindTexture(GL_TEXTURE_2D, textures3);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);第一件我們要做的事,告訴OpenGL我們紋理在工作,并且選擇下一個(gè)可用的紋理id,然后,下面一行,我們創(chuàng)建了一個(gè)和我們加載文件一樣的內(nèi)存空間。這里是兩者的不同。首先,我們?cè)诩y理尺寸里寫死了為128x128,你可以選擇你喜歡的尺寸,但是必須是2的冪。最后的參數(shù)我已經(jīng)設(shè)置為nil(或NULL如果您愿意) 。最后的參數(shù),通常包含一個(gè)緩沖區(qū)包含我們的圖象數(shù)據(jù)。由于我們沒(méi)有圖像數(shù)據(jù),我們只是讓OpenGL的知道,這將創(chuàng)建紋理的本身,而是沒(méi)有填

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論