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 设置,默认情况下不支持深度缓冲区。
希望这对以后的人有所帮助。
我一直在做一个 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 设置,默认情况下不支持深度缓冲区。
希望这对以后的人有所帮助。