2010-03-11 19 views
2

我在iPhone上的GL上有一個非常基本的紋理映射問題,我想知道有什麼策略來調試這種事情。調試基本的OpenGL紋理失敗? (iPhone)

(坦白地說,只是盯着狀態機電話和想知道如果其中的任何錯誤或亂序是沒辦法live--是否有工具嗎?)

我有一個512x512的PNG文件,我」從磁盤加載(不是專門打包的),創建一個CGBitmapContext,然後調用CGContextDrawImage從中獲取字節。 (此代碼基本上是從蘋果樣本被偷了。)我試圖映射紋理到「四」,其代碼看上去基本上和this--所有2D平面的東西,沒有什麼花哨:

glEnable(GL_TEXTURE_2D); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);  
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

GLfloat vertices[8] = { 
    viewRect.origin.x, viewRect.size.height, 
    viewRect.origin.x, viewRect.origin.y, 
    viewRect.size.width, viewRect.origin.y, 
    viewRect.size.width, viewRect.size.height   
};  
GLfloat texCoords[8] = { 
    0, 1.0, 
    0, 0, 
    1.0, 0, 
    1.0, 1.0 
}; 

glBindTexture(GL_TEXTURE_2D, myTextureRef); // This was previously bound to 
glVertexPointer(2, GL_FLOAT , 0, vertices); 
glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);  

glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisable(GL_TEXTURE_2D); 
  • 我假設紋理區域只是黑色。
  • 我看不到來自CG調用的調試輸出來設置紋理。
  • glGetError什麼也沒有報告。
  • 如果我簡化這個代碼塊來繪製垂直,但設置一個純色,那麼四邊形區域就像預期的那樣點亮。
  • 如果我立即將整個上下文清除爲紅色,我不會看到紅色 - 這意味着在那裏呈現某些內容,但不會顯示我的PNG內容。

我能做什麼錯?更重要的是,調試這類事情的正確工具和技術是什麼,因爲遇到這樣的問題並且無法以任何有意義的方式在調試器中「逐步完成」是一件令人失望的事情。

謝謝!

+1

如果您只繪製沒有紋理的四邊形並且沒有設置顏色,結果如何?如果它是黑色,請嘗試使用GL_REPLACE而不是GL_MODULATE。 – 2010-03-11 16:15:50

+0

Maurice:這解決了它。我完蛋了。這麼多我仍然不明白。我希望這個框架帶有一個調試系統,所以你可以理解它是什麼*試圖*做超越...看到一個大的空矩形。 – 2010-03-12 03:03:13

回答

1

有什麼結果,如果你只是畫 四沒有紋理,沒有 設置顏色?如果它是黑色,請使用GL_REPLACE而不是 GL_MODULATE嘗試 。 - Maurice Gilden Mar 11 at 16:15

這樣做了。 MODULATE不起作用。 REPLACE做到了。 謝謝Maurice。

3

glTexParameteri()和朋友控制每紋理狀態,而不是全局GL狀態。嘗試在發佈之前綁定要更改的紋理。

As-is myTextureRef is most likely incomplete

3

是的,一般來說,有工具。 gDEBugger是這類事情的標準GL調試器。這是一個商業產品。替代方案包括自己隱藏GL狀態,或嘗試對您使用的實現進行逆向工程(通常,除非您的平臺提供調試實現,否則some people對此有很多樂趣,但這通常不太可能正常工作) 。

或者......你總是可以使用梅薩,只是介入。

+0

感謝您的指點 - 已經注意到gDEBugger,並且看到它很貴;無法分辨是真的還是一些夜晚的事情。此外,單獨的視頻鏈接+1。 – 2010-03-12 02:58:30