2015-06-06 58 views
0

我一直在研究一個iOS項目,我嘗試將紋理(世界地圖)映射到一個ofSpherePrimitive,但似乎存在一些渲染問題。Openframeworks iOS項目:紋理onSpherePrimitive中斷

雖然我可以將紋理映射到球體上,但似乎有前景中的紋理無法正確呈現的球體部分,但相反,它顯示爲「透明」並呈現出「透明」的遠側球體,裏面的質感。下面兩張圖片來說明這一點。

首先,在這裏用紅色光照亮正面/頂部並正確着色紋理,而在球體的底部則有來自球體另一側內部的未照亮紋理部分。 enter image description here

其次,這裏有一個最小的測試案例,沒有燈光,攝像頭等,只是一個方格圖案。你可以從球體下半部分的背面看到更小的跳棋。請注意,它不是唯一的底部,但隨着球體旋轉,上半部分也顯示相同的問題。 enter image description here

對於第二個實施例中,相關的代碼是:

void ofApp::setup(){ 
    r = 0; 
    sphere.setRadius(100); 
    texture.loadImage("test.png"); 
} 

//-------------------------------------------------------------- 
void ofApp::update(){ 
    r += 0.25; 
} 

//-------------------------------------------------------------- 
void ofApp::draw(){ 
    ofPushMatrix(); 

    ofTranslate(ofGetWidth()/2, ofGetHeight()/2); 
    ofRotateY(r); 

    texture.getTextureReference().bind(); 
    sphere.draw(); 

    texture.unbind(); 

    ofPopMatrix(); 
} 

值得注意的是,雖然球體旋轉的「透明」的部件與球體旋轉。

您還可以看看這裏的第二個例子中的整個代碼:https://github.com/kontur/openframeworks-ios-sphere-texturing-problem

兩個紋理圖像是兩個大國,在世界地圖圖像是1024×1024和方格圖案爲512×512像素。

我很確定這是一些小問題,設置一個標誌來渲染球體,但作爲初學者,我還沒有取得任何進展,無論我迄今爲止嘗試過。

任何想法?

回答

1

有兩種可能的解決辦法,使這項工作:

按本openprocessing forum post確保使用iOSWindow設置像這樣生成的main.mm開始:

int main(){ 
    ofAppiOSWindow * iOSWindow = new ofAppiOSWindow(); 
    iOSWindow->enableDepthBuffer(); 
    ofSetupOpenGL(iOSWindow, 1024, 768, OF_FULLSCREEN); 

    ofRunApp(new ofApp); 
} 

特別是enableDepthBuffer()顯得重要。

另一種解決方法是通過Open GL命令明確設置背面剔除。爲此,在ofSpherePrimitive被繪製的代碼需要看起來像這樣:

glEnable(GL_CULL_FACE); // Cull back facing polygons 
glCullFace(GL_BACK); // might be GL_FRONT instead 
texture.getTextureReference().bind(); 
sphere.draw(); 
texture.unbind(); 

這並沒有開箱的理由是,項目了openFrameworks發電機main.mm創建不同類型的窗口設置的這默認情況下不支持深度緩衝區。

希望這將有助於某人未來的參考。