OpenGL应用开发---纹理

来源:互联网 发布:软件研制能力成熟度 编辑:程序博客网 时间:2024/04/30 13:44

一、纹理的作用

在进行模型渲染的时候为了使模型看起来更加的逼真,细节更加的真实我们使用纹理贴在物体的表面。使用纹理我们可以不用再为每个顶点指定颜色,通过纹理映射到顶点上然后对纹理进行操作,和配色。然模型显得更加的漂亮、真实。

二、纹理坐标

为了能够使纹理能够正确的映射到模型的每一个顶点上,在我们定义模型坐标时,额外还要指定每个顶点各自对应纹理坐标,纹理坐标用于指定当前顶点对应的是纹理的那个部分。

一张纹理是一个像素矩阵,我们通过读取图片中的像素数据保存到这个像素矩阵中就形成了一张纹理,每个像素中保存了当前像素的深度、以及颜色值等,在OpenGL中2D纹理坐标的原点定义在纹理的左下角,X轴和Y轴的取值范围为 0 - 1 ,通过0 -1之间的值来表示每个纹理像素。

通常我们使用UV来表示2D纹理的坐标,即U代表纹理的X坐标,V代表纹理的Y轴方向的坐标.

三、纹理的环绕方式

纹理坐标的范围通常是从(0, 0)到(1, 1),当我们把顶点对应的纹理坐标设置来超出了这个范围时,OpenGL为我们提供了几种超出范围时的解决方式:

设置纹理的环绕方式函数:

四、纹理的过滤

纹理坐标不依赖于分辨率(Resolution),它可以是任意浮点值,所以OpenGL需要知道怎样将每个纹理像素映射到模型的纹理坐标。当你有一个很大的物体但是纹理的分辨率很低的时候每个纹理上的像素不一定正好对应顶点纹理坐标,此时我们就需要使用纹理过滤的方式来指定这个纹理坐标点对应的像素颜色。

GL_NEAREST(也叫邻近过滤,Nearest Neighbor Filtering)是OpenGL默认的纹理过滤方式。这种方式的原理是选择像素的中心点最接近纹理坐标的像素作为当前纹理坐标的像素。

GL_LINEAR(也叫线性过滤,(Bi)linear Filtering)它会基于纹理坐标附近的纹理像素,这种方式的原理是取在纹理坐标点附近的几个像素颜色值进行混合得到最终对应纹理坐标点的颜色,当像素的中心点离纹理坐标越近则当前像素颜色值所占的百分比就越高。

这里写图片描述

设置纹理的过滤:

五、多级渐远纹理

在一个游戏场景中会有很多的模型,每个模型的远近不同,并且每个模型上都有一个纹理贴图,在远处的物体我们无法看清楚,如果在远处的物体都是用高分辨率纹理这样不仅非常的消耗资源,而且在获取纹理颜色的时候,远处的纹理只需要获取少数的颜色,而在一个高分辨率的纹理中获取几个颜色是非常困难的。

在OpenGL中为了解决这个问题,给我们提供了一个多级渐远的纹理的处理方式,

它简单来说就是一系列的纹理图像,后一个纹理图像是前一个的二分之一。多级渐远纹理背后的理念很简单:距观察者的距离超过一定的阈值,OpenGL会使用不同的多级渐远纹理,即最适合物体的距离的那个。由于距离远,解析度不高也不会被用户注意到。同时,多级渐远纹理另一加分之处是它的性能非常好。

在渲染中切换多级渐远纹理级别(Level)时,OpenGL在两个不同级别的多级渐远纹理层之间会产生不真实的生硬边界。就像普通的纹理过滤一样,切换多级渐远纹理级别时你也可以在两个不同多级渐远纹理级别之间使用NEAREST和LINEAR过滤。为了指定不同多级渐远纹理级别之间的过滤方式这里写图片描述

六、纹理中的数据读取

为了能够使用OpenGL来渲染纹理,我们需要使用先读取纹理中的所有像素信息,并将这些像素信息传递给OpenGL进行处理,最终渲染出图像。

SOIL是简易OpenGL图像库,它能够读取当前主流的图片格式。

读取数据的流程:

//用于获取纹理的宽度和高度int width, height;//获取纹理数据地址/*参数 :纹理名称、储存纹理宽度的变量、储存纹理高度的变量、纹理的通道、读取纹理中的那些信息,RGB表示只读取RGB颜色值*/unsigned char* image = SOIL_load_image("container.jpg", &width, &height, 0, SOIL_LOAD_RGB);//在使用完数据之后需要释放数据SOIL_free_image_data(image);

通过这个函数我们就可以获取到纹理的信息了。

七、渲染纹理

为了使OpenGL能够使用纹理中的数据进行渲染,我们需要在显存中分配一片内存来储存这些数据,首先我们也需要创建一个纹理对象来管理这片内存,创建纹理对象和创建缓冲对象的格式类似。

GLuint texture;glGenTextures(1, &texture);glBindTexture(GL_TEXTURE_2D, texture);

在创建好对象之后就需要分配内存来储存这些数据:

/*参数:0、缓冲目标、1、纹理的多级渐远级别、0为基本渐远级别、2、需要存储的纹理数据信息、纹理3、的宽度、4纹理的高度、最后一个参数为图片的数据*/glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);//如果要使用多级渐远纹理,我们必须手动设置所有不同的图像(不断递增上面函数的第二个参数)。或者,直接在生成纹理之后调用glGenerateMipmap。这会为当前绑定的纹理自动生成所有需要的多级渐远纹理。glGenerateMipmap(GL_TEXTURE_2D);

当我们为顶点设置纹理坐标之后顶点就具有位置、颜色、纹理三个属性了,此时每个顶点数据结构在内存中储存的方式为:

0 0
原创粉丝点击