2012-01-12 21 views
3

我在OpenGL ES 2.0的objc中編寫了我自己的.obj解析器,以更好地理解OpenGLES的工作原理。加載頂點並顯示頂點顏色的模型就像魅力一樣。請注意:我正在使用索引緩衝區。解決波陣面.obj紋理座標的麻煩

真正的問題是紋理atm的映射。正如你會在下面看到更多,我的紋理沒有按照它應該的方式進行映射。

下面是我認爲.obj格式的工作原理,如果我錯了,請糾正我的錯誤:「f」-lines描述了一個面,其中斜線前的數字定義頂點索引和斜線後面的數字定義一個紋理座標。

考慮以下obj文件(通過四維影院出口):

v -75 75 -50 
v 75 75 -50 
v -75 -75 -50 
v 75 -75 -50 

vt 0 0 
vt 0 1 
vt 1 1 
vt 1 0 

f 4/3 3/2 1/1 
f 2/4 4/3 1/1 

而且質地如下:

512x512 Texture

現在,當我位置的OpenGL ES 3D空間中的頂點並嘗試將紋理座標映射到每個單獨的頂點,映射出錯。我可以通過移動一些紋理座標值來解決這個問題,但我意識到這不是做到這一點的方法。我還嘗試編輯一些.obj導出器設置來翻轉軸和/或uv映射,但其中不包含導致正確的映射。我的理論中有沒有關於.obj文件格式的內容?有一件事我可能已經說過了:昨天我讀到了.obj格式的座標系將topleft定義爲紋理的錨點。所以我解決了這個問題。

下面是對當前情況的小結: 更新:紋理的座標系是實際的.obj紋理座標系而非OpenGL的座標系。我翻譯我的解析算法中的座標來解決這個問題。

Summary

+0

在座標系上添加了說明。 – polyclick 2012-01-13 16:08:47

+0

仔細看看.obj文件中的「v」和「vt」值是如何關聯的。 OpenGL不會像處理OBJ文件一樣處理紋理座標(和法線)。因此,如果沒有「移動某些紋理座標值」,則會將紋理的左下角映射到右上角,反之亦然。請記住,您不能獨立於OpenGL中的頂點索引來進行紋理座標索引。請參閱http://stackoverflow.com/questions/4233152/how-to-setup-calculate-texturebuffer-in-gltexcoordpointer-when-importing-from-ob – Thalur 2012-01-27 13:59:06

+0

您是否找到了解決方案? – 2012-05-31 16:32:54

回答

3

我要回答我自己的問題:問題似乎是我使用索引緩衝區來加速性能,但是我的紋理座標仍映射到原始頂點。

4

據我所知,您所報告的座標系是不正確的。

實際上,它是這樣的:

Coordinate System

我知道這是不是可能是你的問題的實際響應,但我希望它揭示了它的一些情況。

+1

我很抱歉,但這不正確。在這個答案中的第三點:http://stackoverflow.com/a/5605027/341358 – polyclick 2012-01-13 16:03:47

+0

@bclaessens剛剛打開OpenGL書,我確認我以前報告過。那麼你就可以信任或不信任,我正在充分誠實地報告,並有意提供幫助。乾杯。 p.s.我的OBJ裝載機完美無缺地工作。 – 2012-01-13 16:19:26

+0

的確,OpenGL紋理座標系統的左下角是紋理原點。但是,如果可以的話,相信前一個鏈接的stackoverflow帖子的帖子,這與.obj標準不同。無論如何,除了原點位於頂部或底部的事實之外,這仍然不能解決問題。問題仍然存在,但垂直翻轉。 – polyclick 2012-01-15 02:59:24

1

Maurizio在他的opengl紋理映射座標表示中是正確的。

通過查看你的照片我想說,你應該更好地看看你的objC代碼。 假設.obj被C4D正確導出,它看起來像你有你的紋理索引混合起來。

似是而非的證據:將您發佈的圖片(「結果Opengl」)中右下角的頂點與底部右頂點切換,您的紋理就會出來。

編輯:其實,錯誤可能是在你的紋理加載代碼,但這並不能解釋你得到的結果。即使錯誤出現在紋理加載中,紋理也會顯示爲倒置(由於左下方的opengl座標系)。建議:在代碼中切換vt0和vt3 ...

2

我發現瞭解析.obj文件的類似問題。 在我的情況下,似乎我的.obj文件使用倒V(第2紋理座標)軸。 我解決了這行代碼的問題。 v = 1.0f-v;