2017-01-26 235 views
1

我正在嘗試在OpenGL ES 2.0中爲Android遊戲製作2D地圖(對於遊戲,請考慮平鋪的世界地圖)。基本上,有幾種貼圖類型具有不同的紋理,並且貼圖是從這些類型隨機生成的,因此從遊戲到遊戲地圖會發生變化,但在單個遊戲期間它會保持不變。如何在OpenGL中紋理具有多個紋理的矩形

我的第一個想法是先生成一個大的紋理/圖像/位圖(獨立於OpenGL),然後將重複的瓷磚紋理拼接在一起以製作較大的地圖,然後將這個單一紋理用於一個大型地圖矩形。從理論上講,我認爲這很簡單並且可以正常工作,但我擔心它對於較大的地圖無法很好地擴展,特別是在移動設備上,我會用如此大的圖像映射耗盡內存。此外,還有一小塊瓷磚一遍又一遍地被複制,所以看起來像是一個巨大的浪費,一次又一次地複製大紋理中的像素數據。

我的第二個想法是有很多紋理,每個瓷磚紋理一個。但我不知道這將如何工作,紋理綁定明智,我是否需要着色器包含多個紋理引用,並在着色器內有使用正確的邏輯?

最後,我認爲使用紋理圖集可以工作,有一個紋理/圖像與其中的所有瓷磚數據,這將是相對較小的。但我正在努力想象如何讓數學計算出來,使地圖矩形的「瓦片」或子部分使用完全不同的紋理座標。

我接近這個錯誤的方式嗎?我應該爲每個瓷磚使用一個矩形嗎?至少通過這種方式,我可以獨立地爲每個圖塊傳遞着色器的頂點和紋理座標。這似乎更容易,但也似乎錯了,因爲地圖實際上只是一個不會改變的矩形。

回答

0

我首先想到的是產生一個單一的大紋理...

  • Actualy,這樣的事情已經在id Software的ID技術,因爲第4版使用,這就是所謂的MegaTexture。 Basicaly,它是一個很大的紋理,也可以容納額外的數據。

我的第二個想法是有許多紋理...

  • 你並不需要持有着色器所有的紋理。這樣做:

    1. 實現一個循環的n次迭代,其中n是使用了多少不同類型的紋理。

    2. 在一個循環中,綁定當前的紋理類型。

    3. 將任何數據(如位置/顏色/紋理座標)傳遞給着色器。

    4. 繪製所有使用有界紋理的圖塊。如果您使用GLES 3.x或適當的擴展支持來定位設備,則可以使用GLES30.glDrawElementsInstancedGLES30.glDrawArraysInstanced。否則,使用GLES20.glDrawArraysGLES20.glDrawElements繪製您的瓷磚。

    着色器不會複雜這種方法。

最後,我想用一個紋理圖集可以工作...

  • 你可以在這裏使用循環也並計算在CPU每瓦型的紋理座標,然後就將它們傳遞給着色器。

考慮到您的地圖不會通過遊戲會話更改,MegaTexture方法看起來不錯。但是,這取決於您的地圖有多大以及有多少內存可用。另請注意,最大紋理尺寸是有限的。不同設備的最大尺寸不同,但應該(AFAIK)等於或大於屏幕尺寸和至少64個texels(16個用於立方體貼圖紋理)。您可以在任何使用glGet(GL_MAX_TEXTURE_SIZE)的設備上獲得最大紋理尺寸。