9、计算机图形学——纹理的应用(环境贴图、凸凹贴图、法线贴图以及位移贴图)

一、环境贴图

比如下面的这张图,左边的是一张表示环境光的纹理,这个纹理表示屋子内部四面八方都是啥样,右边是一个茶壶, 将纹理映射到这个茶壶上,就能茶壶上渲染出周围的环境

还有这样的球形环境贴图(sphere map)

左边依然是环境贴图,就像地球仪把地球表面展开成右边的平面。随着球的移动,环境贴图的内容也会发生改变,所以,球形环境贴图只能表示一部分环境, 比茶壶的环境贴图表达的信息要少

球形环境贴图通常也叫材质球

但是,由于球形贴图展开后,边缘部分会产生一定程度的畸变,所以就产生了立方盒纹理贴图(cube map),cube map就是将球形贴图分成六块,然后每一块分别投影到一个正方体上

这样,当贴图展开始,相比球形贴图会产生较少的畸变

二、法线贴图

法线贴图就是一张存储每个片元法线向量的纹理。用以对物体表面的法线添加扰动,从而改变物体表面的明暗

法线贴图如上图所示

法线贴图的存储方法有两种:一种是直接存储三角形面的法线向量,这种方法使用法线向量时可以直接使用,但是如果模型发生变化,该法线向量就不正确了。所以就有了第二种方法:通过切线空间存储法线向量切线空间由副切线B所在的轴和切线T所在的轴以及法线向量N所在的轴共同构成,如果想计算法线N,那么就需要先计算出B和T

计算方法如下图所示

在纹理坐标系中取三个点P1,P2,P3,三个点不一定在轴上,可得向量E1和E2

而这两个向量均可以有切线和副切线的线性组合来表示

根据三角形法则,可知abcd对应的系数是

写成矩阵形式就是

上述矩阵中的uv均是已知,所以,可以计算出T和B的向量,进行二者的叉积就是法线向量

三、凸凹贴图(bump map)

凸凹贴图就是通过贴图对物体表面的高度进行了一个虚拟,从而得到了一个新的法线,通过该发现计算光照强度,从而改变物体表面的明暗

虚拟高度后,新的法线得计算方式如下

首先,以p点为坐标系原点,其对应的法线向量为(0,1),当虚拟了一个高度后,该点的导数dp如下图中的第二行,因此,下图中蓝色的切线向量是(1, dp),将其旋转90度之后,就是虚拟店的法线向量

结果是图中的第三行

类似可以推广到三维空间中

上述方式计算出来的法线向量是在局部坐标系下,因为是使用切线空间存储法线,所以最终的法线向量是n左乘二中[T, B, N]所组成的矩阵,将其转化到切线空间下

四、位移贴图(displacement map)

位移贴图与凸凹贴图的区别就在于:凸凹贴图并没有真正改变物体表面的高度,只是对物体表面的高度进行了一个虚拟,从而计算出新的法线。

而位移贴图是直接将物体表面进行修改得到新的法线,如下图所示,阴影可以看出两种贴图方式的差别

参考:

GAMES101-现代计算机图形学入门-闫令琪_哔哩哔哩_bilibili

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算机图形学茶壶贴图c代码是用来实现将纹理图像贴在3D茶壶模型上的程序代码。下面是一个简单的实现茶壶贴图的C代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <GL/glut.h> GLuint texture; // 声明纹理变量 void init(void) { // 设置纹理图像参数 glClearColor(1.0, 1.0, 1.0, 0.0); // 设置背景颜色为白色 glShadeModel(GL_FLAT); // 加载纹理图像 glEnable(GL_TEXTURE_2D); // 启用纹理贴图 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); 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_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // 替换下面路径为你的纹理图像路径 GLuint tex = SOIL_load_OGL_texture("texture.jpg", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y); if (tex == 0) { printf("Error loading texture image.\n"); exit(0); } glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 512, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, tex); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glBindTexture(GL_TEXTURE_2D, texture); // 绘制茶壶 glutSolidTeapot(1.0); glFlush(); glDisable(GL_TEXTURE_2D); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow("Teapot Texture Mapping"); init(); glutDisplayFunc(display); glutMainLoop(); return 0; } ``` 上述代码通过使用OpenGL库函数,实现了茶壶模型的纹理贴图。在`init()`函数中设置了纹理图像参数,并加载了纹理图像。在`display()`函数中,启用纹理贴图并绑定纹理对象,然后通过使用`glutSolidTeapot()`函数绘制茶壶模型,并在绘制过程中贴上纹理图像。主函数中初始化窗口并调用`glutMainLoop()`开始渲染。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值