我一直在做一个 iOS 项目,我试图将纹理(世界地图)映射到 ofSpherePrimitive,但似乎存在一些渲染问题。
虽然我可以将纹理映射到球体上,但似乎有部分球体前景中的纹理无法正确渲染,而是显示为“透明”并渲染球体的远端, 纹理由内而外。下面两张图片来说明这一点。
首先,这里用红光照亮正面/顶部并正确着色纹理,而在球体的底部有来自球体另一侧内部的那些未点亮的纹理部分。
其次,这是一个没有灯光、摄像头等的最小测试用例,只有一个方格图案。您可以从球体下半部分的背面看到较小的跳棋。请注意,它不仅在底部,而且随着球体的旋转,上半部分的部分也会出现同样的问题。
对于第二个例子,相关代码是:
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
两个纹理图像都是 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
中创建了一种不同类型的窗口设置,默认情况下不支持深度缓冲区。
希望这对以后的人有所帮助。
关于ios - Openframeworks iOS 项目 : texture on ofSpherePrimitive breaks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30682255/