簡體   English   中英

OpenGL:使用球面坐標在球體上映射紋理

[英]OpenGL: Mapping texture on a sphere using spherical coordinates

我有一個地球的紋理,我想要映射到一個球體上。 因為它是一個單位球體而且模型本身沒有紋理坐標,所以我能想到的最簡單的方法就是計算每個頂點的球面坐標並將它們用作紋理坐標。

textureCoordinatesVarying = vec2(atan(modelPositionVarying.y, modelPositionVarying.x)/(2*M_PI)+.5, acos(modelPositionVarying.z/sqrt(length(modelPositionVarying.xyz)))/M_PI);

在片段着色器中執行此操作時,這很好,因為我從(插值的)頂點位置計算紋理坐標。

但是當我在頂點着色器中執行此操作時,如果模型本身具有紋理坐標,我也會這樣做,我得到的結果如下圖所示。 頂點顯示為點,低於0.5的紋理坐標(u)為紅色,而其他所有為藍色。

紋理映射到球體上

因此看起來兩個相鄰的紅色/藍色頂點的紋理坐標(u)具有值(幾乎)1.0和0.0。 然后可變地進行平滑插值,因此產生介於0.0和1.0之間的值。 這當然是錯誤的,因為值應該是1.0或0.0,但兩者之間沒有任何關系。

有沒有辦法使用球面坐標作為紋理坐標而不會獲得上面顯示的那些效果? (如果可能,不改變模型)

這是一個常見問題。 兩個紋理坐標拓撲之間的接縫,您希望紋理坐標從1.0無縫地換行到0.0,這需要網格正確處理它。 為此,網格必須沿着接縫復制每個頂點。 其中一個頂點將具有0.0紋理坐標,並將連接到來自右側的頂點(在您的示例中)。 另一個將具有1.0紋理坐標,並將連接到來自左側的頂點(在您的示例中)。

這是一個網格問題,最好在網格本身中解決它。 相同的位置需要兩個不同的紋理坐標,因此您必須復制相關位置。

或者,您可以讓片段着色器從插值頂點法線生成紋理坐標。 當然,這在計算上更昂貴,因為它需要從一個方向轉換到一對角度(然后到[0,1]紋理坐標范圍)。

暫無
暫無

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

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