簡體   English   中英

為加載了高度圖的地形創建UV坐標?

[英]Create UV Coordinates for terrain loaded with heightmap?

我已經使用高度圖圖像在OpenGL中創建了一個地形。 結果是一個動態分配的數組,該數組包含地形(x,y,z)的所有頂點,步幅為3,如下所示:(firstvertexX,firstvertexY,firstvertexZ,secondvertexX,secondvertexY,thirdvertexZ ...)。

為了渲染它,我還計算了法線(以類似的數組)和假定的UV的極差近似值(使用...法線)以進行渲染。渲染完全沒有問題,除了我所說的那樣UV近似值確實很差,並且渲染的紋理在其中具有“多邊形”的感覺(使用GL_TRIANGLE_STRIPS )。

我想澄清一下,我希望在OpenGl中而不是在Blender之類的任何其他程序中創建地形。 所以我必須以某種方式為上面提到的包含頂點的數組中的每個頂點指定一個UV坐標。 我還想說我不是在尋找完美的UV解決方案(即使有某種解決方案),而是一種進行粗略近似以使結果令人滿意的方法。

所以我的問題是:

  1. UV坐標是否需要在0到1的范圍內,而不考慮地形的寬度和長度?
  2. UV坐標數組是否需要與頂點數組相同的長度?
  3. 有什么簡單的算法或方法可以指定地形的UV?

渲染的紋理:

的RenderedImage

來自網絡的實際圖像:

實際影像

指定創建數組的代碼:

for (i = 0; i < terrainGridLength - 1 ; i++) { //z
     for (j = 0; j < terrainGridWidth; j++) { //x

      TerrainVertices[k] =  startW + j + xOffset;
      TerrainVertices[k + 1] =  20 * terrainHeights[(i + 1)*terrainGridWidth + (j)]  + yOffset;
      TerrainVertices[k + 2] =  startL - (i + 1) + zOffset;
      k = k + 3;


      TerrainVertices[k] =  startW +  j +xOffset;
      TerrainVertices[k + 1] = 20 * terrainHeights[(i)*terrainGridWidth + j] +yOffset;
      TerrainVertices[k + 2] =  startL - i  + zOffset;
      k = k + 3;


      float x = RandomFloat(0.16, 0.96);
      TerrainUVs[d] = x* (terrainNormals[ 3*((i+1 )*terrainGridWidth + j)]);
      TerrainUVs[d + 1] = terrainNormals[3* ((i+1 )*terrainGridWidth + j) + 2 ];

      x = RandomFloat(0.21, 0.46);
      TerrainUVs[d+2] = x*(terrainNormals[ 3*((i+1 )*terrainGridWidth + j) +1]);
      d = d + 3;


      x = RandomFloat(0.3, 0.49);
      TerrainUVs[d] = x*(terrainNormals[3* ((i  )*terrainGridWidth + j) ]);
      TerrainUVs[d + 1] = terrainNormals[ 3*((i  )*terrainGridWidth + j)+2 ];

      x = RandomFloat(0.4, 0.85);
      TerrainUVs[d + 2] = x*(terrainNormals[3* ((i )*terrainGridWidth + j) +1]);

      d = d + 3;
    }
}

我會盡力解決您所有的問題。

1)UV坐標是否需要在0到1的范圍內而不考慮地形的寬度和長度?

UV坐標通常在0到1的空間中,但是如果傳入的UV值不是0到1,則處理UV的方式將取決於您如何設置OpenGL來處理這種情況。

您可以使用以下代碼告訴紋理采樣器將坐標視為自動換行:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

或者,您可以使用以下代碼鉗制UV值:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

在此處查看有關紋理采樣器的更多信息: https : //www.khronos.org/opengl/wiki/Sampler_Object

UV坐標數組是否需要與頂點數組相同的長度?

一般來說,是的。 在對某些幾何圖形進行紋理化時,通常每個頂點至少需要一個UV,因此與頂點一樣,UVS的數量也應相同。 但是,如果將多個紋理應用於幾何圖形,則可能會有更多的效果;如果通過其他方法對幾何圖形進行紋理化,則可能會有所減少,例如使用編寫的不需要UVS的片段着色器。 如果對UVS進行索引,也可以減少索引,也就是說,當每個共享相同UV的頂點通過索引引用數組中的相同UV時。 但是,如果您想使事情簡單,則只需進行1比1的操作,不要擔心重復的事情。

有什么簡單的算法或方法可以指定地形的UV?

一種簡單的方法是將每個三角形紋理化為四邊形的一部分。 您的地形應該只是一個四邊形網格,這意味着您可以遍歷頂點列表,為網格中的每個四邊形分配紋理坐標,如下所示:

在此處輸入圖片說明

更好的是,如果您的地形網格在x和z上的大小為1,則可以假設您的網格未旋轉,只需在x和z上插入網格的世界空間坐標並設置紋理采樣器即可包裝。 如果旋轉網格,它將仍然有效,但是紋理不會隨之旋轉。

暫無
暫無

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

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