openGL之API学习(五十五)凹凸贴图技术

法线贴图是目前游戏开发中最常见的贴图之一。我们知道,一般情况下,模型面数越高,可以表现的细节越多,效果也越好。但是,由于面数多了,顶点数多了,计算量也就上去了,效果永远是和性能成反比的。怎么样用尽可能简单模型来做出更好的效果就成了大家研究的方向之一。纹理映射是最早的一种,通过纹理直接贴在模型表面,提供了一些细节,但是普通的纹理贴图只是影响最终像素阶段输出的颜色值,不能让模型有一些凹凸之类的细节表现。而法线贴图就是为了解决上面的问题,给我们提供了通过低面数模型来模拟高面数模型的效果,增加细节层次感,效果与高模相差不多,但是大大降低了模型的面数。

凹凸贴图和纹理贴图非常相似。然而,纹理贴图是把颜色加到多边形上,而凹凸贴图是把粗糙信息加到多边形上。这在多边形的视觉上会产生很吸引人的效果。

粗糙信息的表示有很多方式,下面重点介绍几种常见的方式:

1、Bump Mapping 凹凸贴图

凹凸贴图在计算机图形领域中的研究,最早开始于70年代末,至今已经有接近50年历史了。

凹凸图里存储的是物体表面的高度值(比如木材,做石头,脱了漆的墙面,),本质上是灰度图,这种贴图都是灰白的,如果节省空间的话,甚至可以把贴图的Alpha通道征用来用作Bump。

渲染时候根据这些高度值来计算法线方向(有多种计算方法),进而再根据法线方向计算物体表面的亮度值(有多种计算方法),从而使物体表面出现亮暗分布,给人一种凹凸不平的视觉感受。这其实是一种对人眼进行欺骗的伪凹凸效果。

至于为什么会感觉出凹凸来这个就是人的眼睛自己骗自己了……其实那里本没有凹凸的,但是我们人眼睛太多管闲事了。就像Windows的按钮哪个纯平面的东西我们还以为是凸出来的呢。

下图坐标是效果图,右边是凹凸贴图。

2、Normal Mapping 法线贴图

相对于Bump Mapping,直接省去了从高度图生成法线图的过程。现在很多软件都支持从高精度模型中生成法线图。

Normal Map最大的也是最明显的缺点应该就是它的视角问题。因为Normal

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在OpenGL中绘制带有纹理的五角星,您需要以下步骤: 1. 创建一个带有纹理坐标的五角星顶点数组。 2. 加载纹理图像并将其绑定到OpenGL纹理对象上。 3. 在绘制五角星之前,启用纹理映射并将纹理对象绑定到纹理单元上。 4. 在绘制五角星时,使用相应的纹理坐标来指定每个顶点的纹理映射。 5. 在绘制完成后,禁用纹理映射。 以下是一个简单的示例代码: ``` // 五角星顶点数组 GLfloat vertices[] = { // 顶点坐标 纹理坐标 -0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.5f, -0.25f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, -0.5f, 0.0f, 0.5f, 1.0f, 0.25f, 0.5f, 0.0f, 1.0f, 0.0f }; // 加载纹理图像 GLuint texture; glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); int width, height; unsigned char* image = SOIL_load_image("texture.jpg", &width, &height, 0, SOIL_LOAD_RGB); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); SOIL_free_image_data(image); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 在绘制之前启用纹理映射 glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture); // 绘制五角星 glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glVertexPointer(3, GL_FLOAT, 5 * sizeof(GLfloat), vertices); glTexCoordPointer(2, GL_FLOAT, 5 * sizeof(GLfloat), &vertices[3]); glDrawArrays(GL_TRIANGLE_STRIP, 0, 5); // 在绘制之后禁用纹理映射 glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisable(GL_TEXTURE_2D); ``` 这里我们使用了SOIL库来加载纹理图像。如果您没有安装SOIL,请根据您的操作系统和开发环境选择其他图像加载库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值