0

我正在使用适用于 iOS 的 Qualcomm 增强现实 FrameMarkers 演示,并切换了我们的 3D 人员给我的模型(实际上他更像是一个涉足 3d 的 2d 人 - 这就是我试图解决这个问题的原因代码端;而不是 3D 端)。问题在于纹理 - 演示假定 2d 图像纹理绑定到 3d 模型。然而,我们的 3D 人员已经将纹理构建到对象本身中(例如程序纹理)。

最初,该物体看起来完全是黑色的,看不到任何细节。通过从演示中删除这些行,我设法使它变得更好:

glActiveTexture(GL_TEXTURE0);

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

这让一切都变成了一种银色的颜色,我现在可以看到一些细节和一些表面的一些反射(它实际上应该在某些地方是半透明的,而不是纯粹的反射——所以这也是一个问题..)。

我在一些地方读到,为了实现半透明,这些命令是必需的;

glEnable(GL_BLEND);

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

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

正确的: 正确渲染

应用内: 应用内渲染

4

1 回答 1

0

借助屏幕截图,我敢猜测您的设计师已经为面分配了适当的材料——您可能会有一个与 OBJ 文件一起使用的 .MTL 文件,其中包含很多以 和 开头的行——Ka但不是应用任何纹理。据我所知,该脚本采用了更多的视频游戏演示风格,在某些实现中,为表面提供的颜色属性被丢弃,仅应用纹理。KdNsobj2opengl

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

为了透明度,我最好的猜测是您的增强现实库没有正确设置合成 3d 和 2d 所需的状态,而是假设您将保留它。所以你必须调查一下。

您在寻找什么样的解决方案?您是否想要从现在开始可以适应任意模型的东西,或者只是将这个模型放入应用程序然后继续使用其他东西的问题?

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

如果是后者,那么最简单的方法可能是按材料拆分模型并分别导出每个组件(希望您的 3d 编辑器可以这样做),然后手动输入相关系数(没有那么多)并以合适的顺序绘制(透明度最后,可能,否则没关系)。

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

于 2013-04-15T22:51:13.907 回答