【问题标题】:Normal Maps vs. Normal Coordinates法线贴图与法线坐标
【发布时间】:2010-07-10 00:45:14
【问题描述】:

我目前正在使用 OpenGL ES 1.1 并使用 DrawElements 约定以及顶点、法线、纹理坐标和索引数组。

我最近在研究使用法线/凹凸映射的想法时遇到了这个问题,这在以前用 OpenGL ES 是不可能的: http://iphone-3d-programming.labs.oreilly.com/ch08.html

我已经可以从我的 3D 建模器生成一个对象空间法线贴图,但我不完全清楚的是,如果为法线贴图实现第二个纹理单元,是否不再需要法线坐标数组,还是只需通过 DOT3_RGB 选项将光照 + 颜色纹理与法线贴图相结合?

编辑 - 在进一步研究 DOT3 Lighting 之后,我不确定 ognian 给出的答案是否正确。此页面http://www.3dkingdoms.com/tutorial.htm 给出了它的用法示例,如果您查看代码的“渲染和最终结果”部分,则没有正常数组 ClientState for Normal Arrays is never enabled。

我还在这里找到了这篇文章,What is DOT3 lighting?,它很好地解释了它......但让我想到了另一个问题。在 cmets 中,声明不是平移法线,而是平移光的方向。我对此感到困惑,就好像我有一个带有固定墙的游戏......为什么我要为一个模型移动灯光?希望有人能对这一切给出一个很好的解释......

【问题讨论】:

    标签: android opengl-es android-ndk


    【解决方案1】:

    虽然切线空间法线贴图会扰乱从每个顶点法线插值的法线,但对象空间法线贴图已经包含有关贴图中表面方向的所有所需信息。因此,如果您只是在 OpenGL ES 1.1 中进行 DOT3 光照,则无需再次传递法线。

    另一篇文章提到转换光线方向而不是法线的原因是因为点积的两个参数(每像素法线和光线矢量)需要在相同的坐标空间中,点积才能产生任何感觉。因为您有一个对象空间法线贴图,所以您的每像素法线将始终位于对象的局部坐标空间中,并且纹理环境不提供任何应用进一步变换的方法。很可能您的光矢量位于其他空间中,因此所提到的转换是为了从其他空间转换回对象的本地空间。

    【讨论】:

    • 通过光矢量,我们只是在谈论glLightfv中的数组light0position(GL_LIGHT0,GL_POSITION,light0position)吗?如果我手动转换它以纠正一个物体上的照明......我不是完全弄脏了光是如何照射到其他物体上的吗?如何对其进行转换,然后将其仅应用于所讨论对象的颜色变化?顺便说一句,感谢 Pivot 的可靠回答。
    • 如果您正在像您发布的第一个链接的“使用 OpenGL ES 1.1 的法线映射”部分中那样进行对象空间法线映射,那么您根本没有使用常规的 OpenGL ES 1.1 光照。此时,您希望将光矢量(在对象空间中)作为顶点的颜色传递,以便将其用于 DOT3。您通常可以对所有顶点使用相同的颜色(到对象中心的对象空间光矢量)获得足够好的近似值。
    • 好吧,事情开始变得更有意义了……只是勉强。引发这种情况的全部原因是,我使用的是常规光照,并且相信法线贴图是 OpenGL ES 无法完成的。当我发现这是可能的时,我一直在试图弄清楚它是如何工作的。所以……在我继续之前……这是个好主意吗?是否可能比常规的 OpenGL ES 1.1 光照更快?
    • DOT3 光照是否更快可能取决于您运行的硬件,但它的作用往往是减少顶点处理端的负载,以换取更多的片段处理工作.如果您的模型最初构建的细节比您的多边形预算所能表示的更多,那么它肯定看起来比逐顶点照明好得多,前提是您可以处理这些限制(例如,仅漫反射照明)。
    • 感谢您的所有帮助,枢轴。您是否知道任何使用 2 个纹理(颜色和法线贴图)的完整示例?我非常接近最终理解这一点,但我仍然遗漏了一些东西......我知道你必须使用主要的 glColor 和光矢量来确定当时的照明方式,然后如何使用它来混合使用颜色贴图和法线贴图的颜色......这就是我失去它的地方。
    猜你喜欢
    • 2017-01-22
    • 1970-01-01
    • 2013-08-14
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多