2011-01-11 133 views
3

我尋找一種可能性,將PC OpenGL應用程序和iPhone應用程序遷移到一個XCode項目中(爲了方便起見)。因此,如果我爲這些源文件創造機會,我希望將它應用於兩個平臺,並希望能夠爲一個項目的兩個平臺進行編譯。我怎麼能做到這一點? 有沒有辦法在XCode 4或3.25中這樣做?任何幫助將不勝感激用OpenGL ES替換這些OpenGL函數?

編輯:好吧,我走得這麼遠 - 總而言之,它似乎與XCode 4一起工作。 我唯一的問題是這些OpenGL/Glut函數,它們不適用於iPhone:

glPushAttrib(GL_DEPTH_BUFFER_BIT | GL_LIGHTING_BIT); 
glPopAttrib(); 
glutGet(GLUT_ELAPSED_TIME); 
glutSwapBuffers(); 

任何想法如何解決這些問題?

+0

雖然不特定的OpenGL應用程序,這個問題提出了類似的問題:[相同的代碼爲iPhone /桌面應用程序基地](http://stackoverflow.com/questions/4617166/same-code-base-for-iphone-desktop-app) – 2011-01-11 15:17:09

回答

3

PushAttrib/PopAttrib你需要用代碼手動跟蹤這些國家自行更換,或者你可以以這樣的方式重新編寫代碼,任何依賴於這些國家,將它們設置本身。

glutGet(GLUT_ELAPSED_TIME)可以通過mach_absolute_time更換(特別不容易,但正確的事使用)或[的NSDate timeIntervalSinceReferenceDate](容易的,但可能有問題的,因爲它不保證被單調增加,或在1.0至增加每秒)

glutSwapBuffers將被替換爲-presentRenderbuffer:在您的EAGLContext(但它聽起來像你已經這樣做;如果你不是,你將無法看到任何東西)。

2

你可以使用dgles來包裝你的桌面OpenGL實現和提供的OpenGL ES 1.x的接口。

2

我發現這個documentation online在問候了OpenGL ES 1.0規範

有爲什麼需要由AP- plication.The應用進行查詢一種或另一種內部狀態的可能需要動態幾個原因發現實現限制(像素分量大小,紋理維度等),或者應用程序可能是分層庫的一部分,並且可能需要保存和恢復其作爲其渲染一部分的任何狀態。 PushAttrib和PopAttrib可用於執行此操作,但它們實現和使用起來非常昂貴,因此不支持。一般而言,狀態查詢是不鼓勵的,因爲它們往往不利於性能。而不是嘗試分割不同類型的動態狀態可以被查詢,例如矩陣堆棧的頂部,不支持動態狀態查詢,並且應用程序必須隱藏狀態變化而不是查詢管道。這使分層庫變得困難,但是沒有足夠的理由來保留動態狀態查詢或屬性推送和彈出。

這和這other link here似乎表明你需要自己跟蹤這些位。沒有幫助你在那裏。

glut只是調用系統代碼,是嗎? (wglSwapBuffers,glxSwapBuffers)

試試這個hereeglSwapBuffers也許this book out

對不起,我沒有給你一個更具體的答案。

1

通過這種缺乏推動attribs看似簡單的功能很惱火,但你之前設置的參數,可以使用glGetto得到的東西的狀態,這樣它爲我工作:

Boolean tmpB; 
int tmpSrc,tmpDst; 

glGetBooleanv(GL_BLEND,&tmpB); 
glGetIntegerv(GL_BLEND_SRC_ALPHA,&tmpSrc); 
glGetIntegerv(GL_BLEND_DST_ALPHA,&tmpDst);  


glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
//draw rectangle 
CGSize winSize=[[CCDirector sharedDirector] winSize]; 
CGPoint vertices[] = { ccp(0,0), ccp(winSize.width,0), ccp(winSize.width,20), ccp(0,20) }; 
glColor4ub(255, 0, 255, 55); 
ccFillPoly(vertices, 4, YES); 


if(!tmpB) 
    glDisable(GL_BLEND); 

glBlendFunc(tmpSrc, tmpDst);