c++ - OpenGL,如何创建 "bumpy Polygon"?

标签 c++ opengl graphics 3d

我不知道如何描述我所追求的,所以我画了一张照片来帮忙:

OpenGL question

我的问题是,在 OpenGL 中是否有可能在单个多边形上创建那些看起来像凹凸的像素的错觉,而不必诉诸于使用多个多边形?如果是的话,方法是什么?

最佳答案

我认为您正在寻找的实际上是 Parallax mapping (或视差遮挡映射)。

演示:
http://www.youtube.com/watch?v=01owTezYC-w
http://www.youtube.com/watch?v=gcAsJdo7dME&NR=1
http://www.youtube.com/watch?v=njKdLvmBl88

Parralax 映射基本上是通过使用高度图来改变正在使用的纹理 UV 坐标来工作的。

视差的主要缺点是任何看起来在多边形“外部”的东西都会被剪裁(想想看 3D 电视上的图像),所以最好是缩进表面而不是伸出它(尽管您可以通过使多边形大于可见纹理区域来减少这种情况)。它也相当复杂,需要与其他着色器技术结合才能获得良好的效果。

凹凸贴图通过对法线使用纹理来工作,这使得灯光的阴影看起来是 3D 的,但它不会根据观察者的位置而仅改变阴影的 3D 数据。凹凸贴图对于 OP 的示例图像也相当无用,因为表面在不同高度处都是相同的角度,凹凸贴图依赖于表面角度的变化。您必须像 this 那样倾斜边缘.

置换贴图/曲面 segmentation 使用纹理来生成更多多边形,而不仅仅是 1 个多边形。

有一个视频比较所有 3 here

编辑:还有Relief mapping ,类似于视差。见 demo .有一个comparison video也是(它的质量有点低,但浮雕看起来提供了更好的深度)。

关于c++ - OpenGL,如何创建 "bumpy Polygon"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7489571/

相关文章:

c# - 使用 C# 双缓冲有负面影响

java - 为什么这个图像在 Java 中缩小后看起来很糟糕?

c++ - 如何检测用户是否按下了 Ctrl-Alt-Del 或 Alt-Tab 以便我可以最小化我的程序?

c++ - 从 FBO 渲染时纹理在表面上重复

c++ - 如何理解*(void **)(&m_handle)= dlsym (“./haldle_lib.so”, “custom_func”);

c++ - glVertexAttribPointer 提高 GL_INVALID_OPERATION

c++ - 使用 GDAL/OGR api 读取 vector 数据(shapefile)——如何?

opengl - 如何在软件仿真模式下启动OpenGL?

c++ - 是否考虑函数中的代码?

java - java 2d游戏中的碰撞检测