OpenGL,如何创建“凹凸不平的多边形”?
Posted
技术标签:
【中文标题】OpenGL,如何创建“凹凸不平的多边形”?【英文标题】:OpenGL, How to create a "bumpy Polygon"? 【发布时间】:2011-09-20 17:57:16 【问题描述】:我不知道如何描述我所追求的,所以我画了一张照片来帮忙:
我的问题是,在 OpenGL 中是否有可能在单个多边形上创建那些看起来像像素凹凸的错觉,而不必诉诸于使用多个多边形?如果是的话,方法是什么?
【问题讨论】:
我认为这是凹凸贴图?我可能错了.. 这是你画的吗?不错! @nightcracker - 噗!不完全是艺术品,不过谢谢~ 看起来像印第安纳琼斯风格的谜语或陷阱! @Desmond - 我希望每个人的冰箱都在附近 【参考方案1】:我认为您正在寻找的实际上是Parallax mapping(或视差遮挡映射)。
演示:http://www.youtube.com/watch?v=01owTezYC-whttp://www.youtube.com/watch?v=gcAsJdo7dME&NR=1http://www.youtube.com/watch?v=njKdLvmBl88
Parralax 映射基本上是通过使用高度图来改变正在使用的纹理 UV 坐标来工作的。
视差的主要缺点是任何看起来在多边形“外部”的东西都会被剪裁(想想看 3D 电视上的图像),所以最好是缩进表面而不是伸出它(尽管您可以通过使多边形大于可见纹理区域来减少这种情况)。它也相当复杂,需要与其他着色器技术结合才能获得良好的效果。
凹凸贴图通过对法线使用纹理来工作,这使得灯光的阴影看起来是 3D 的,但它不会根据观察者的位置而仅改变阴影的 3D 数据。凹凸贴图对于 OP 的示例图像也相当无用,因为表面在不同高度处都是相同的角度,凹凸贴图依赖于表面角度的变化。你必须像this一样倾斜边缘。
置换贴图/曲面细分使用纹理来生成更多多边形,而不仅仅是 1 个多边形。
有一个视频比较所有 3 个here
编辑:还有Relief mapping,类似于视差。见demo。还有一个comparison video (它的质量有点低,但浮雕看起来提供了更好的深度)。
【讨论】:
【参考方案2】:我认为您所追求的是bump mapping. 链接指向一个简单的教程。
【讨论】:
谢谢! ...我很惊讶它实际上被称为“凹凸”映射,啊哈。 我认为这是用像素着色器完成的(我还没有从 OpenGL 1.2 开始)。好吧,我会被诅咒的! 你也可以在着色器中完成。 但是您应该考虑到凹凸贴图的效果可能仅在移动灯光或相对于灯光移动的表面时才明显。如果您希望碰撞块阻碍其他块,则可能无法选择凹凸贴图。 @DesmondHume - 实际上,让它模糊的几何形状是我希望的效果。我想凹凸贴图不是,dangit【参考方案3】:您可能还会想到displacement mapping。
【讨论】:
这种方法似乎增加了所需的向量和多边形的数量,但也相当显着。 @Clairvoire 置换贴图通常通过将视差贴图与 OpenGL 4.0 或 DX11 曲面细分相结合来实现。这允许您以性能友好的方式动态添加细节。【参考方案4】:其他人回答中提到的技术:
凹凸贴图是最容易实现的,但不做任何遮挡。 视差映射可能是实现起来最复杂的,而且并非在所有情况下都能正常工作。 位移映射需要高端硬件和驱动程序,并创建额外的几何体。 实际上,对多边形进行建模始终是一种选择。这实际上取决于您期望观看者离您有多近以及凸起有多突出。如果您在死星战壕中飞行,则需要对凹凸进行建模或使用置换贴图。如果你在几百米的高度,凹凸贴图就足够了。
【讨论】:
啊,谢谢!很高兴看到这些技术相加并相互比较【参考方案5】:如果您有 DX11 类硬件,那么您可以镶嵌多边形,然后应用置换贴图。见http://developer.nvidia.com/node/24。但是,让它运行并在其之上开发一些东西会变得有点复杂。
【讨论】:
这看起来很有趣!不过,Dx11 不是我可以依赖的东西,因为我的很多用户都会缺少它。以上是关于OpenGL,如何创建“凹凸不平的多边形”?的主要内容,如果未能解决你的问题,请参考以下文章