2011-08-03 76 views
0

我想學習OpenGL,它有點令人生畏。要開始使用,我試圖用它在2D圖像上創建一些效果。基本上,我想拍攝一張圖像(比如說1000px×1000px),並將它分成一個大小相同的正方形網格(比如說10×10的網格),然後分別操作這些正方形(比如轉一個黑方塊,翻轉另一個方塊,另一個「掉落」在屏幕上等)。我已經按照一些基本的在線說明(http://blog.jayway.com/2010/12/30/opengl-es-tutorial-for-android-%E2%80%93-part-vi-textures/)如何將紋理映射到簡單的正方形,但是我在將紋理映射到更復雜的多個正方形排列時遇到了問題。如何將紋理應用於使用OpenGL的方格網格

1)給定一個2×2(和更大尺寸)的正方形網格,我如何在整個網格上映射單個紋理/圖像?也就是說,OpenGL期望的紋理座標(以及按什麼順序)可以使這項工作成爲可能?我似乎無法圍繞如何弄清大型多邊形結構上「UV」座標的順序。 2)由於我最終會轉換,旋轉等網格的每個單獨的平方,最好是創建網格的每個平方,並單獨劃分紋理/位圖並將每個圖像應用於每個廣場分開?如果是這樣,你有什麼建議如何有效地將位圖分成幾塊?

任何和所有幫助,鏈接,建議等將不勝感激。我在一個支持OpenGL ES 2的Android應用程序中這樣做,但我認爲大多數OpenGL討論/概念都是平臺不可知的。如果可能的話,我不想包含一些大框架或工具包來做這件事,因爲我想要很多速度和最小尺寸。

回答

1

從更重要的回覆#2開始,您真的不想做比您絕對需要的更多的紋理開關。他們是一個瘋狂的表現損失。

回到#1,你這樣做的方式其實很簡單。您的紋理位於座標(0,0)至(1,1)的單位方塊的中。這被稱爲紋理空間座標,軸被分別稱爲U和V.所以每個都在0到1之間,並覆蓋整個圖像。

現在當你創建你的對象時,通過頂點(通過頂點緩衝區或立即)來創建頂點,你可以爲每個頂點發送第二組座標,UV紋理座標。您可以使用它將您的圖像「切片」成部分。

最簡單的方法來做你的具體應用是取頂點座標,除以圖像長度的長度,並乘以你正在建造的小方塊的長度。一旦你開始旋轉你的方塊,這顯然不起作用,但也許它會幫助你更好地形象化過程。

請注意,這是如何完全獨立於平臺的,您可以使用與DirectX應用程序相同的推理或其他任何方法!

1

1)我認爲你搜索的關鍵詞是「紋理地圖集」。

一些提示,但你可能會在互聯網上找到更好的解釋,因爲我仍然在學習:(我使用OpenGl 2.1和GLSL 1。2所以因人而異)
頂點着色器有這樣的事情:

uniform mat4 projectionMatrix; 
uniform mat4 viewMatrix; 
uniform mat4 modelMatrix; 

attribute vec3 position; 
attribute vec2 texcoord; 

varying vec2 vertTexCoord; 

void main() 
{ 
    vertTexCoord = texcoord; 
    gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0f); 
} 

在片段着色器,你做這樣的事情:

uniform sampler2D texture; 
varying vec2 vertTexCoord; 

void main() 
{ 
    gl_FragColor = texture2D(texture, vertTexCoord); 
} 

,然後,例如,如果你想有一個2x2的網格正方形(紋理分爲4部分),你會有這樣的頂點; (假設正方形是1個單位寬和高)
(UV = texcoord,頂點=位置)
square1
和下方的看起來像這樣:
square2

這是有點重要的是要記住,雖然頂點座標可以超過1且低於0,但紋理座標不能(總是在0和1之間)。我不會劃分位圖,因爲使用紋理地圖(複數?)已經很快了,我懷疑你會獲得顯着的速度增益(如果有的話)。

我希望我能幫忙! (也抱歉,但我不能直接嵌入圖像,請給我代表,所以我可以在將來做:))