




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、OpenGL ES 11單紋理,多視圖,紋理渲染,以及數(shù)學(xué)靈感我在高中的最后一年,我正在做一個先進的數(shù)學(xué)題目,是因為有趣,看著油漆干燥。有不少次我都沒有談到,因為我的那些先進的教學(xué)理念在課堂的環(huán)境根本沒有激勵我。有一天,我繼續(xù)坐在教室的后面發(fā)呆,突然我發(fā)現(xiàn)白板上的這樣一行: a b c . d e f 我坐在筆直。我知道這是矩陣數(shù)學(xué),這是我一直暴露在閱讀有關(guān)圖形程序,但我還沒有完全理解。嗯,我有興趣再次,鼓舞注意,甚至喜歡自己。興趣是一個有趣的事情。我提到這一點,因為無論我如何努力,我不能完全獲得該教程混合權(quán)利。所以,我剛剛張貼,并決定回來后,我所有的“靈感” ?,F(xiàn)實將是我永遠也不會得到啟發(fā)尋
2、找在立方體和金字塔,試圖處理日益復(fù)雜的OpenGL ES的概念。其上市時間開始(緩慢)增加的復(fù)雜性場面在我們正在嘗試英寸這樣,靈感不應(yīng)枯竭。 增加了現(xiàn)場的復(fù)雜性將沿著放緩,但我們不能作出任何巨大的跳躍在任何時間,以免造成人民后面。但是,增加的復(fù)雜性,我們將和您的結(jié)果將學(xué)習(xí)現(xiàn)場管理,以及在OpenGL ES的概念。 今 天的教程將剛才我們在隧道。但是,在我們達到現(xiàn)場,我們有一些其他位做家務(wù)。首先,我們需要支付最后一次專題載入紋理中的iPhone ,但直到去年我離開,因為它是最重要的(閱讀:我忘記了它) 。然后我們要引起我們的隧道使用4種不同的材質(zhì),但加載從一個單一的紋理文件。最后,我們會做一些基
3、本呈現(xiàn)的紋理,觸摸基地再次與融合。iPhones Y != OpenGLs YOpenGLs Y不適合很多的平臺,包括iPhone的。所以當我們使用渲染的時候,y是從上往下的。為了解決這個問題,不要調(diào)用 glRotatef() ,雖然它可以解決這個問題,但是會浪費CPU/GPU的時間。這是僅于的解決辦法。 1. 改變紋理之前捆綁在一個圖像編輯器,以便在加載的正確方式。這一工程,但有可能減少跨平臺的兼容性。還需要更多的工作。我不會做這件事。 2.改變紋理的坐標數(shù)組為右坐標。也就是說,左下角將是(0,1).OpenGL并不關(guān)系你的紋理數(shù)據(jù),它只需要知道每個頂點對應(yīng)的紋理坐標就可以了。 3.改變 l
4、oadTexture 函數(shù),當它加載圖片的時候自行翻轉(zhuǎn)。但是這樣一來,你每次加載圖片都要浪費時間。并且增加CPU/GPU的消耗?!白罴逊桨浮笔鞘褂玫?點。我將改變 loadTexture 函數(shù)。在本教程里,一切還很好,還沒有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);這為我們的圖像指定了正確的方向。從單個紋理中出來的多個紋理做為今天的樂趣,我們將使用單一的紋理來生成4個紋理對象:兩個墻的紋理,地板的紋理和天花板的紋理。在 上個教程里,我們?yōu)榱⒎襟w的每個面都加載了一個紋理。我們每一次加載紋理并傳送給OpenGL,它都會在OpenGL的控制空間里增加一個副本。因此
6、,我 們可以使用free()去釋放內(nèi)存,在loadTexture里使用malloc()為紋理圖片開啟內(nèi)存。顯然,我們每次改變紋理都需要時間,每次使用新 的紋理都要通知OpenGL綁定新的紋理。這個方法給了你一些變革,但它不是真正的性能。雖然是一個方便的技巧,我只是想告訴你可以使用紋理的一個部分。第一件事就是創(chuàng)建一個空白的圖片,大小是512*512,足夠放下4張256*256的圖片。然后我們復(fù)制每個圖片到這個大圖片里,保存為png文件。至少有些工作你可以自己完成了,我將分離出每個紋理通過控制我的紋理坐標。在我們定義紋理坐標前,我們需要定位我們使用的頂點坐標。我們需要一個矩形如下: 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,如果我們想繪制木材紋理(左下角的),我們需要指定下面的紋理坐標。 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和一起一樣,他們就是坐標。每個紋理坐標對應(yīng)一個頂點坐標。從底部到木材紋理的頂部,正好是全部大小的一半, y坐標將是0.5而不是以前的0.0。以前,我們是使用的GLshort,現(xiàn)在我們使用GLfloats。同樣,x方向也是到達0.5就截至了。這里是四個紋理的坐標: 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 ;最后一件事,我定義了一些宏來讓代碼閱讀的更加容易,為獲得每個紋理坐標的正確偏移值。#define WOOD_TC_OFFSET 0#define BRICK_TC_OFFSET 8#define FLOOR_TC_OFFSET 16#define CEILING_TC_OFFSET 24繪制隧道完整的隧道是這樣的: 需要注意的第一件事是我們只使用了一個對象。繪制隧道的代碼沒有創(chuàng)建更多的對象,我們只使用了單獨一個,只是我們操縱它,讓它看起來像多重的。事實上,左邊墻有5個,右邊有5個,上下各有
11、10個。所以我猜,我可以說本教程介紹了最全的代碼重用。在我們繪制任何事情前,我們需要設(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我們的頂點數(shù)組,告訴它去使
12、用它。改變?yōu)榧y理映射并且告訴它去使用它。我們不能告訴OpenGL關(guān)于紋理坐標數(shù)組,因為我們將取決于構(gòu)成的矩形,我們正在繪制的。首先,我們繪制地板。這個地板由兩塊我們之前定義的矩形組成。移動到屏幕的下半部分,旋轉(zhuǎn)90度,讓它看起來像個地板。然后并排的繪制。這個代碼如下: / 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(); 我們用一個for循環(huán)來循環(huán)5次。每次循環(huán)中,都有兩個地板的矩形被繪制出來。這里需要重視的改變是調(diào)用了 glTexCoordPointer():glTexCoordPointer(2, GL_FLOAT, 0, &combinedTextureCoordinateFLOOR_TC_OFFSET);數(shù)組的參數(shù)指針需要通過開始坐標的正確地址??聪麻_始定義的宏。點擊 “Build & Go”: 現(xiàn)在,輪到墻面了。過程是相同的,但是這一次,我們把它們在x軸上移動并且在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(); 請注意,我已經(jīng)修改了紋理坐標的偏移值。因為我們要使用不用的紋理去繪制左邊及右邊。 最后,我們繪制天空。和地板相同,只是增加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(); 這就是我們完成的隧道. 當然,這個沒有什么特別的。這只是為給我們一個合適的場景來表示各種繪制效果。在這里我們開始處理,比如屏幕管理,從世界底圖里渲染地板和墻壁。紋理渲染:輕松紋理渲染的過程就是由已經(jīng)被繪制到屏幕上的來創(chuàng)建一個新的紋理。所以不是從我們的應(yīng)用程序包里加載紋理,我們讓OpenGL渲染
19、屏幕,這時候我們復(fù)制全部或部分的場景到我們的一個緩沖區(qū),然后在提交它完成屏幕之前重新添加它。哦!深呼吸。這不是很復(fù)雜,并且這很有用。一個簡單的例子,紋理渲染是復(fù)制你渲染緩沖中的一部分。你應(yīng)該這樣想,當我們渲染緩沖中的光線效果,透明度和混合都已經(jīng)完成了。所以你只需要復(fù)制它就可以使用這些效果了,而不需要重新計算燈光,陰影等。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.在我們隧道的世界里,我們要添加一個圖片在隧道的盡頭,并且使用提供的紋理來支持反射效果。首先一個事,我們添加一個對象。這不是光; 在我隧道的盡頭是Romo 第一件事,我們加載兩張新的紋理。一個是背景效果,然后我們繪制第二張紋理(Romo),我的英雄,在前面。這樣我就可以展示混合的紋
21、理效果了。增加兩行新的函數(shù)在 initWithCoder:self loadTexture:"bluetex.png" intoLocation:textures1;self loadTexture:"romo.png" intoLocation:textures2;在繪制天花板之后,加載我們的紋理,然后我們將產(chǎn)生隧道盡頭。首先我們需要設(shè)置標準的紋理坐標數(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);有了對混合教程的失敗例子來比較,這是一個好的多的例子。記不記得,在混合教程里面,你需要首先繪制不透明的物體,然后在繪制半透明的物體?這就是我們要做的。Romo的圖片只是其中一個,還有一個相同尺寸的藍色紋理。繪制結(jié)束以后就是這樣:通過這個混合的例子。注銷
24、掉 glEnable(GL_BLEND), 你只需要注銷掉這行。你就可以得到以下的內(nèi)容: romo的紋理圖片掩蓋了后面的藍色紋理,注意到了沒?這是非混合。我這里給你看到的是,僅僅是繪制一個紋理,包羅所有效果。反注釋 glEnable(GL_BLEND). 我們將使用的紋理渲染將不需要這個效果。現(xiàn)在我們設(shè)置。我將告訴你紋理渲染有那些過程。紋理渲染:過程紋理渲染的過程是很簡單。只有四步:1。創(chuàng)建渲染紋理是從那個從我們渲染圖片復(fù)制出內(nèi)容而創(chuàng)建的目標紋理。使用的方法完全同其他的紋理加載,你可以使用loadTexture.2。渲染到你的屏幕。我們是這樣做的;我們有romo在隧道里面的一部分混合效果以證明
25、我們是從渲染緩沖中復(fù)制出來的。3。從我們第一步設(shè)置的紋理中復(fù)制一部分(或全部)出來。4。渲染新的紋理。現(xiàn)在你知道四個步驟是什么了,只有第3步是全新的,其他的將有新的內(nèi)容,但是你會非常熟悉。創(chuàng)建紋理渲染通 常情況下,我們想用做紋理的圖片,都是加載它,格式化它,然后調(diào)用glTexImage2D()發(fā)送它到OpenGL。如果一個渲染紋理,我們步需要用 了,但是我們依然需要獲得OpenGL開啟的空間,這是是從渲染屏幕中復(fù)制出的當前的存儲紋理的空間。這是很簡單的。到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我們紋理在工作,并且選擇下一個可用的紋理id,然后,下面一行,我們創(chuàng)建了一個和我們加載文件一樣的內(nèi)存空間。這里是兩者的不同。首先,我們在紋理尺寸里寫死了為128x128,你可以選擇你喜歡的尺寸,但是必須是2的冪。最后的參數(shù)我已經(jīng)設(shè)置為nil(或NULL如果您愿意) 。最后的參數(shù),通常包含一個緩沖區(qū)包含我們的圖象數(shù)據(jù)。由于我們沒有圖像數(shù)據(jù),我們只是讓OpenGL的知道,這將創(chuàng)建紋理的本身,而是沒有填
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五企業(yè)股東退股轉(zhuǎn)讓協(xié)議書范例
- 二零二五運輸公司員工聘用合同書
- 共享農(nóng)田養(yǎng)殖合同范本
- 餐具包定制合同范本
- 2025商業(yè)綜合體項目方案設(shè)計合同
- 2025古董買賣合同范本
- 價格磋商合同范本
- 2025財務(wù)專員聘請合同勞動合同
- 2025采購合同應(yīng)該如何擬定
- 2025年熱淬火油項目可行性研究報告
- 油罐及管道強度設(shè)計
- 第二講CIS的發(fā)展史
- Unit 6 The admirable Topic talk 課件-高中英語北師大版(2019)必修第二冊
- 四川省高等教育自學(xué)考試畢業(yè)生登記表【模板】
- 觸電傷害事故安全教育
- 數(shù)據(jù)結(jié)構(gòu)ppt課件完整版
- 煙花爆竹零售經(jīng)營從業(yè)人員安全培訓(xùn)
- 專利檢索ppt課件(PPT 54頁)
- 建筑立面十八式,你用過幾個?
- 三只小豬的真實故事
- 第九章 放射線對人體影響
評論
0/150
提交評論