2013-04-12 52 views
0

我正在与高通公司增强现实FrameMarkers演示为iOS &切换到我们的3D人给我的模型(真的,他更多的是一个2D的家伙,这就是为什么我试图在代码端解决这个问题,而不是3D端)。问题在于关于纹理 - 演示假定2d图像纹理绑定到3d模型。然而,我们的3D人员已经将纹理构建到了对象本身中(例如程序纹理)。Opengl ES - 如何合并程序纹理

最初物体出现完全充满黑色&无法真正看到任何细节。我设法让这一点更好地从演示中删除这些行:

glActiveTexture(GL_TEXTURE0); 

glBindTexture(GL_TEXTURE_2D, [obj3D.texture textureID]); 

果然一切实物条银白色的颜色&我现在可以看到一些细节&一些反射掉一些表面的(它应该是在实际的地方是半透明的,而不是纯粹的反射 - 所以这也是一个问题..)。

我在几个地方阅读,为了达到半透明性,这些命令是必需的;

glEnable(GL_BLEND); 

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

然而,对于我 - 他们只是把整个屏幕黑..

正确: Correct rendering

应用程式: In-app rendering

+1

当你说他在模型本身构建了纹理时,他提供了什么样的表单?如果你想告诉我他已经转发的纹理,你会告诉我什么? Renderman着色代码,GLSL,HLSL,也许还有别的? – Tommy

+0

嗨 - 三维模型作为wavefront .obj文件提供,通过标准的3DS设置生成;根据vuforia教程中关于切换其他3d模型,我通过perl转换器脚本(obj2opengl.pl)运行此obj,该脚本将obj文件转换为具有顶点数组,texcoords数组和法线数组的C头文件。 – Reece

+0

所以你不再拥有纹理信息了? – Tommy

回答

0

随着截图的好处,我会敢于猜测,您的设计师已经将适当的材料分配给了脸部 - 您可能会有一个.MTL文件与OBJ文件一起使用,并包含大量以开头的行,KdNs - 但没有应用任何纹理。从我可以从obj2opengl中得到的结果,脚本假设了更多的视频游戏风格的演示,在某些实现中,为表面给出的颜色属性被丢弃并且仅应用纹理。

因此,从技术上讲,你是正确的禁用纹理,但是如果你使用ES 1.x,你可能想要添加什么东西,在某处使用一堆glMaterial调用,使用脚本没有的数据似乎保留。或者,对于ES 2.x,您需要着色器模拟经典环境+漫反射+镜面光照模型,在iOS下,您可以通过将适当指定的GLKEffectPropertyMaterial附加到相关的GLKBaseEffect,从GLKit获得海峡。

对于透明度,我最好的猜测就是您的增强现实库没有正确设置合成3d和2d所需的状态,而假设您将保留它。所以你必须考虑到这一点。

你在找什么样的解决方案?你是否希望从现在起可以适应任意模型的东西,还是仅仅是将这个模型加入到应用程序中,然后继续与其他东西相关?

如果前者那么你可能需要找一些其他的工具链;恐怕我不能提供建议,因为我更像是一个写OBJ解析器,在运行时分析人员,我从来没有更新过GLKit的东西,所以现在已经过时了。

如果后者那么最简单的事情可能是按材料拆分模型并单独导出每个组件(希望您的3d编辑器可以做到这一点),然后手键入相关系数(没有那么多)并绘制以适当的顺序(透明度最后,可能,否则它并不重要)。

编辑:为记录,当人们说程序纹理,那么他们通常意味着什么就像我给你一个公式f(texture position),例如,当在多边形的表面上评估产生的东西看起来像大理石。希望我找到一些方法来进一步参数化和/或定义它,以便您可以放大和缩小,获得更多细节。所以这是一个函数,可以产生一个2D图像,否则我将把它放在一个位图中,同时具有灵活性和希望的细节优势。

+0

谢谢你 - 当然让我有很多需要考虑的事情;我很欣赏时间和精力 - 所以我会给你答案.. – Reece