簡體   English   中英

OpenGL 索引和數組紋理

[英]OpenGL Indexed and Array texture

我有一個關於 glDraw(arrays)(elements) 的問題。 問題是,由於頂點重用和緩存,大多數人說元素更有效,但我嘗試渲染地形,每個頂點具有相同位置的不同紋理坐標。 這使每個頂點都是唯一的,對嗎? 因此,如果我沒有任何頂點重用,我是否應該更喜歡數組,因為與我不僅需要提供頂點數據還需要提供索引緩沖區的元素相比,它更容易實現和一次性渲染緩沖區? 有沒有辦法渲染地形使其能夠使用元素? 我只是不知道如何正確地紋理地形,也許這就是問題所在。

我可以想象人物的渲染模型對元素會很好,因為我可以提供一個紋理文件並且不需要每個頂點位置更多的 tex 坐標。 但是地形應該用數組來渲染?

什么時候應該選擇數組,什么時候應該選擇元素?

對於地形glDrawElementsglDrawElements的方法,假設您有一個簡單的 2d 網格,並且您在頂點着色器上置換它或將高度作為頂點屬性發送。 對於這種網格,它比glDrawArrays快得多。

對於紋理:我不知道你是想用一個大紋理來紋理地形,還是混合在一起的多個紋理,例如一個簡單的草圖案,或者隨着高度的增加草混合到雪中。

第一個很簡單:假設您的地形寬度為 W,高度為 H。您在整個地圖上使用一個大紋理。 那么一個頂點的紋理坐標是:

vec2 TexCoord = vec2(VertexPos.x/W,VertexPos.z/H);

第二,它有點變化:

如果您的紋理是一個簡單的草圖塊,或者您想要覆蓋整個地形的任何東西,那么頂點的紋理坐標是:

vec2 TexCoord = vec2(VertexPos.x/XdirectionTileSize,VertexPos.z/ZdirectionTileSize);

XdirectionTileSizeZdirectionTileSize是一種圖案的尺寸。 例如,您想以 1 米 * 1 米的分辨率在地形上獲取草紋理,並且您的頂點彼此相距 2 米,然后將它們設置為 0.5 (1/2)。

對於更多的紋理,您可以定義更多的平鋪尺寸,以及一張大的紋理貼圖,每種顏色定義一種材料。 示例:紅色是草,藍色是雪,綠色是沙子,alpha 是岩石。 然后你像這樣混合紋理:(你可以像一個大紋理一樣獲取這個大材質貼圖)

color = materialmap.r*grass + materialmap.b*snow + materialmap.g*sand + materialmap.a*rock;

最后,我最喜歡的地形紋理方法是程序着色器 splatting 我不會在這里寫。 例如 Frostbite Engine (Battlefields) 使用這個。 這是一個非常好的演示文稿的鏈接: Frostbite 中的 Terrain Rendering Using Procedural Shader Splatting 簡而言之,這就像掩蔽。 將高度、法線、斜率渲染為 FBO 紋理,並像在延遲渲染/着色中一樣使用它。

對於質量:如果您的 texcoords 是在着色器中計算的,頂點位置在平面 (.xy, .xz) 上,它會隨着斜率的增加而扭曲紋理。 這個問題的解決方案是三平面紋理。 頁面底部: 使用 GPU 生成復雜的程序地形 簡而言之:它將紋理從 3 個平面(xz、xy、yz)投影到地形,並將它們與法線混合/混合。

當然,您可以混合使用這些紋理方法。 我知道它沒有直接回答你的問題,但我認為你不應該將紋理坐標作為頂點屬性傳遞。 用大紋理、瓷磚或飛濺來定義它們要容易得多。 哦,我希望你使用着色器;)。

暫無
暫無

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

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