ios - Openframeworks iOS 项目 : texture on ofSpherePrimitive breaks

标签 ios opengl-es rendering texture-mapping openframeworks

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

虽然我可以将纹理映射到球体上,但似乎有部分球体前景中的纹理无法正确渲染,而是显示为“透明”并渲染球体的远端, 纹理由内而外。下面两张图片来说明这一点。

首先,这里用红光照亮正面/顶部并正确着色纹理,而在球体的底部有来自球体另一侧内部的那些未点亮的纹理部分。 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

两个纹理图像都是 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/

相关文章:

ios - 如何在 UIImagePickerController 类型视频模式下拍照

objective-c - iOS dispatch_async 和 NSURLConnection 委托(delegate)函数未被调用

ios - UILabel 中的 HTML 格式 (iOS)

ios - Delphi/Firemonkey 在运行时更改 iOS 屏幕旋转

iPhone : OpenGL ES : Detecting if you have tapped a object (cube) on screen

javascript - 根据选定的输入数字迭代 v-for

Android OpenGL 以原始(小)分辨率渲染到 frameBuffer,然后将其缩放(viewPort)到屏幕尺寸

ios - 内存警告后在 iOS 上运行 OpenGL 时崩溃

c++ - OpenGL - 纹理四边形被裁剪​​并奇怪地拉伸(stretch)

在 Chrome、Firefox 中编码的 ASP.NET 4.0 下拉列表文本