2015-06-06 5 views
0

Я работаю над проектом iOS, где я пытаюсь отобразить текстуру (карту мира) на aSpherePrimitive, но, похоже, есть проблема с рендерингом.Openframeworks iOS project: texture on of theSpherePrimitive breaks

В то время как я могу получить текстуру для отображения на сферу, кажется, есть части сферы, где текстура на переднем плане не отображается должным образом, а вместо этого оказывается «прозрачной» и отображает дальнюю сторону сфера, текстура наизнанку. Ниже двух изображений, чтобы проиллюстрировать точку.

Во-первых, здесь с красным светом, освещающим переднюю/верхнюю часть и правильно окрашивая текстуру, тогда как на нижней части сферы есть те неосвещенные фрагменты текстуры с другой стороны сферы. 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

Оба текстурных изображений являются степенями двойки, карта мир проецирования изображения, 1024x1024 и шаблон проверки быть 512x512 пикселей.

Я уверен, что это какая-то небольшая проблема, связанная с установкой флага, чтобы сделать сферу сплошной, но как новичок я не сделал никакого прогресса в этом, несмотря на то, что я пробовал до сих пор.

Любые идеи?

ответ

1

Существует два возможных решений, чтобы сделать эту работу:

Согласно этому openprocessing forum post убедившись, что сгенерированные main.mm начинает использовать установку iOSWindow следующим образом:

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 Generator Project создает другой вид установки окна в main.mm который не поддерживает буфер глубины по умолчанию.

Надеемся, это будет полезно для кого-то для справок в будущем.