Openframeworks iOS 项目:ofSpherePrimitive 上的纹理中断

Openframeworks iOS project: texture on ofSpherePrimitive breaks

我一直在做一个 iOS 项目,我试图将纹理(世界地图)映射到 ofSpherePrimitive 上,但似乎存在一些渲染问题。

虽然我可以获得要映射到球体上的纹理,但似乎有部分球体前景中的纹理无法正确渲染,而是出现 "transparent" 并渲染远-球体的一侧,纹理由内而外。下面两张图来说明一下。

首先,这里用红光照亮 front/top 并正确着色纹理,而在球体的底部,有来自球体另一侧内部的那些未点亮的纹理部分。

其次,这是一个没有灯光、摄像头等的最小测试用例,只有一个方格图案。您可以从球体下半部分的背面看到较小的跳棋。请注意,它不仅在底部,而且随着球体的旋转,上半部分的部分也会出现同样的问题。

第二个例子,相关代码为:

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();
}

值得注意的是,当球体旋转时,"transparent" 部分会随着球体旋转。

您还可以在此处查看第二个示例的完整代码:https://github.com/kontur/openframeworks-ios-sphere-texturing-problem

两个纹理图像都是 2 的幂,世界地图图像为 1024x1024,棋盘格图案为 512x512 像素。

我很确定这是一个小问题,不知何故与设置一个标志来渲染球体有关,但作为一个初学者,无论我到目前为止尝试了什么,我都没有取得任何进展。

有什么想法吗?

有两种可能的解决方案可以使这项工作:

按照此 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 Project Generator 在 main.mm 中创建了另一种 window 设置,默认情况下不支持深度缓冲区。

希望这对以后的人有所帮助。