簡體   English   中英

如何在OpenGL中紋理具有多個紋理的矩形

[英]How to texture a rectangle with multiple textures in OpenGL

我想在一個Android游戲的OpenGL ES 2.0中制作一個2D地圖(用於游戲,想想平鋪的世界地圖)。 基本上,有一些具有不同紋理的圖塊類型,並且地圖是從這些類型中隨機生成的,因此從游戲到游戲,地圖會發生變化,但在單個游戲的持續時間內它保持不變。

我的第一個想法是生成單個大紋理/圖像/位圖(獨立於OpenGL),事先基本上將復制的圖塊紋理拼接在一起以制作更大的地圖,然后將這個單個紋理用於​​一個大的地圖矩形。 從理論上講,我認為這很簡單並且可以正常工作,但是我擔心它對於較大的地圖不會很好地擴展,特別是在移動設備上我會用這么大的圖像映射耗盡內存。 另外,還有一小部分瓷塊一遍又一遍地重復,因此一次又一次地復制大紋理中的像素數據似乎是一種巨大的浪費。

我的第二個想法是有許多紋理,每個紋理紋理一個。 但我不確定這是如何工作的,紋理綁定方面,我是否需要着色器包含多個紋理參考,並且在着色器中有使用正確的邏輯?

最后,我認為使用紋理圖集可以工作,有一個紋理/圖像與其中的所有圖塊數據,這將是相對較小的。 但我正在努力想象如何讓數學計算出來,使得地圖矩形的“平鋪”或子部分將使用完全不同的紋理坐標。

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

我的第一個想法是生成一個大的紋理......

  • Actualy,類似這樣的東西已經在id Software的id Tech中使用,因為版本4.它被稱為MegaTexture。 基本上,它是一個很大的紋理,也可以保存額外的數據。

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

  • 您不需要在着色器中保存所有紋理。 像這樣做:

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

    2. 在循環內部,綁定當前紋理類型。

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

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

    着色器不會因這種方法而復雜化。

最后,我認為使用紋理圖集可以工作......

  • 你也可以在這里使用循環並計算CPU上每個tile類型的紋理坐標,然后將它們傳遞給着色器。

考慮到你的地圖沒有通過游戲會話改變,MegaTexture方法看起來很好。 但是,這取決於地圖的大小和可用的內存量。 另請注意,最大紋理大小是有限的。 最大尺寸因設備而異,但應該是(AFAIK)等於或大於屏幕尺寸和至少64個紋素(16個用於立方體貼圖紋理)。 您可以使用glGet(GL_MAX_TEXTURE_SIZE )在任何設備上獲得最大紋理大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM